podfile lock что это
Русские Блоги
О боли, вызванной Podfile.lock
что случилось
Проект использует CocoaPods для управления зависимыми библиотеками, поэтому вы находите каталог, в котором находится Podfile, и выполняете pod install Команда на установку зависимых библиотек, все нормально.
Пока вы не установили зависимые библиотеки, используйте git status Команда проверила статус локального репозитория git и нашла подсказку:
Вы начинаете задумываться: я только что установил библиотеку зависимостей и ничего не сделал. Что, черт возьми, такое Podfile.lock? Забудьте, несмотря ни на что, давайте сначала запустим проект, эм, ничего, все нормально, проект успешно запустился. Я поискал в Интернете файл Podfile.lock, который изначально использовался для блокировки файла, который зависит от версии библиотеки. Поторопись git commit 、 git push Добавьте Podfile.lock в управление git и отправьте его в общедоступный репозиторий.
В настоящее время вы готовы построить проект, но обнаружите, что Xcode сообщает об ошибке:
Опять podfile.lock? Подождите, что такое Manifest.lock?
Что такое Podfile.lock
Podfile.lock запускается впервые pod install При создании Podfile.lock будет отмечать точную версию текущих зависимых библиотек проекта, включая библиотеки, непосредственно отмеченные в Podfile проектом, и другие библиотеки, от которых эти библиотеки зависят. Преимущество этого заключается в том, что при совместной разработке с партнером, после того как партнер синхронизирует ваш файл Podfile.lock, он выполняет pod install Зависимая библиотека, указанная в Podfile.lock, будет установлена, чтобы вы могли предотвратить возникновение проблем из-за несогласованности зависимых библиотек. Поэтому CocoaPods официально настоятельно рекомендует передать Podfile.lock под контроль версий.
Однако Podfile.lock не статичен. Когда вы изменяете зависимые библиотеки, используемые в Podfile, или запускаете pod update Command, будет создан новый файл Podfile.lock.
Поэтому нужно обратить внимание на использование pod install с участием pod update Различия:
Что такое Manifest.lock снова
Если они несовместимы, вы увидите ошибку, указанную в первом разделе:
Причина этого в том, что каталог Pods не всегда находится под контролем версий.С помощью этого механизма проверки можно гарантировать, что различные партнеры группы разработки могут обновить свои зависимые библиотеки перед запуском проекта и сохранить эти зависимые библиотеки. Версии согласованы, чтобы предотвратить сбои компиляции или запуск программы в некоторых неочевидных местах из-за несовместимых версий зависимых библиотек.
В конце концов, что случилось
Уяснив, что такое Podfile.lock и Manifest.lock, давайте оглянемся назад и посмотрим, что произошло в первом разделе. Теперь вы можете видеть различную информацию, подобную приведенной в первом разделе:
Эти записи представляют собой статус версии Podfile.lock и Manifest.lock в трех местах партнера A, сервера кода и собственного локального Me в различных сценариях.
Первый вопрос:
второй вопрос:
В дополнение к вышеуказанным проблемам, еще одно напоминание: Примечание. pod install с участием pod update Различия. При неразумном использовании pod update Это также может ввести вас в заблуждение.
Основы использования Cocoapods в разработке приложений под iOS
CocoaPods — это очень мощный инструмент, имеющий статус must have для любого iOS Developer’а. С помощью него мы можем легко, быстро и просто подключать различные вкусные тулзы, утилиты и библиотеки, которые значительно облегчают нам жизнь при разработке приложений. Но всяким инструментом надо уметь пользоваться и CocoaPods не исключение.
Под катом информация, которая позволит начать освоение этого инструмента (основано на том, что изложено в документации и собственном опыте). И так, дорогой читатель, отложи в сторону микроскоп, хватит уже им гвозди заколачивать и продолжай читать.
Podfile
Для начала очень важно указать для какой платформы и какой ее версии ведется разработка. Это делается вот таким образом:
В этом примере мы указываем, что разрабатываем приложение для iOS версии не ниже чем 8.0
Далее мы можем скрыть все предупреждения от xCode, котоыре касаются подключаемых библиотек:
Target проекта
Если вы хотите использовать подключаемые библиотеки для нескольких target’ов (например для тестов), то для этого можно использовать команду link_with:
В этом примере мы подключаем библиотеки не только для target’а нашего приложения, но и для тестов. Но с этой командой нужно быть предельно осторожным: эта команда подключает все библиотеки к двум target’ам, а иногда это может привести к ошибкам в работе, например не все привычные нам методы API будут работать для Application Extension (тех же виджетов — Today Extension).
Более надежный способ — вручную задать target’ы для которых будут подключаться те или иные библиотеки:
С помощью такого Podfile’а мы определили те библиотеки, которые будут у нас использоваться и для виджета и для приложения (shared_pods). И обозначили какие именно надо подключать для какого target’а.
Версия библиотеки
Следующий момент тоже очень важен. Чаще всего мы кроме названия библиотеки дополнительно указываем номер версии, которую хотим использовать. Делаем это вот так:
Так мы это делаем как минимум потому, что подобные рекомендации нам как правило дают в ответе по запросу pod search. И с одной стороны это правильно, но сдругой стороны возможны нюансы.
Вы подключили некую библиотеку (с указанием версии как в примере выше) и активно ее используете, потом на некоторое время приостановили работу над проектом, а вернулись только спустя n времени. И возобновить работу вы решили с команды pod update, которая подтянет новые версии используемых библиотек. Запускаем проект и можем столкнуться с тем, что разработчик библиотеки добавил новые методы, а те что используете вы уже объявил как deprecated или удалил вовсе, или принял merge request от другого программиста проверив его не очень внимательно, а тот допустил критичную ошибку и теперь у нас все крашится.
Как избежать ненужных потерь нервных клеток? Иначе указать версию! Возможностей для этого много.
Таким образом мы указываем точно какая версия нам нужна:
Кроме этого мы можем использовать и логические операторы, которые пояснять подпробно нет необходимости: ‘> 4.1.4’ или ‘>= 4.1.4’ или ‘ ‘. С помощью него мы можем указать версию, которая нам необходимо, но при этом получать нужные для нее bugfix’ы. Например вот так ‘
> 0.1.2′ мы указываем, что хотим использовать версию библиотеки от 0.1.2 и до 0.2, но не включая версию 0.2. Или указав ‘
> 0.1′ мы указываем, что планируем использовать все версии от 0.1 до 1.0, но не включая версию 1.0.
Кроме этого мы можем указать ресурс репозитория с которого будем загружать библиотеку:
Но и на этом еще не все. Указав ресурс мы еще можем указать нужную нам ветку,
или даже конкретный коммит
Автоматизируй максимум или post_install
Иногда бывает так, что после установки той или иной библиотеки, нужно открыть тот или иной файл проекта, который был сгенерирован Cocoapods и добавить/убрать/изменить там какой-то параметр чтобы все работало корректно.
Первое что нам приходит в голову в такой ситуации: сделать все как надо и написать в wiki на gitlab’е. Вроде все окей. А! Еще обязательно написать об этом всей команде в Skype… и сделать рассылку в почте! И ссылку на вики обязательно приложу…
Сделано! А теперь все об этом забыли. Как быть? Использовать post_install!
В примере выше мы после установки всех необходимых библиотек перебираем в цикле все target’ы проекта автоматически создаваемого cocoapods, находим среди них нужный, а затем перебираем настройки этого target’а и найдя нужную добавляем нужную в build settings. В конкретном примере мы для AFNetworking устанавливаем параметр позволяющий использовать эту библиотеку в Application Extensions. И больше никаких записок в wiki. Совсем! Well done!
Почему вы должны включить Podfile.lock в систему контроля версий?
Прежде всего, я хотел бы отметить, что я прочитал руководство по кокосовым моллюскам https://guides.cocoapods.org/using/pod-install-vs-update.html
Допустим, у нас есть проект, который использует ReactiveSwift. ReactiveSwift зависит от Result pod в своем подспецификации следующим образом:
Мое предположение заключается в том, что мне не важно, от чего зависит ReactiveSwift, поскольку я просто собираюсь установить pod моей строго указанной версии ReactiveSwift.
Для модулей, которые я сам разрабатываю, я могу повлиять на их подфайл и подспец, чтобы строго указать одну версию, которую я хотел бы использовать.
Таким образом, поток упрощенного в моем проекте без podfile.lock будет:
Слияние функции с основной веткой, CI затем запускает команду pod install с новым podfile.
Теперь CI имеет все правильные версии модулей, которые он использует, и может правильно построить мое приложение.
Нужно ли Podfile.lock в этом сценарии?
3 ответа
Однако, возможно, в 2.2.2 есть ошибка, от которой вы неосознанно зависите в своем приложении. Сопровождающий выпускает версию 2.2.3, и если вы не отметили в своем файле блокировки одного из ваших коллег или, возможно, ваша система CI создает аварийную версию приложения и вызывает всевозможные недоразумения. (Это все еще работает на вашей машине!)
Помимо блокировки точных версий ваших прямых зависимостей, блокировка ваших транзитивных зависимостей также важна.
Таким образом, Podfile.lock гарантирует, что вы не обновите случайно выбранные вами библиотеки, при этом ваши Podfile будут заботиться только о ваших прямых зависимостях.
Прежде всего, я хотел бы сослаться на официальный документ :
Этот файл создается после первого запуска pod install и отслеживает версию каждого модуля, который был установлен. Например, представьте следующую зависимость, указанную в Podfile:
Вернуться к вашему вопросу:
Как вы упомянули выше, если вы находитесь в установке, где все используют только команду pod install и каждая версия зависимости строго указана в подфайле и соответствующем подспецификации, то Podfile.lock кажется избыточным.
В этом случае фиксация Podfile.lock будет очень полезна.
Кстати, я думаю, что название вопроса лучше изменить с
Why should you include Podfile.lock under version control?
Why should I include Podfile.lock under version control in this scenario?
Проблема в том, что вам нужно заботиться об изменениях в зависимостях.
Когда это происходит и зависимость вносит критические изменения, ваше приложение может начать сбой или даже не будет построено. И вы не узнаете об этом, если у вас нет хороших автоматических тестов.
Или новый разработчик клонирует ваш репозиторий, и он не будет компилироваться из-за изменения зависимости.
Или наоборот. Ваш клиент сообщает об ошибке для версии, и вы не можете воспроизвести ее в текущей версии. Поэтому вы возвращаетесь к предыдущему коммиту, из которого была собрана версия. И вы также не можете воспроизвести его, потому что ошибка была исправлена в патче зависимостей.
На самом деле, вполне возможно, что когда вы вернетесь к предыдущей фиксации и переустановите модули, ваш проект даже не скомпилируется (довольно часто в мире javascript, если вы не блокируете свои зависимости).
Что такое Cocoapods?
Что такое Cocoapods? Я видел, что многие разработчики использовали Pods при разработке приложений для установки API, но я не понимаю, почему вы не можете просто импортировать файлы вручную. В чем их цель и чем они могут помочь?
4 ответа
CocoaPods управляет зависимостями библиотек для ваших проектов Xcode.
Зависимости для ваших проектов указаны в одном текстовом файле, который называется Podfile. CocoaPods будет разрешать зависимости между библиотеками, извлекать полученный исходный код, а затем связывать его вместе в рабочем пространстве Xcode для создания вашего проекта.
В конечном итоге цель состоит в том, чтобы улучшить обнаружение и участие сторонних библиотек с открытым исходным кодом путем создания более централизованной экосистемы.
Спецификации (сторонние инструменты): ссылка
Руководство по началу работы: ссылка
По сути, это помогает вам включать сторонние библиотеки и фреймворки в свой продукт, не беспокоясь о том, как их настроить и настроить свой проект, что иногда может быть огромной проблемой.
Относительно того, почему вы не можете просто включить файлы в свой проект?
Поскольку они сторонние, поэтому вам придется загружать и копировать их в свой проект каждый раз, когда появляется новая версия? Допустим, у вас есть 10 библиотек или фреймворков в вашем проекте, теперь представьте, сколько времени вам понадобится, чтобы проверить, есть ли у кого-нибудь из них какая-либо новая версия, которую вы хотите обновить? И что хуже всего, если что-то не работает, нужно вернуться к предыдущей версии? Это требует времени и неудобно, поскольку CocoaPods вы просто набираете pod update и обновляете те, для которых доступны более новые версии.
Теперь, если вы хотите v1.1 одной конкретной библиотеки? Насколько легко вам было бы пролистать историю коммитов Git, чтобы узнать, какая из них вам нужна? В CocoaPods вы просто говорите pod ‘AFrameworkLib’, ‘1.1’
Каждая библиотека требует настройки вашего проекта с определенным набором конфигурации, чтобы заставить их работать, делать это для 10 или около того библиотек, а затем устранять конфликты само по себе. С CocoaPods об этом позаботятся автоматически.
И последнее, но не менее важное: вы должны включить лицензии для всех сторонних библиотек, которые вы используете, чтобы предоставить кредит оригинальному разработчику этой библиотеки. Представьте, что вы скопировали 10 лицензионных документов и убедились, что они актуальны? CocoaPod автоматически создает файл подтверждения в вашем проекте, который вы можете просто включить в любое подходящее место.
sudo gem установить cocoapods
Для каждой библиотеки вы можете дополнительно указать минимальную версию.
Таким образом, у всех разработчиков команды установлена одна и та же версия.
Помимо этого, в каждом проекте язык имеет свое собственное соглашение о том, фиксировать ли фактические файлы зависимостей или нет, т.е. ВСЕ проекты действительно включают список зависимостей и версий.
Что касается iOS, то есть две точки зрения, когда дело доходит до фиксации папки pods.
Эти два пункта выше в основном взяты из этого замечательного видео CocoaPods и Lockfiles
Также стоит отметить, что:
Podfile.lock находится в корне (а также Podfile ), потому что требуется зафиксировать его в git, поэтому они являются исключениями, в то время как что-либо внутри Pods/ не требуется фиксировать для того, чтобы что-то работало (даже если некоторые люди делают это по причинам кеширования или еще чего-то), так как все в нем можно регенерировать из Podfile и файла блокировки
Вышеупомянутый абзац написан Оливье Халлигоном
Если вы добавили YapDatabase/SQLCipher в качестве модуля, то Podfile.lock будет сгенерировать эти строки для вас:
Что-то вроде этого. У него есть название модуля, версия, домашняя страница, авторы, источник, типы исходных файлов, которые необходимо загрузить.
Русские Блоги
CocoaPods насколько я понимаю
Прочитал это давным-давноОфициальный документ какао-стручков, У меня простое понимание стручков какао. Спустя много дней я совсем забыл об этом.
Так что оглянитесь еще раз и, кстати, напишите резюме. Статья разделена напринципс участиемиспользоватьЭти две части относительно длинные, и вы можете читать их выборочно в соответствии с вашими потребностями.
Обзор
CocoaPods написан на рубине и состоит из нескольких драгоценных камней. Другими словами, проект iOS использует CocoaPods для управления компонентами, и сам CocoaPods также является проектом, который использует драгоценные камни для управления компонентами.
Когда я начал писать эту статью, я хотел сначала написать об использовании, а затем о принципе. Поскольку я волновался, что многим людям этот принцип будет трудно понять, я отказался от взгляда на обратную сторону. Но при зачатии, после понимания принципа, у вас будет более глубокое понимание использования некоторых команд. Поэтому я решил поставить на первое место принцип.
Фундаментальный
1. Структура какао-капсул
CocoaPods написан на Ruby и состоит из нескольких пакетов (драгоценных камней) Ruby. Исходный код размещен вGitHub на. Основные компоненты:
CocoaPods/Specs
Это репозиторий для хранения файлов podspec сторонних компонентов. После завершения разработки сторонних компонентов в CocoaPods будет отправлен файл podspec, содержащий все файлы podspec для каждого стороннего компонента. При использовании стороннего компонента, если эти компоненты поддерживают CocoaPods, источник будет указан в Podfile, например:
При исполнении pod install Или pod update При ожидании некоторых команд файл podspec указанной версии компонента будет найден в этом репозитории, а затем компонент будет получен в соответствии с информацией о конфигурации podspec.
CocoaPods/CocoaPods
Это ориентированный на пользователя компонент, который будет активироваться каждый раз при выполнении команды модуля. Этот компонент включает в себя все функции, связанные с использованием CocoaPods, и может выполнять задачи, вызывая все другие драгоценные камни.
CocoaPods/Core
Этот компонент gem обеспечивает поддержку обработки файлов, связанных с CocoaPods, таких какSpecification、Podfile с участием Source. При исполнении pod install Жду заказов. Компонент Core проанализирует файл podspec, загруженный сторонним разработчиком компонента, и пользовательский файл podfile, чтобы определить, какие файлы необходимо импортировать для проекта. Кроме того, когда выполняются некоторые команды, связанные с этими файлами, они также обрабатываются этой частью компонента, например, с помощью pod spec lint Чтобы проверить действительность файла podspec.
CocoaPods/Xcodeproj
Используя этот компонент gem, вы можете использовать ruby для создания и изменения проектов Xcode. В CocoaPods он отвечает за интеграцию всех файлов проекта. Если вы хотите написать сценарий для легкого изменения файла проекта, вы можете загрузить этот гем отдельно и использовать его. Более подробную информацию можно найти в проектеreadme。
2. Несколько связанных документов
Этот файл используется для описания информации об определенной версии стороннего компонента. Он в основном включает адрес извлечения компонента, файлы, которые следует извлекать, и информацию о конфигурации проекта. Кроме того, он также содержит некоторую информацию о компоненте, такую как имя и версия компонента. В следующих главах подробно объясняется значение полей и спецификации записи файлов.
Этот файл используется для указания, от каких компонентов зависит проект. В основном это имя зависимого компонента, версия компонента, адрес компонента и т. Д. В следующих главах подробно объясняется значение полей и спецификации записи файлов.
В первом исполнении pod install Когда выполнение будет завершено, будет создан файл podfile.lock. Этот файл в основном отмечает конкретную версию, от которой в настоящее время зависит проект. Посмотрите на следующую информацию о файле:
Следует иметь в виду одну проблему:CocoaPods настоятельно рекомендует добавить файл Podfile.lock в систему управления версиями, чтобы после того, как другие синхронизировали ваш файл podfile.lock, выполнить pod install Он будет загружен в соответствии с указанной в нем версией, чтобы избежать конфликтов при совместной работе нескольких человек.. В следующем примере pod install vs pod update подробно объясняется время изменения podfile.lock.
3. Взаимоотношения
На рисунке выше показаны отношения между разработчиками компонентов, CocoaPods и пользователями компонентов.
После того, как разработчик компонента разработает компонент, он будет загружен на склад (Github или другой). Затем создайте файл podspec, в котором будет указано, какие файлы нужно загрузить при использовании компонента и откуда их загружать. Затем этот файл будет загружен в CocoaPods (он также может быть загружен в частный репозиторий управления спецификациями).
Если пользователь компонента хочет использовать компонент, он укажет имя компонента, версию, источник загрузки и более подробную информацию в Podfile (например, хочет загрузить фиксацию). Затем выполните соответствующую команду Pod.
CocoaPods выполняет команду Pod, затем анализирует соответствующий файл podspec, определяет информацию о файле для загрузки и загружает файл в проект. И создайте Podfile.lock, Manifest.lock, Pods.xcodeproj и другие файлы.
4. Подробный процесс загрузки
Как упоминалось ранее, CocoaPods имеет открытый исходный код, поэтому мы можем загрузить исходный код для исследования. pod install Эта команда определена вCocoaPods/Core Это жемчужина.
Выполните команду установки модуля
Все команды пройдены Command Управление классом, исполнение pod install Временной код следующий:
Сначала он сгенерирует installer Пример. Затем установите repo_update Атрибуты и update Атрибут, последнее выполнение install метод.
Анализ подфайлов
выполненный pod install Перед конкретными деталями команды сначала необходимо проанализировать подфайл. Этот процесс инициализируется installer Экземпляр уже запущен:
Определение метода установки модуля
Метод установки модуля определяется следующим образом:
Из определения метода мы можем видеть pod install Реализация разделена на следующие части:Фаза подготовки, разрешение конфликтов зависимостей, загрузка зависимых файлов, проверка цели, интеграция файлов проекта и вывод результатов выполнения. Ниже приводится пошаговый анализ.
Подготовительный этап
Код этапа подготовки следующий:
Во-первых, он проверяет структуру каталогов, является ли это каталогом, в котором может быть выполнена команда pod, и, если нет, выводит информацию напрямую. Если он исполняемый, проделайте некоторые подготовительные работы. Если вы напишете несколько хуков в своем подфиле, они также будут выполняться здесь.
Разрешить конфликты зависимостей
Метод на этом этапе определяется следующим образом:
По определению метода мы можем видеть, что обрабатывается на этом этапе: запускаем хуки и создаем analyzer А затем используйте это analyzer Обновите локальную библиотеку спецификаций и обработайте зависимости версий.
Затем обновите локальную библиотеку спецификаций. Как видно из кода, есть repo_update? Суждение, что означает, что локальная библиотека спецификаций будет обновлена только тогда, когда бит флага будет истинным. Обычно мы используем эту команду:
Наконец, результат анализа будет сохранен в @result В примере этот результат анализа будет использован в последующих шагах. AnalysisResult Определение класса следующее. Я не буду переводить комментарии. Оригинальный английский более полезен для понимания конкретного значения:
Около Podfile Процесс анализа, желающие могут его проверить PodfileValidator Класс в каталоге CocoaPods/lib/cocoapods/installer/analyzer/podfile_validator.rb 。
Скачать зависимые файлы
Метод загрузки зависимых файлов определяется следующим образом:
В этом методе вызывается несколько других методов. Это следующие функции: создание файлового хранилища для записи данных в песочницу; загрузка данных; запуск хуков; выполнение операций очистки. Для конкретного определения каждого метода вы можете просмотреть исходный код файла. Здесь в основном говорят о install_pod_sources метод.
install_pod_sources Метод определяется следующим образом:
Сначала определите компоненты, которые необходимо установить. Здесь в основном предназначены для установки недавно добавленные и измененные компоненты, поскольку эта информация sandbox_state Приобрел. Однако sandbox_state Метод определяется следующим образом:
Вот analysis_result Это результат, который мы проанализировали на предыдущем шаге, который используется здесь.
Проверить цель
Целевой код проверки выглядит следующим образом:
В этом методе TargetValidator Экземпляр и вызов validate() Метод проверки. Этот метод в основном делится на следующие этапы:
Проверьте, есть ли несколько ссылок на фреймворк или библиотеку. Поскольку компонент может быть разделен на несколько подспецификации, если зависимости в подспецификации не ясны. Во время использования может быть несколько ссылок. Например, следующее:NetEase Yunxin»‘S файл podspec и файлы podspec двух зависимых компонентов:
Затем я процитировал это так:
Поскольку платформа NIMKit упоминается в двух спецификациях, при выполнении `pod install` возникнут следующие проблемы:
Поскольку use_frameworks должен использоваться в swift, эта проблема часто встречается в swift. Решение состоит в том, чтобы изменить два файла `podspec` и` Podfile`:
Убедитесь, что если swift включен в код, на который ссылаются разные цели, используемая версия swift такая же. Если они разные, будет выдана следующая ошибка:
ps: В CocoaPods 1.5 поддерживался swift для использования статических библиотек, см.CocoaPods 1.5.0 — Swift Static LibrariesНа момент написания этой статьи я еще не поддержал это.
Интегрировать файлы проекта
Пройдет здесь generator Выполнение экземпляра generate! метод. В основном мы говорим об этом методе:
Этот метод делает несколько вещей:
Работа этой серии процессов в основном зависит от вышеупомянутыхCocoaPods/Xcodeproj Составные части.
Выполните процесс загрузки
Это заключительный этап, на котором будут загружены определенные исходные файлы каждого компонента и будет выведен окончательный результат выполнения. Метод определяется следующим образом:
Этот процесс обычно самый медленный. Поленитесь, я не буду объяснять методы процесса один за другим. Взгляните на метод окончательной выходной информации:
Это наш общий результат:
Выполнить один раз pod install Это конец процесса. Если вы примерно читаете исходный код, выполните pod install Когда вы снова столкнетесь с проблемой, вы сможете быстро определить причину проблемы и исправить ее. pod update с участием pod install Есть еще некоторые отличия, заинтересованные студенты могут прочитать pod update Исходный код. Я здесь больше не пишу, даже если ты не можешь это прочитать, я почти пишу.
Использование CocoaPods
1. Установите CocoaPods.
Предполагается, что у вас ничего не установлено, начиная с 0. Если вы уже что-то установили, можете пропустить.