Xcode-如何通过命令行更改文件的目标成员身份?

时间:2018-10-23 11:39:57

标签: objective-c xcode cocoa cocoa-touch xcode-command-line-tools

是否可以通过命令行在Xcode项目中更改文件的目标成员身份?

这是我要通过Xcode的UI进行的操作:

target membership

1 个答案:

答案 0 :(得分:2)

对于CI,我也必须这样做。经过大量的挖掘,我认为这对于任何人编写工具来帮助完成工作并不普遍。

我得出的唯一结论是直接编辑project.pbxproj文件,这绝不是一件好事。直到我找到this stackoverflow answer on editing the project.pbxproj file为止,所有声称做到这一点的工具都没有任何帮助。本质上,您可以使用plutil -convert json project.pbxproj将project.pbxproj文件转换为JSON格式,并使用JSON操作工具将这些文件作为标头,然后将它们指向您想要的任何目标的标头。

将project.pbxproj转换为JSON格式时,请注意Xcode将不再能够向您显示该项目的项目导航器。但是,它仍然可以构建和运行,因此,只有在您计划在构建之前就正确进行此操作(例如用于CI)时,这才真正有用。

格式为project.pbxproj的JSON在“对象”键下几乎具有所有重要数据。您要作为标头的文件已经具有一个键为the UUID for the file的条目,以及一个可用于将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为止,这是我能找到的最好的方法。如果其他人知道我不知道的事情,请告诉我。