Использование зависимости CocoaPod при разработке CocoaPod
Я создаю CocoaPod, скажем, MyPod
, который зависит от другого Cocoapod, скажем, RxSwift
.
Поэтому у меня есть это в MyPod.podspec
:
s.dependency "RxSwift", "~> 3.0.1"
Однако, разрабатывая MyPod
, как я могу использовать зависимость?
import RxSwift
// ^
// No such module 'RxSwift'
public class MyClass { //...
Есть ли какой-то шаг, который мне не хватает, или какое-то общее соглашение? Похоже, что некоторые другие проекты, такие как Мойя, используют Карфаген для создания зависимостей во время разработки. Должен ли я это делать, или, может быть, добавить Podfile
?
Я знаю, что это не должно быть проблемой для приложения примера, расположенного внутри репо, которое будет иметь собственный Podfile
. Тем не менее, я бы хотел, чтобы тесты находились на верхнем уровне, за пределами App-приложения, и чтобы иметь возможность фактически создавать фреймворк во время работы над ним, опять же, за пределами приложения-примера.
Ответы
Ответ 1
Я закончил использовать Карфаген для создания зависимостей структуры. Думаю, я мог бы использовать CocoaPods, чтобы это сделать. Тем не менее, это потребовало бы, чтобы я начал использовать рабочее пространство, и я не хотел этого делать, чтобы изменения были минимальными, насколько это возможно.
Кроме того, с Carthage не требовалось добавить новый Podfile
/Podfile.lock
, поскольку Carthage будет использовать существующий Cartfile
/Cartfile.resolved
который уже существует. Это потому, что Карфаген использует Cartfile.resolved
при использовании фреймворка в другом проекте и при создании структуры самостоятельно. Принимая во внимание, что с помощью CocoaPods *.podspec
используется при использовании фреймворка в другом проекте, но Podfile.lock
(если вы добавили Podfile
) требуется для установки зависимых элементов в самой структуре.
Ответ 2
Я не могу говорить о том, использовать или не использовать CocoaPods или Carthage. У обоих есть свои сильные стороны и слабые стороны. Кроме того, решение должно быть принято с учетом многих факторов, некоторые из которых вы, возможно, не сможете контролировать (например, клиент, который настаивает на использовании CocoaPods!) Поэтому я пропущу эту часть.
Тем не менее, на ваш вопрос, действительно, какой-то стручок, который вы разрабатываете, может зависеть от другого стручка. У вас уже есть правильная строка s.dependency
. Это необходимо.
Тем не менее, я подозреваю, что причина, по которой вы не могли ссылаться на зависимый блок, может быть вызвана тем, что у вас не было подфайла в вашем проекте "тестер/пример" и/или вы не выполнили pod install
после добавления зависимости в вашем Podspec.
Причиной этого является требование, которое, как я подозреваю, заключается в том, что, поскольку Podspec фактически не обрабатывается Xcode, вы фактически не загружаете (или не компилируете) зависимость.
Вместо этого, когда вы выполняете установку pod (через командную строку, конечно), CocoaPods создаст проект Pods с вашим модулем разработки, на которых вы зависите (в Podspec), а также с любыми другими модулями вашего подфайла.
Чтобы проверить эту теорию, я:
- Создал новый pod (используя CocoaPod own 'pod lib create' (https://guides.cocoapods.org/making/using-pod-lib-create.html).
- Открыл рабочее пространство, которое CocoaPod создал для меня, и отредактировал Podspec, чтобы добавить зависимость
s.dependency 'RxSwift', '~> 3.0.1'
. - Добавлен еще один pod в моем примерном подпикселе приложения (чтобы продемонстрировать разницу между зависимостями подфайлов и зависимостями Podspec.)
- Выполнена
pod install
в папке Example App. - Отредактировал класс Pod, чтобы сделать что-то полезное и добавить
import RxSwift
. - Добавлен ярлык к моему примеру (конечно, "Hello World").
- Использовал PureLayout, чтобы сделать все ограничения макета для метки (и продемонстрировать, как проект Example имеет доступ к
PureLayout
стручкам - модуль разработки, а также ссылочный pod PureLayout
).
Вы можете проверить демонстрацию, которую я создал на моем публичном GitHub: https://github.com/ericwastaken/CocoaPod-Dependency-Demo
Честно говоря, я создал несколько стручков, используя pod lib create
и он действительно создает хорошую структуру, которая всегда работала для меня. По этой причине я бы рекомендовал всегда использовать его для создания скелета стручка.
Комментарий Xcode 8: pod lib create
все еще создает проект Swift 1.x. Итак, сразу после использования этого инструмента, когда вы открываете Xcode, вам будет предложено "преобразовать" в более новую версию Swift. Я бы допустил, чтобы это преобразование произошло сразу и там (в первый раз), чтобы вы могли быть в синтаксисе Swift 2.x или 3.x (вы выбираете).
Ответ 3
Это была очень сложная проблема, и для ее решения требовалось объединить несколько решений. Помогло решение @EricWasTaken, а также добавлено:
source 'https://github.com/CocoaPods/Specs.git'
к началу моего подфайла. Затем перейдите к Примеру приложения и запустите
pod repo update
pod install
Теперь основа, которую я создаю, может найти cocoapods, в которых нуждается моя структура.