Использование зависимости 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, в которых нуждается моя структура.