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

202

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

кругозор
источник
1
Чтобы понять разницу, вы должны сначала понять, что это podfile.lockтакое. Смотрите ссылку и видео, на которое она ссылается.
Мед

Ответы:

286

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

Смотрите эту тему для получения дополнительной информации :

$ pod update

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

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

mattt
источник
19
Спасибо за ответ @mattt, у меня есть последняя версия CocoaPods (0.34.2), и я попробовал $ pod update SomePodName. Тем не менее, в некоторых случаях CocoaPods также пытается обновить зависимости других модулей. Короче говоря, SomePodName - не единственный модуль, который обновляется в некоторых случаях.
Кен
2
@mattt, вы не знаете, как установить конкретный модуль без обновления уже установленных?
Шамсиддин
1
когда я сам изменяю некоторую зависимость и запускаю pod installее, она возвращается к исходной версии. Но я не хочу терять свои изменения
Шамсиддин
2
@mattt, зависимости, на которые я ссылался, не были зависимостями обновляемого модуля. Я думаю, что я не достаточно хорошо структурировал вопрос, но предполагая, что мы обновляем модуль A, некоторые другие модули, которые не являются зависимостями модуля A, также обновляются. Кстати, это старый вопрос, поэтому не уверен, что это было исправлено с тех пор ..
Кен
8
pod updateкасается всего Он не делает то, что говорит на банке, и это очень расстраивает. Случайно удаляет заголовки из других модулей, к которым вы не прикасались, и т. Д.
Луки
185

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

pod install --no-repo-update

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

pod update POD_NAME

Проверено!

atulkhatri
источник
49

Это 2015

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

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

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

  2. Бегать pod install

стручки теперь будут удалены SomePodиз нашего проекта и из Podfile.lockфайла.

  1. Положить обратно SomePodвPodfile

  2. Запустить pod installснова

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

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

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

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

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

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

pod update podName versionNum - для обновления / СКАЧИВАНИЯ определенного модуля, не касаясь других модулей

yonivav
источник
Вы имели в виду podвместо git?
Кен
Иногда это не так, я не знаю почему. Решение для тренировки: 1. Извлеките конкретный модуль из Podfile 2. Установите pod 3. Повторно добавьте конкретный модуль в Podfile 4. Установите модуль
yonivav
21

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

pod update POD_NAME

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

pod update

команда

Neftanic
источник
Вы все еще можете использовать pod installсначала, что позволит установить только недостающий (ые), не касаясь остальных. Хотя нет смысла обновлять модуль, который вы не установили, не так ли?
aramusss
18

TL; Dr использовать:

pod update podName

Зачем? Читай ниже.

  • pod updateНЕ будет уважать podfile.lock. Это переопределит это.
  • pod install будет уважать podfile.lock

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

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


Основная проблема исходит от ~>ака оптимистического оператора .

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

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

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

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

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

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

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

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

Мед
источник
9

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

user3344977
источник
2

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

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

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

CodeBender
источник