Вложение моих собственных рамок с Карфагеном
У меня возникают проблемы при попытке реализовать следующую настройку зависимостей между двумя фреймворками и приложением, разработанным мной:
Util содержит кучу утилит низкого уровня и расширений для
Foundation
такие типы, какString
,Date
, так далее.Пользовательский интерфейс содержит кучу пользовательских
UIView
а такжеUIViewController
подклассы, расширения класса дляUIColor
,UIImage
, так далее..
Приложение и каждый фреймворк имеют свой собственный репозиторий на GitHub.
Инфраструктура пользовательского интерфейса настроена в зависимости от инфраструктуры Util с использованием Carthage:
Cartfile проекта содержит ссылку на репозиторий Util:
github "MyOrganization/Util.git"
Util указан в разделе "Связанные фреймворки и библиотеки", но не встроен (поскольку пользовательский интерфейс - это каркасный проект, а не приложение).
Параметр сборки Framework Search Paths содержит
$(PROJECT_DIR)/Carthage/Build/iOS
в дополнение к$(inherited)
Файл.gitignore настроен на игнорирование всего
Carthage
каталог (не только/Build
)Я не использую подмодули git и не собираюсь (у меня уже достаточно головных болей).
Если я клонирую UI Framework и запускаю carthage update
Карфаген извлекает / собирает Util, и я могу встраивать его вручную для создания инфраструктуры пользовательского интерфейса.
Все идет нормально.
Но если я клонирую фреймворк приложения и запускаю carthage update
Карфаген получает репозиторий пользовательского интерфейса, но он не может построить:
Каталог
App/Carthage/Checkouts
содержит извлеченную копию проекта пользовательского интерфейса, как и ожидалось. Однако для вложенного фреймворка больше нет каталога Carthage (я полагаю, это должно бытьApp/Carthage/Checkouts/UI/Carhage/Checkout/Util
).Навигация к
App/Carthage/Checkouts/UI
очевидно, что открыть там рабочее пространство с помощью Xcode и создать его тоже не удается. Ссылка наUtil.framework
сломано.
Из того, что я прочитал, Карфаген должен извлечь рекурсивную зависимость; Что мне здесь не хватает?
Я попытался добавить оба URL-адреса фреймворка в App Cartfile, но xcode все равно не может создать фреймворк пользовательского интерфейса.
Нижняя часть журнала, на которую указывает выход карфагена, гласит:
/Users/me/Projects/App/code/App/Carthage/Checkouts/UI/code/UI/UI/MyClass.swift:10:8: error: no such module 'Util'
import Util
^
** ARCHIVE FAILED **
The following build commands failed:
CompileSwift normal arm64
CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler
(2 failures)
Обновить
Я собрал минимальный воспроизводимый пример на GitHub. Приложение и фреймворки составляют этот граф зависимостей:
A -> B -> C
// (and also A -> C, but that's not relevant now)
(C - это приложение, B и C - это фреймворки).
При беге carthage update
в проекте A он получает оба репозитория фреймворка, проверяет оба, начинает сборку B первым и завершается неудачно, как и выше (import
Директива).
Извлеченная копия B имеет право Cartfile вместе со всеми исходными файлами, но нет вложенных Carthage/
каталог, не говоря уже о необходимой копии C внутри него.
Я думаю, мне нужно как-то заставить процесс сборки ссылаться на A/Carthage/Builds/C.framework
вместо A/Carthage/Checkouts/B/Carthage/Builds/C.framework
, но не знаю, как настроить проект B, чтобы это сработало...
1 ответ
TL, DR: мой каркас пользовательского интерфейса не имел своего Cartfile в корне хранилища, поэтому carthage не мог его "увидеть" во время сборки (даже если сам файл был извлечен и хранил несколько каталогов глубже).
Как любезно указал пользователь Github Шо Икеда ( @ikesyo) в этой теме / выпуске репозитория Carthage, у моего промежуточного фреймворка (в данном случаеUI) не было своего корневого файла Cartfile. Вместо этого это было больше похоже на это:
.git
.gitignore
docs/
code/
UI.workspace
UI/
UI.xcodeproj
Cartfile
Carthage/
Build/
Checkouts/
и т.д., когда это должно быть больше так:
.git
.gitignore
Cartfile
docs/
code/
UI.workspace
UI/
UI.xcodeproj
Carthage/
Build/
Checkouts/
Я предполагал, что Cartfile должен быть на том же уровне, что и проект Xcode; Это не относится к делу. После перемещения Cartfile в корень и изменения параметра сборки моего проекта фреймворка "Пути поиска фреймворка" из:
$(PROJECT_DIR)/Carthage/Build/iOS
чтобы:
$(PROJECT_DIR)/../../Carthage/Build/iOS
... для того, чтобы объяснить движение, чтобы связать против Util
при сборке UI.framework из его рабочего пространства не происходит сбой.
Наконец я побежал carthage update
из моего каталога приложений, связал фреймворки и т. д., как объяснено на странице Carthage GitHub, и это сработало как шарм. Я могу успешно создавать экземпляры классов, определенных в моей Util (самой внутренней) инфраструктуре, из исходного кода моего приложения (самого внешнего).