5

我对新的代码生成功能有点困惑。

在开发过程中,您可以查找项目中存在的所有文件。但不是使用代码生成。

然而,它运作良好。但它不适合新的面向框架的编程范式。

场景: 我有完全独立的框架数据库。它可以嵌入到应用程序中,也可以不嵌入。这取决于。但它是完全分开的。

现在我想使用 codegen 功能。它描述了自动。它在 DerivedData 中生成所有核心数据标头,并将核心数据模型开发切换到面向类别的范例(你好,快!)

好的,一切正常并编译,直到我想公开所有可公开访问的文件。很明显,所有模型文件(几乎所有模型文件,例如隐藏实体或必要时的抽象实体除外)都具有公共访问级别。

但是,Xcode 没有找到 codegen 文件的模板。

例如,在缺少 Map.modulemap 文件的情况下,它不起作用。行。

在这种情况下,它看起来像:

framework module DBDatabaseBeaver {  
  umbrella header "DBDatabaseBeaver.h"  
  export *  
  module * { export * }  
}

但如果我是对的,这个模块映射文件不会在正确的 Xcode CodeGen CoreData 目录( DerivedData )中查找。

此外,很难知道这些代码生成标头具有哪种访问级别。

我只有一个可以改变某些东西的设置:codegen 中的模块设置。

但是,如果我将它更改为与全局命名空间不同的东西,它会对我和 codegen 文件产生一些影响,例如:

// $(DatabaseModelName).h  
#import ".DBDatabaseEntity+CoreDataClass.h"  
#import ".DBDatabaseEntity2+CoreDataClass.h"  
...

看看这个文件。

  1. 它以某种方式将点放在文件名的开头。

  2. 它依赖$(DatabaseModelName),而不是依赖$(DatabaseModuleName)

  3. 见 2.ModelNamexcodemodel filenameModuleName是框架目标模块名称。它使用第一个,而不是第二个。

任何人都可以解释方案的解决方案并添加关于所有代码生成功能的评论/(文档链接?)吗?

我认为可以通过修复模块映射文件并为模型中的实体添加正确的模块名称(代码生成设置)来解决这种情况。

但是,我不知道应该将哪些路径添加到 modulemap 以指向 codegen 文件。

4

1 回答 1

2

您应该能够通过将自动生成的头文件从派生源文件夹复制到框架的公共头文件夹来公开访问它们。

您可以通过向框架的目标添加一个额外的运行脚本步骤来做到这一点。将以下脚本复制到脚本编辑器中,并将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") 中的每个头文件,然后依次对每个头文件调用 copy-exec cp {} $DESTPATH \;

如果您有任何问题,取消注释第一行(即删除#)然后查看构建日志应该更容易诊断。

于 2017-04-12T04:57:51.920 回答