我的项目有一个包含数百个文件的组(组织成几十个两级子组)。该组中的文件本身经常被更改。我希望这些文件包含在某些目标中,但不包含在其他目标中。
在 Xcode 3.x 中,每次更改组后,我只需获取有关组本身的信息,转到“目标”选项卡,然后(重新)选择我想要的目标。 (事实上,这与 2010 年的一个几乎相同的问题的答案,Xcode — 组和目标 https://stackoverflow.com/questions/3103957/xcode-groups-and-targets.)
在 Xcode 5 中,如果您选择了一个组,则等效的文件检查器面板没有“目标成员资格”部分(并且,即使选择一个组与选择其所有文件相同,如果您选择“目标成员资格”复选框也会被禁用)多个文件)。
那么,这个功能是否仍然存在,但隐藏在我无法找到的地方?
如果没有,显然还有其他方法可以做我想做的事——编写 Xcode 脚本、解析 .pbxproj 文件,或者将组抽象为子项目或构建静态库的完全独立的项目等。但我很乐意能够在这里使用 Xcode,就像我在 3.x 中所做的那样,而不是必须对抗它。
实际上,编写 Xcode 脚本似乎不起作用。任何获取构建阶段的构建文件的尝试都会失败,并出现一般 -10000 错误。例如:
tell application "Xcode"
set theproject to project "SampleProject"
set thetarget to target "SampleTarget" of theproject
set thephase to build phase "Compile Sources" of thetarget
build files of phase
end tell
...最后一行失败:
error "Xcode got an error: AppleEvent handler failed." number -10000
这是我最终使用的技巧——显然我仍然希望有更好的解决方案。
#!/usr/bin/env python3
import os
import plistlib
import sys
pbxproj = os.path.join(sys.argv[1], 'project.pbxproj')
groupname = sys.argv[2]
extensions = 'm mm c cc cpp'.split()
with open(pbxproj, 'rb') as f:
p = plistlib.load(f)
objs = p['objects']
groupid, group = next((k, v) for k, v in objs.items()
if v.get('path') == groupname)
def descendants(id):
obj = objs[id]
if obj['isa'] == 'PBXFileReference':
yield (id, obj)
for child in obj.get('children', []):
yield from descendants(child)
mdict = {id: obj for id, obj in descendants(group_id)
if os.path.splitext(obj['path'])[-1] in extensions}
proj_id, proj = next((k, v) for k, v in objs.items()
if v['isa'] == 'PBXProject')
for target_id in proj['targets']:
target = objs[target_id]
phase_ids = target['buildPhases']
phases = [(phase_id, objs[phase_id]) for phase_id in phase_ids]
phase_id, phase = next((phase_id, phase)
for phase_id, phase in phases
if phase['isa'] == 'PBXSourcesBuildPhase')
fileref_ids = [i
for i, buildfile_id in enumerate(phase['files'])
if objs[buildfile_id]['fileRef'] in mdict]
fileref_ids.sort(reverse=True)
for i in fileref_ids:
del phase['files'][i]
with open(pbxproj + '.new', 'wb') as f:
plistlib.dump(p, f)
os.rename(pbxproj, pbxproj + '.bak')
os.rename(pbxproj + '.new', pbxproj)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)