Как обновить один модуль, не затрагивая другие зависимости

Я понимаю, что следующая команда обновит один модуль: pod update <podname>. Однако это также обновляет зависимости других модулей (модулей, которые не были включены в команду обновления), которые вы ранее установили. Есть ли способ обновить один модуль и оставить все остальные зависимости в покое?


person ken    schedule 14.10.2014    source источник
comment
Чтобы понять разницу, вы должны сначала понять, что такое podfile.lock есть. Смотрите ссылку и видео, на которое она ссылается.   -  person Honey    schedule 23.07.2019


Ответы (9)


Убедитесь, что у вас установлена ​​последняя версия CocoaPods.

$ pod update PODNAME был представлен недавно.

Дополнительную информацию см. в этой теме:

обновление пакета $

Когда вы запустите pod update SomePodName, CocoaPods попытается найти обновленную версию pod SomePodName, не принимая во внимание версию, указанную в Podfile.lock. Он обновит модуль до последней возможной версии (при условии, что она соответствует ограничениям версии в вашем подфайле).

Если вы запустите обновление модуля без имени модуля, CocoaPods обновит каждый модуль, указанный в вашем подфайле, до последней возможной версии.

person Community    schedule 14.10.2014
comment
Спасибо за ответ @mattt, у меня есть последняя версия CocoaPods (0.34.2), и я попробовал $ pod update SomePodName. Однако в некоторых случаях CocoaPods также пытается обновить зависимости других модулей. Короче говоря, SomePodName — не единственный модуль, который в некоторых случаях будет обновляться. - person ken; 14.10.2014
comment
@mattt, разве ты не знаешь, как установить конкретный модуль, не обновляя уже установленные? - person Shamsiddin; 21.05.2015
comment
когда я сам изменяю некоторую зависимость и запускаю pod install, она возвращается к исходной версии. Но я не хочу потерять свои изменения - person Shamsiddin; 21.05.2015
comment
@кен Конечно. Если зависимости модуля меняются между версиями, из этого следует, что эти зависимости будут обновлены соответствующим образом. - person mattt; 21.05.2015
comment
@ShamsiddinSaidov Это совсем другой вопрос. Если у вас есть новый вопрос, вы должны задать его отдельно. - person mattt; 21.05.2015
comment
@mattt, зависимости, о которых я говорил, не были зависимостями обновляемого модуля. Я думаю, что недостаточно хорошо структурировал вопрос, но если мы обновим модуль A, некоторые другие модули, которые не являются зависимостями модуля A, также будут обновлены. Кстати, это старый вопрос, поэтому не уверен, что с тех пор это было исправлено. - person ken; 22.05.2015
comment
@ken В моем случае другие модули обновляются независимо от того, по какой причине. - person Andrei Konstantinov; 04.08.2015
comment
@AndreyKonstantinov, да, это тоже очень похоже на мой случай. - person ken; 05.08.2015
comment
@ken Так ты еще не нашел решение проблемы? - person Andrei Konstantinov; 08.08.2015
comment
@AndreyKonstantinov Нет, не видел - person ken; 10.08.2015
comment
@ken Я думаю, что нашел это. Вам нужно использовать pod install вместо pod update. да. Он по-прежнему обновляет кучу файлов в каталоге Pods, НО, если вы внимательно посмотрите: это все служебные файлы для модулей, а не настоящий код, поэтому единственным измененным модулем будет тот, который вы удалили из Podfile. - person Andrei Konstantinov; 19.08.2015
comment
Я тоже столкнулся с проблемой при попытке обновить только один модуль. Он обновляет все стручки. У меня тоже есть несколько локальных модулей, и он даже пытается их обновить... не уверен, что нужно делать. Я тоже пробовал «установить pod», но не повезло. - person anoop4real; 13.10.2015
comment
pod update касается всего. Он не делает того, что написано на банке, и это очень расстраивает. Случайным образом удаляет заголовки из других модулей, которые вы не сказали трогать, и т. д. - person Luke; 24.11.2015

Чтобы установить один модуль без обновления существующих, добавьте этот модуль в свой подфайл и используйте:

pod install --no-repo-update

Чтобы удалить/обновить конкретный модуль, выполните следующие действия:

pod update POD_NAME

Проверено!

person atulkhatri    schedule 01.04.2016

It's 2015

Так как pod update SomePod затрагивает все в последних версиях Cocopods, я нашел обходной путь.

Выполните следующие шаги:

  1. Удалить SomePod из Podfile

  2. Беги pod install

модули теперь удалят SomePod из нашего проекта и из файла Podfile.lock.

  1. Верните SomePod в Podfile

  2. Запустите pod install еще раз

На этот раз последняя версия нашего модуля будет установлена ​​и сохранена в папке Podfile.lock.

person Danpe    schedule 30.11.2015
comment
Вы также можете использовать трюк, на который я отвечаю здесь можно установить конкретный модуль"> stackoverflow.com/questions/29901337/ - person Qiulang; 03.03.2016
comment
Вы также можете выполнить pod update somepod anotherpod thirdpod для одновременного обновления нескольких модулей :) - person Entea; 05.04.2016
comment
Это очень умно. Вы выполняете их в два независимых шага и полагаетесь на podfile.lock, чтобы сохранить другие зависимости нетронутыми. Мне просто интересно, если SomePod будет обновлен до последних зависимостей, не обновит ли он общую зависимость anotherPod до последней? Разве это не произойдет независимо от того, что находится в подлоке? В противном случае он не сможет удовлетворить требования SomePod - person Honey; 16.09.2019

просто говорю:

pod install - для установки новых подов,

pod update - для обновления существующих модулей,

pod update podName - для обновления только определенного модуля, не касаясь других модулей,

pod update podName versionNum - для обновления / ПОНИЖЕНИЯ определенного модуля, не касаясь других модулей.

person yonivav    schedule 10.12.2018
comment
Вы имели в виду pod вместо git? - person ken; 11.12.2018
comment
Иногда нет, не знаю почему. Решение для тренировки: 1. Удалите конкретный модуль из Podfile 2. Установка .pod 3. Повторно добавьте определенный модуль в Podfile 4. Установка модуля - person yonivav; 13.05.2020

Вы никогда не сможете получить 100% изоляцию. Поскольку у модуля могут быть некоторые общие зависимости, и если вы попытаетесь обновить свой единственный модуль, он также обновит зависимости других модулей. Если это нормально, то:

тл; др использовать:

pod update podName

Почему? Читай ниже.

  • pod update НЕ будет уважать podfile.lock. Он переопределит его, относящийся к этому отдельному пакету.
  • pod install будет уважать podfile.lock, но попытается установить каждый pod, упомянутый в podfile, на основе версий, к которым он заблокирован (в Podfile.lock).

Эта диаграмма помогает лучше понять различия:

введите здесь описание изображения


Основная проблема связана с ~>, также известным как оптимистичный оператор.

Использование точных версий в Podfile недостаточно

Некоторые могут подумать, что указания точных версий своих модулей в их Podfile, например pod 'A', '1.0.0', достаточно, чтобы гарантировать, что у каждого пользователя будет та же версия, что и у других людей в команде.

Затем они могут даже использовать pod update, даже просто добавляя новый модуль, думая, что никогда не рискуют обновить другие модули, потому что они привязаны к определенной версии в Podfile.

Но на самом деле этого недостаточно, чтобы гарантировать, что user1 и user2 в нашем вышеприведенном сценарии всегда будут получать одну и ту же версию всех своих модулей.

Один типичный пример: модуль A имеет зависимость от модуля A2, объявленного в A.podspec как dependency 'A2', '~> 3.0'. В таком случае использование модуля 'A', '1.0.0' в вашем подфайле действительно заставит пользователей user1 и user2 всегда использовать версию 1.0.0 модуля A, но:

  • user1 может получить модуль A2 версии 3.4 (поскольку это была последняя версия A2 на тот момент)
  • в то время как когда user2 запускает pod install при присоединении к проекту позже, он может получить pod A2 в версии 3.5 (поскольку сопровождающий A2 мог тем временем выпустить новую версию). Вот почему единственный способ убедиться, что каждый член команды работает с одними и теми же версиями всех модулей на каждом компьютере, — это использовать Podfile.lock и правильно использовать pod install вместо pod update.

Весь приведенный выше отрывок был получен из установки модуля и обновления модуля.

Я также настоятельно рекомендую посмотреть что делает podfile.lock

person Honey    schedule 19.09.2019

Просто небольшое уведомление.

pod update POD_NAME

будет работать, только если этот модуль уже установлен. В противном случае вам придется обновить их все с помощью

pod update

команда

person Neftanic    schedule 08.07.2015
comment
Вы все еще можете сначала использовать pod install, который установит только отсутствующие, не трогая остальные. Хотя нет смысла обновлять модуль, который вы не установили, не так ли? - person aramusss; 18.12.2019

Я использую cocoapods version 1.0.1, а pod update name-of-pod работает отлично. Никакие другие модули не обновляются, только тот, который вы вводите.

person user3344977    schedule 30.09.2016

Это немного необычно и вряд ли это то, с чем имел дело OP, но pod update <podname> не будет работать во всех случаях, если вы используете локальный модуль на своем компьютере.

В этой ситуации единственное, что заставит pod update работать, — это изменение файла podspec. Однако внесение изменений также позволит pod install работать.

В этой ситуации вы можете просто изменить что-то незначительное, например описание или сводку, на одну букву, а затем успешно запустить команду установки или обновления.

person CodeBender    schedule 27.11.2017

pod update POD_NAME обновит последний модуль, но не обновит файл Podfile.lock.

Таким образом, вы можете обновить свой подфайл определенной версией вашего модуля, например pod 'POD_NAME', '~> 2.9.0', а затем использовать команду pod install

Позже вы можете удалить конкретное наименование версии из своего подфайла и снова использовать pod install. Это поможет обновлять Podfile.lock.

person Sunil Targe    schedule 09.11.2020