2014-08-28 4 views
1

내 프로젝트에는 수십 개의 파일이 포함 된 그룹이 있습니다 (두 레벨의 하위 그룹으로 구성되어 있음). 해당 그룹의 파일 자체가 합리적으로 자주 변경됩니다. 나는 그 파일을 일부 대상에 포함 시키되 다른 대상에는 포함시키지 않기를 바란다.대상에서 전체 그룹 포함/제외

Xcode 3.x에서는 그룹을 변경할 때마다 그룹 자체에 대한 정보 만 얻고 대상 탭으로 이동 한 다음 원하는 대상을 (다시) 선택합니다.

Xcode 5에서는 그룹이 선택된 경우 동일한 파일 검사기 패널에 대상 구성원 섹션이 없으며 (그리고 실제로는 2010 년과 거의 동일한 질문에 대한 대답이었습니다. 그룹을 선택하더라도 모든 파일을 선택하는 것과 같더라도 둘 이상의 파일을 선택하면 대상 구성원 확인란이 비활성화됩니다.

그래서이 기능은 여전히 ​​있지만 숨겨진 곳에서 숨겨져 있습니까?

분명히 내가 원하는대로 할 수있는 다른 방법이있다. 스크립트 Xcode, .pbxproj 파일을 구문 분석하거나 그룹을 하위 프로젝트 또는 정적 라이브러리 등을 빌드하는 완전히 별개의 프로젝트로 추상화한다. 3.x에서했던 방식대로 여기에서 Xcode로 작업 할 수 있기를 바랍니다.


사실 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 

답변

1

여기에 내가 결국 해킹의 사용이 더 낫다고 분명히 여전히 더 나은 솔루션을 주셔서 감사합니다.

#!/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) 
관련 문제