Вложение моих собственных рамок с Карфагеном

У меня возникают проблемы при попытке реализовать следующую настройку зависимостей между двумя фреймворками и приложением, разработанным мной:

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

  1. Util содержит кучу утилит низкого уровня и расширений для Foundation такие типы, как String, Date, так далее.

  2. Пользовательский интерфейс содержит кучу пользовательских UIView а также UIViewController подклассы, расширения класса для UIColor, UIImage, так далее..

Приложение и каждый фреймворк имеют свой собственный репозиторий на GitHub.


Инфраструктура пользовательского интерфейса настроена в зависимости от инфраструктуры Util с использованием Carthage:

  1. Cartfile проекта содержит ссылку на репозиторий Util:

    github "MyOrganization/Util.git"

  2. Util указан в разделе "Связанные фреймворки и библиотеки", но не встроен (поскольку пользовательский интерфейс - это каркасный проект, а не приложение).

  3. Параметр сборки Framework Search Paths содержит $(PROJECT_DIR)/Carthage/Build/iOS в дополнение к $(inherited)

  4. Файл.gitignore настроен на игнорирование всего Carthage каталог (не только /Build)

  5. Я не использую подмодули git и не собираюсь (у меня уже достаточно головных болей).


Если я клонирую UI Framework и запускаю carthage update Карфаген извлекает / собирает Util, и я могу встраивать его вручную для создания инфраструктуры пользовательского интерфейса.

Все идет нормально.


Но если я клонирую фреймворк приложения и запускаю carthage update Карфаген получает репозиторий пользовательского интерфейса, но он не может построить:

  1. Каталог App/Carthage/Checkouts содержит извлеченную копию проекта пользовательского интерфейса, как и ожидалось. Однако для вложенного фреймворка больше нет каталога Carthage (я полагаю, это должно быть App/Carthage/Checkouts/UI/Carhage/Checkout/Util).

  2. Навигация к 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 (самой внутренней) инфраструктуре, из исходного кода моего приложения (самого внешнего).

Другие вопросы по тегам