我对新的codegen功能感到困惑。
开发时,您可以查找项目中存在的所有文件。 但不是与codegen。
然而,它运作良好。但它并不适合新的面向框架的编程范式。
情境: 我有完全独立的框架数据库。它可以嵌入应用程序中,也可以不嵌入。这取决于。 但它是完全分开的。
现在我想使用codegen功能。它描述了自动化。它在DerivedData中生成所有核心数据头,它将核心数据模型开发转换为面向类别的范例(hello,swift!)
好的,一切正常并编译,直到我想公开所有具有公共访问权限的文件。 很明显,所有模型文件(几乎所有模型文件除外,例如隐藏实体或抽象实体,如有必要)都具有公共访问级别。
但是,Xcode没有为codegen文件找到模板。
例如,在缺少Map.modulemap文件的情况下,它不起作用。确定。
在这种情况下,它看起来像:
framework module DBDatabaseBeaver {
umbrella header "DBDatabaseBeaver.h"
export *
module * { export * }
}
但如果我是对的,这个模块映射文件不会在正确的Xcode CodeGen CoreData目录(DerivedData)中查找。
此外,很难知道这些codegen标头具有哪种访问级别。
我只有一个设置可以改变一些东西:codegen中的模块设置。
但是,如果我将其更改为与Global Namespace不同的内容,它会对我和codegen文件产生一些技巧:
// $(DatabaseModelName).h
#import ".DBDatabaseEntity+CoreDataClass.h"
#import ".DBDatabaseEntity2+CoreDataClass.h"
...
看一下这个文件。
它以某种方式将点放在文件名的开头。
它依赖于$(DatabaseModelName)
,而不是$(DatabaseModuleName)
。
请参阅2. ModelName
是xcodemodel filename
。 ModuleName
是框架目标模块名称。它首先使用,而不是第二次使用。
有人可以解释场景的解决方案并添加关于所有codegen功能的评论/(文档链接吗?)?
我认为可以通过修复modulemap文件并在Model(codegen设置)中为实体添加正确的模块名来解决这个问题。
但是,我不知道应该将哪些路径添加到modulemap以指向codegen文件。
答案 0 :(得分:2)
您应该能够通过将自动生成的头文件从派生的sources文件夹复制到框架的public headers文件夹来公开访问它们。
您可以通过向框架的目标添加额外的运行脚本步骤来执行此操作。将以下脚本复制到脚本编辑器中,并将 Your_Framework 替换为框架可执行文件的名称。
#set -o xtrace
find "${DERIVED_SOURCES_DIR}/CoreDataGenerated/Your_Framework" -type f -name "*.h" -exec cp {} "${BUILT_PRODUCTS_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}" \;
所有这些脚本都会列出派生源目录(find $SOURCEPATH -type f -name "*.h"
)中的每个头文件,然后依次调用每个头文件上的副本-exec cp {} $DESTPATH \;
如果您在取消注释第一行时遇到任何问题(即删除#),然后查看构建日志应该可以更容易诊断。