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

How to make Xcode core data code generated files to be public accessed

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

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

不过,效果很好。但它不适合新的 framework-oriented 编程范式。

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

现在我想使用代码生成功能。它描述了自动魔法。它在 DerivedData 中生成所有核心数据 headers 并将核心数据模型开发切换到 categories-oriented 范式(你好,swift!)

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

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

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

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

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

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

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

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

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

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

看看这个文件。

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

  2. 依赖$(DatabaseModelName),不依赖$(DatabaseModuleName)

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

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

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

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

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

您可以通过向框架的目标添加一个额外的 运行 脚本 步骤来实现。将以下脚本复制到脚本编辑器中,并将 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 \;

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