如何使Xcode核心数据代码生成的文件可以公开访问

gau*_*inc 5 xcode entity-framework core-data codegen

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

在开发过程中,您可以查找项目中存在的所有文件。但是没有codegen。

但是,它运行良好。但这不适合新的面向框架的编程范例。

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

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

好的,一切正常并且可以编译,直到我想公开访问所有文件。显而易见,所有模型文件(如有必要,几乎包含所有其他文件,例如,隐藏实体或抽象实体)都具有公共访问级别。

但是,Xcode找不到用于代码生成文件的模板。

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

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

framework module DBDatabaseBeaver {  
  umbrella header "DBDatabaseBeaver.h"  
  export *  
  module * { export * }  
}
Run Code Online (Sandbox Code Playgroud)

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

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

我只有一种设置可以更改某些内容:代码生成中的模块设置。

但是,如果我将其更改为与全局命名空间不同的名称,它会给我和代码生成文件带来麻烦,例如:

// $(DatabaseModelName).h  
#import ".DBDatabaseEntity+CoreDataClass.h"  
#import ".DBDatabaseEntity2+CoreDataClass.h"  
...
Run Code Online (Sandbox Code Playgroud)

看一下这个文件。

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

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

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

有人可以解释场景的解决方案并添加有关所有代码生成功能的注释/(文档链接吗?)?

我认为可以通过修复modulemap文件并为Model中的实体添加正确的模块名称(codegen设置)来解决这种情况。

但是,我不知道应该将哪些路径添加到modulemap来指向代码生成文件。

tdb*_*bit 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}" \;
Run Code Online (Sandbox Code Playgroud)

该脚本所做的只是列出派生源目录 ( find $SOURCEPATH -type f -name "*.h") 中的每个头文件,然后依次对每个头文件调用 copy-exec cp {} $DESTPATH \;

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