用迦太基嵌套我自己的框架

Nic*_*ari 8 xcode dependency-management ios carthage

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

在此输入图像描述

  1. UTIL containts一堆的低级别的实用程序和扩展Foundation类型,例如String,Date

  2. UI,包含了一些定制UIViewUIViewController子类,类扩展UIColor,UIImage等等.

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


UI框架建立依赖于的Util框架,采用迦太基:

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

    github "MyOrganization/Util.git"

  2. Util列在"链接框架和库"中,但未嵌入(因为UI框架项目,而不是应用程序).

  3. 框架搜索路径构建设置中包含$(PROJECT_DIR)/Carthage/Build/iOS$(inherited)

  4. .gitignore文件配置为忽略整个Carthage目录(不仅仅是/Build)

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


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

到现在为止还挺好.


但是如果我克隆App框架并运行carthage update,Carthage会获取UI repo,但它无法构建:

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

  2. 导航到App/Carthage/Checkouts/UI使用Xcode打开工作区并显示它也很明显.引用Util.framework被打破了.

从我所读到的,迦太基应该获取递归依赖; 我在这里错过了什么?

我尝试在App Cartfile中添加两个框架URL ,但是xcode仍然无法构建UI框架.

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

/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)
Run Code Online (Sandbox Code Playgroud)

更新

我在GitHub上放了一个最小的可重现的例子.应用程序和框架构成了这个依赖图:

A -> B -> C
// (and also A -> C, but that's not relevant now)
Run Code Online (Sandbox Code Playgroud)

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

A项目carthage update上运行时,它会同时获取框架repos,检出两者,然后开始构建B并失败,就像上面那样(指令).import

签出的B副本具有正确的Cartfile以及所有源文件,但没有嵌套Carthage/目录,更不用说其中必需的C副本.

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

Nic*_*ari 10

TL,DR:我的UI框架没有将Cartfile放在存储库的根目录下,因此carthage在构建期间无法"看到"它(即使文件本身已被提取,并且存储了多个目录更深).


正如Github用户Sho Ikeda(@ikesyo)在Carthage存储库的这个线程/问题上指出的那样,我的中间框架(在本例中是UI)根本没有它的Cartfile.相反,它更像是这样的:

.git
.gitignore
docs/
code/
    UI.workspace
    UI/
        UI.xcodeproj
        Cartfile
        Carthage/
            Build/
            Checkouts/
Run Code Online (Sandbox Code Playgroud)

等,当它需要更像这样:

.git
.gitignore
Cartfile
docs/
code/
    UI.workspace
    UI/
        UI.xcodeproj

Carthage/
    Build/
    Checkouts/
Run Code Online (Sandbox Code Playgroud)

我假设Cartfile必须与Xcode项目处于同一级别; 事实并非如此.将Cartfile移动到根目录后,从以下位置更改我的框架项目的构建设置"框架搜索路径":

$(PROJECT_DIR)/Carthage/Build/iOS
Run Code Online (Sandbox Code Playgroud)

至:

$(PROJECT_DIR)/../../Carthage/Build/iOS
Run Code Online (Sandbox Code Playgroud)

...为了考虑移动,因此Util在从工作区构建UI.framework时链接不会失败.

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

  • 这也是我的问题.我和你一样,把所有东西放在一个_Code文件夹下,虽然这对于所有东西(包括迦太基使用)来说都很完美,但当我尝试将自己的框架作为嵌套的依赖与Carthage包含在一起时,它就破了.在我的情况下,我不需要添加/调整任何搜索路径,因为我还将我的Xcode工作区和项目移动到相同的根文件夹,它立即工作.将所有内容移动到根文件夹都有效,非常感谢这个拯救生命的帖子! (3认同)