我也必须为CI做这个。经过大量挖掘,我认为这不够常见,没有人写工具来帮助做这件事。
我得出的唯一结论是直接编辑project.pbxproj文件,但这绝非明智之举。在找到这个有关编辑project.pbxproj文件的stackoverflow回答之前,声称能够这样做的工具都没有帮助。基本上,您可以使用plutil -convert json project.pbxproj
将project.pbxproj文件转换为JSON格式,并使用JSON操作工具将这些文件作为头文件,然后将它们指向您想要的任何目标的头文件。
在将project.pbxproj转换成JSON格式时,请注意Xcode将无法再为该项目显示项目导航器。但是它仍然能够构建和运行,因此只有在计划立即构建(例如用于CI)时才有用。
(编辑:截至2022年7月,Xcode现在可以正确读取其.pbxproj的JSON版本,以使您能够在项目导航器中查看文件。我不确定是哪个版本引入了这一功能,但最新版本的Xcode至少已实现。)
将project.pbxproj格式化为JSON后,几乎所有重要数据都在"objects"键下。您想要成为头文件的文件已经具有一个条目,其键是文件的UUID,并且有一个路径值可用于将该UUID与您的文件相关联。以下是该格式的示例:
// UUID for your file
"65TYSSDXHSLP4UUOAD9D40C322AAGHM9": {
"path": "MyHeader.h", // Your file's name
"isa": "PBXFileReference",
"includeInIndex": "1",
"lastKnownFileType": "sourcecode.c.h",
"sourceTree": "<group>"
}
还有一种方法可以将该文件声明为头文件,这需要自己的UUID以及对你的文件UUID的引用:
// UUID for your file as a header
"YU3BSD39O9PT5RESDFV741D1": {
"isa": "PBXBuildFile",
"fileRef": "65TYSSDXHSLP4UUOAD9D40C322AAGHM9", // UUID for your file MyHeader.h
"settings": {
"ATTRIBUTES": [
"Public" // could also be Project or Private
]
}
}
最后,您的目标需要一个头文件列表,您将希望在其中获取用于引用头文件的UUID。
"A82GAE9A5HUIO063IOPQAAQIUFGSNXZ": {
"isa": "PBXHeadersBuildPhase",
"buildActionMask": "2147483647",
"files": [
"YU3BSD39O9PT5RESDFV741D1" // UUID for your file as a header
],
"runOnlyForDeploymentPostprocessing": "0"
}
再次强调,直接更改project.pbxproj文件并不是一个好主意,但在没有更好的工具可以在不使用Xcode的情况下进行这些更改的情况下,这是我能找到的最好方法。如果还有其他人知道比我更好的解决方案,请告诉我。