如何使Xcode核心数据代码生成的文件被公共访问

时间:2017-03-28 08:11:07

标签: xcode entity-framework core-data codegen

我对新的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"  
...

看一下这个文件。

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

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

  3. 请参阅2. ModelNamexcodemodel filenameModuleName是框架目标模块名称。它首先使用,而不是第二次使用。

  4. 有人可以解释场景的解决方案并添加关于所有codegen功能的评论/(文档链接吗?)?

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

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

1 个答案:

答案 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 \;

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