用迦太基筑巢我自己的框架

时间:2018-04-11 08:36:14

标签: ios xcode dependency-management carthage

我在尝试在两个框架和一个应用程序之间实现以下依赖关系设置时遇到了问题,这些都是由我开发的:

enter image description here

  1. Util 包含Foundation类型的String类型的大量低级实用程序和扩展,例如DateUIView等。

  2. 用户界面包含大量自定义UIViewControllerUIColor子类,UIImage的类扩展,github "MyOrganization/Util.git"等。

  3. 应用程序和每个框架在GitHub上都有自己的存储库。

    UI 框架设置为依赖 Util 框架,使用Carthage:

    1. 项目的 Cartfile 包含对 Util repo的引用:

      $(PROJECT_DIR)/Carthage/Build/iOS

    2. Util列在“链接的框架和库”中,但未嵌入(因为 UI 框架项目,< em>不是应用)。

    3. 除了$(inherited)

    4. 之外,框架搜索路径构建设置还包含Carthage
    5. .gitignore文件配置为忽略整个/Build目录(不只是carthage update

    6. 使用git子模块,我不打算(我已经有足够的头痛)。

    7. 如果我克隆UI框架并运行carthage update,Carthage会提取/构建Util,我可以手动嵌入它来构建UI框架。

      到目前为止一切顺利。

      但如果我克隆 App 框架并运行App/Carthage/Checkouts,则Carthage会抓取 UI 回购,但无法构建:

      1. 目录App/Carthage/Checkouts/UI/Carhage/Checkout/Util包含UI项目的签出副本,如预期的那样。但是,嵌套框架没有进一步的Carthage目录(我假设它应该是App/Carthage/Checkouts/UI)。

      2. 导航到Util.framework使用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) 的引用已被破坏。

      3. 从我所读到的,迦太基应该获取递归依赖;我在这里缺少什么?

        我尝试在 App Cartfile中添加两个框架网址,但xcode仍无法构建 UI 框架。

        迦太基输出指向的日志的底部部分说:

        A -> B -> C
        // (and also A -> C, but that's not relevant now)
        

        更新

        我在GitHub上放了一个minimal reproducible example。应用程序和框架组成了这个依赖图:

        carthage update

        (C是app,B和C是框架)。

        A 项目上运行import时,它会同时获取框架回购,检出两者,开始构建 B 并失败,如上所述(Carthage/指令)。

        B 的签出副本包含正确的Cartfile以及所有源文件,但没有嵌套的A/Carthage/Builds/C.framework目录,更不用说 C的必要副本了在其中。

        我想我需要以某种方式使构建过程引用A/Carthage/Checkouts/B/Carthage/Builds/C.framework而不是react-native-tabs npm,但不知道如何设置B项目以便解决...

1 个答案:

答案 0 :(得分:9)

TL,DR:我的UI框架没有将其Cartfile放在存储库的根目录下,因此Carthage无法&#34;看到&#34;它在构建期间(即使文件本身被提取,并且存储了几个更深的目录)。

正如Github用户 Sho Ikeda @ikesyo)在Carthage存储库的this thread/issue上指出,我的中间框架( 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移动到root后,并更改我的框架项目的Build Setting&#34; Framework Search Paths&#34;从:

$(PROJECT_DIR)/Carthage/Build/iOS

为:

$(PROJECT_DIR)/../../Carthage/Build/iOS

...为了考虑移动,以便在从工作区构建 UI.framework 时与Util建立关联并不会失败。

最后,我在{strong> App 目录中运行carthage update,链接框架等,如Carthage GitHub页面中所述,它就像一个魅力。我可以从我的App的源代码(最外层)成功实例化我的Util(innermost)框架中定义的类。