Как автоматизировать создание новых целей XCode из Applescript / Automator / Shell Script - PullRequest
33 голосов
/ 23 апреля 2010

В настоящее время я работаю над тем, как автоматизировать процесс добавления новых целей в мои проекты XCode. Одна цель должна быть добавлена ​​в несколько проектов XCode, и каждая цель в разных проектах требует добавления одних и тех же исходных файлов, одних и тех же групп для хранения исходных файлов в проекте XCode и одинаковых настроек сборки. Выполнение этого вручную может занять некоторое время и очень подвержено человеческим ошибкам, и мне приходится выполнять эту задачу довольно часто. Я уже написал скрипт для генерации новых исходных файлов, копирования их в системные папки, редактирования исходных файлов с новой информацией и т. Д., Но теперь мне нужно автоматизировать часть XCode.

Это подводит итог того, чего я хочу добиться от моей автоматизации:

Откройте проект XCode в /this/path/project.xcodeproj

Дублируйте существующую цель и переименуйте ее

Редактировать настройки сборки новой цели

Добавьте группу в раздел «Источники и ресурсы», затем переименуйте их

Добавление исходных файлов в группы и добавление файла в новую цель

Закрыть XCode

В идеале я хочу, чтобы это запускалось из моего сценария Bourne Shell, я знаю, что вы можете запускать рабочие процессы автоматизатора оттуда. Я не уверен, что лучший подход к достижению этого, хотя, есть идеи? Заранее спасибо: -)

1 Ответ

2 голосов
/ 20 января 2012

позвольте мне начать с этого скрипта (для Xcode 4.2.1),

  • Откройте проект XCode в /this/path/project.xcodeproj (сделано)
  • Дублируйте существующую цель и переименуйте ее (не реализовано)
  • Редактировать настройки сборки новой цели (готово)
  • Добавьте группу в раздел Source and Resources, затем переименуйте их (готово)
  • Добавление исходных файлов в группы и добавление файла в новую цель (частично)
  • Закрыть XCode (сделано)

! / USR / бен / osascript

# Reference: AppleScript Editor -> File -> Open Directory ... -> Xcode 4.2.1

# http://vgable.com/blog/2009/04/24/how-to-check-if-an-application-is-running-with-applescript/
on ApplicationIsRunning(appName)
    tell application "System Events" to set appNameIsRunning to exists (processes where name is appName)
    return appNameIsRunning
end ApplicationIsRunning

if not ApplicationIsRunning("Xcode") then
    log ("Launching Xcode ...")
    launch application id "com.apple.dt.Xcode"
    delay 5
else
    log("Xcode is already running ...")
end if

set project_path to "/PATH/TO/YOUR_PROJECT.xcodeproj"
log ("Open an XCode project at " & project_path)

set _project_name to (do shell script "echo $(basename " & project_path & ") | sed -e 's/.xcodeproj//'")
log ("project_name set to " & _project_name)

set _target_name to "YOUR_TARGET"

tell application id "com.apple.dt.Xcode"
    set _project_file to (POSIX file project_path as alias)
    open _project_file
    # load documentation set with path path_to_project display yes
    set _workspace to active workspace document
    set _project to first item of (projects of _workspace whose name = _project_name)
    set _target to first item of (targets of _project whose name = _target_name)

    # as this won't work, cannot event resort to system event
    # duplicate _target with properties {name:_target_name & "_clone"}
    # make new build configuration with data build configurations of _target with properties {name:_target_name & "_clone"}
    # activate

    log ("Edit the Build Settings of the new target")
    set _build_configuration to first item of (build configurations of _target whose name = "Debug")
    set value of build setting "PRODUCT_NAME" of _build_configuration to "KeySING"

    # http://lists.apple.com/archives/xcode-users//2008/Feb/msg00497.html
    log ("Add a group to the Source and Resources section, then rename them")
    set _new_group_name to "groupX"
    tell root group of _project
        set _groups to (get groups whose name = _new_group_name)
        if (length of _groups) = 0 then
            set _new_group to make new group with properties {name:_new_group_name, path:_new_group_name, path type:group relative}
        else
            set _new_group to first item of _groups
        end if

        log ("Add source files to the groups, and add the file to the new Target")
        tell _new_group
            set _new_file_name to "whatever.h"
            set _new_files to get (file references whose name = _new_file_name)
            if (length of _new_files) = 0 then
                # Xcode crashes
                # make new file reference with properties ¬
                #     {name:_new_file_name, file encoding:utf8, path type:group relative,¬
                #      path:_new_file_name}
            end if
        end tell
    end tell

    log ("Close XCode")
    quit

end tell
...