Синтаксис AppleScript для автоматизации Xcode 4.1 для очистки, сборки и запуска

Я ценю, что уже есть вопросы по этой теме, но прочитав те, которые я могу найти (особенно этот: Сообщить AppleScript, чтобы построить проект XCode), они все, кажется, пару лет, и ответы, похоже, не относятся к текущей версии Xcode.

Аналогично связанному вопросу, я пытаюсь автоматизировать открытие проекта Xcode, его создание, а затем запуск приложения в iPhone Simulator (v4.3). Этот проект является проектом Selenium iPhoneDriver (подробнее см. Здесь http://code.google.com/p/selenium/wiki/IPhoneDriver)

На основании ответа в другом вопросе я написал следующее script:

tell application "Xcode"
    open "/Users/<username>/Documents/Code/Selenium/iphone/iWebDriver.xcodeproj"
    tell project "iWebDriver"
         clean
         build
         try
             debug
         end try
    end tell
end tell

К сожалению, когда я запускаю это, я получаю следующее:

tell application "Xcode"
open "/Users/ben.adderson/Documents/Code/Selenium/iphone/iWebDriver.xcodeproj"
    --> project document "iWebDriver.xcodeproj"
clean project "iWebDriver"
    --> missing value
build project "iWebDriver"
    --> missing value
debug project "iWebDriver"
    --> error number -1708
end tell

Если я запускаю только команду open, Xcode открывает проект без проблем. Но как только я включаю в себя остальную часть script, значок Xcode в доке отскакивает, но все, что я получаю, помимо вышеперечисленного из редактора AppleScript.

Кто-нибудь может сказать, что я делаю неправильно? Это первый раз, когда я использовал AppleScript или Xcode, поэтому я боюсь диагностировать проблему.

Я пробовал смотреть на Xcode AppleScript Dictionary, но без обработанных примеров я не могу определить синтаксис, который мне нужен.

Заранее благодарим за помощь!

Ответ 1

Используя сочетание AppleScript и инструмента командной строки (xcodebuild), я придумал следующее:

-- This script will clean, build then run the project at the path below.
-- You will need to slightly modify this script if you have more than one xcodeproject at this path

set pathOfXcodeProject to "/Users/<username>/Documents/Code/Selenium/iphone/iWebDriver.xcodeproj"
-- End of configuration



do shell script "cd " & pathOfXcodeProject & " && /usr/bin/xcodebuild clean build "

tell application "Xcode"

    open pathOfXcodeProject
    activate
end tell

tell application "System Events"
    get system attribute "sysv"
    if result is greater than or equal to 4144 then -- Mac OS X 10.3.0
        if UI elements enabled then
            tell application process "Xcode"
                click menu item "Run" of menu 1 of menu bar item "Product" of menu bar 1

            end tell
        else
            beep
            display dialog "GUI Scripting is not enabled" & return & return & "Open System Preferences and check Enable Access for Assistive Devices in the Universal Access preference pane, then run this script again." with icon stop
            if button returned of result is "OK" then
                tell application "System Preferences"
                    activate
                    set current pane to pane "com.apple.preference.universalaccess"
                end tell
            end if
        end if
    else
        beep
        display dialog "This computer cannot run this script" & return & return & "The script uses GUI Scripting technology, which requires an upgrade to Mac OS X 10.3 Panther or newer." with icon caution buttons {"Quit"} default button "Quit"
    end if
end tell

Сообщите мне, если это сработает для вас. Я протестировал его против Xcode 4.2.1 на Lion с проектом iPhone.

Ответ 2

Если вы согласны с тем, что Xcode выходит на передний план, я бы использовал это вместо:

tell application "Xcode"
    activate
    open "/Users/<username>/Documents/Code/Selenium/iphone/iWebDriver.xcodeproj"
end tell

tell application "System Events"
    key code 15 using {command down}
end tell

Ответ 3

Несмотря на то, что я проголосую и одобряю вышеупомянутый AppleScript, который действительно хорош (а также работает...), будучи профессиональным, заботясь о старых версиях и крайних случаях и т.д. script, предложенный вопросом, должен был работать в первое место.

Причина, по которой он не работает, - это нарушение скриптов Xcode. Не только "чистый" не работает. Большинство всего, что я пытался сделать с внутренней объектной моделью Xcode, не работает.

Архитектура AppleScript (OSA) требует, чтобы приложение отображало "понятный человеку" граф объектов, который AppleScripts может ссылаться. В Xcode это может выглядеть так:

tell target "my library" of project "my project" of workspace "my workspace" to clean.

или

tell application "Xcode" to close all projects whose name contains "Lib"

Скрипт пользовательского интерфейса является последним средством использования сценариев при плохой работе приложений. Поскольку иерархия пользовательского интерфейса является стандартной по своей природе, а ее скриптабельность свободна от Cocoa, она наиболее часто работает.