Я использую ANT для создания релизов, используя утилиту командной строки xcodebuild.Цель ant выглядит следующим образом:
<target name="build-adhoc">
<echo>Running XCODE compiler</echo>
<exec executable="xcodebuild" failonerror="true" vmlauncher="false" dir="${connect_src}">
<arg value="build"/>
<arg value="-target" />
<arg value="myappname" />
<arg value="-configuration"/>
<arg value="AdHoc"/>
<arg value="SYMROOT=${export_app}-${version.number}/AdHoc" />
<env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/somesource/**\ /tmp/build/trunk/Libraries/somemoresource/**"/>
</exec>
<echo>xcode build complete</echo>
</target>
Создайте конфигурацию для своего специального выпуска и убедитесь, что он использует специальный готовый профиль обеспечения.Или вы можете создать обычную, не специальную конфигурацию, которая использует ваш профиль обеспечения разработчика.Если вы сделаете первое, вы можете отправить продукт по электронной почте вместе с вашим профилем обеспечения тестерам.Если вы делаете последнее, вы можете использовать утилиту конфигурации iPhone для установки на любое устройство в профиле.
Кроме того, у нас есть целевая установка ANT с зависимостями от выполнения новой проверки из системы контроля версий и выполнения сборки оттуда.Наконец, мы делаем сборку сразу после этого, используя реальную конфигурацию, готовую для App Store, чтобы мы могли протестировать первую сборку и отправить вторую Apple, с некоторой степенью уверенности, что поведение кода будет таким же.
Вот сводка наших целей ANT в порядке обработки:
- установка переменных env, необходимых для сборок
- очистка каталогов извлечения и сборки
- извлечение HEAD из источникаcontrol
- изменение списков для удаления отладки и элементов только для внутреннего использования (с помощью PLISTBUDDY)
- инкрементная версия сборки (с использованием agvtool)
- запуск модульных тестов (для этого требуется настройка sdkустановить iphonesimulator4.x и специальную цель - см. Руководство для разработчиков iPhone для модульного тестирования)
- Выполнить внутреннюю сборку (с использованием профиля dev или специального профиля)
- Выполнить сборку распространения (с помощью приложения)Храните сертификат распространения)
- Checkin plist файлы, которые имеют новую версию сборки
- Сделайте тег в управлении исходным кодом, указывающийbuild
- Отчет о статистике сборки (версия сборки, местоположение и т. д.)
ПРИМЕЧАНИЕ: убедитесь, что вы задали переменную SYMROOT env в синтаксисе команды xcodebuild, чтобы ваша сборка оказалась вправильный каталог.После этого у нас возникли проблемы с копированием сборок App Store.
Вот полный сценарий ANT, используемый для создания нескольких сборок: одна для тестирования, а другая для распространения.Например: «ant distribution» создаст одну сборку с использованием профиля dev, а другую - с использованием профиля распространения App Store.
Этот сценарий «очищен», поэтому он служит только моделью для запуска:
<?xml version="1.0" ?>
<project basedir="." default="xcode-build" name="Temp">
<property file="build.properties" />
<property name = "CONFIGURATION_INTERNAL" value = "InternalRelease" />
<property name = "CONFIGURATION_DISTRIBUTION" value = "Distribution" />
<property name = "CONFIGURATION_ADHOC" value = "InternalAdHoc" />
<property name="cvsroot" value=":pserver:${username}:${password}@${cvsurl}"/>
<tstamp>
<format property="TODAY"
pattern="MM-dd-yyyy"
locale="en,US"/>
</tstamp>
<target name="init">
<echo message="deleting old directories" />
<delete dir="${check_out_location}"/>
<mkdir dir="${check_out_location}"/>
</target>
<target name="set-source-trees" depends="init">
<echo message="exporting source tree variables" />
<echo message="${somesourcedir}" />
<exec executable="/bin/bash" os=" Mac OS X">
<arg value="-c" />
<arg value="${export_src_trees}"/>
<arg value="${anothersourcedir}"/>
</exec>
<exec executable="/bin/bash" os=" Mac OS X">
<arg value="-c" />
<arg value="${export_src_trees}"/>
<arg value="${yetanothersourcedir}"/>
</exec>
</target>
<target name="cvs-login" depends="init" description="CVS Login">
<echo>Login CVS</echo>
<cvs cvsroot=":pserver:${username}:${password}@${cvsurl}" command="login" />
</target>
<target name="checkout" depends="cvs-login" description="Check out source from CVS">
<echo message="check out from CVS ...." />
<echo message="${check_out_location}" />
<cvs cvsroot="${cvsroot}" command=" -Q checkout -P -d${project_trunk} ${project_repository_root}/${project_trunk} " dest="${check_out_location}" compression="true" />
<echo message="...check out from CVS done" />
</target>
<target name="strip-settings" depends="checkout" description="Remove elements from the Settings.bundle that we don't want in the distribution">
<echo message="Removing Settings not valid for distribution"/>
<exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}/Resources">
<arg value="-c"/>
<arg value="Delete :PreferenceSpecifiers:3"/>
<arg value="Settings.bundle/Root.plist"/>
</exec>
<exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}/Resources">
<arg value="-c"/>
<arg value="Delete :PreferenceSpecifiers:3"/>
<arg value="Settings.bundle/Root.plist"/>
</exec>
</target>
<target name="build-version" depends="checkout">
<property name = "LOGLEVEL" value = "DEBUG" />
<!-- GET THE NEXT VERSION NUMBER (major and minor) -->
<exec executable="/tmp/build/trunk/Build/version.sh" failonerror="TRUE" outputproperty="version.number" dir="${app_src}"></exec>
<echo message="Increment Build Number"/>
<exec executable="agvtool" failonerror="TRUE" dir="${app_src}">
<arg value="new-version"/>
<arg value="-all"/>
<arg value="${version.number}"/>
</exec>
<!-- GET THE MINOR portion of the version number for later use -->
<exec executable="/tmp/build/trunk/Build/minor.sh" failonerror="TRUE" outputproperty="version.minor" dir="${app_src}"></exec>
<!-- SET the version number as reference in the Settings.bundle -->
<exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}">
<arg value="-c"/>
<arg value="Set :PreferenceSpecifiers:1:DefaultValue ${version.number}"/>
<arg value="./Resources/Settings.bundle/Root.plist"/>
</exec>
<echo message="New build number=${version.number}"/>
<!-- SET the log level - NOTE, ANT vars are immutable, if LOGLEVEL was previously set, it cannot be overridden -->
<exec executable="/usr/libexec/PlistBuddy" failonerror="TRUE" dir="${app_src}">
<arg value="-c"/>
<arg value="Set LogLevel.Default ${LOGLEVEL}"/>
<arg value="./Resources/SharedConfig.plist"/>
</exec>
<echo message="Log level set to ${LOGLEVEL}"/>
</target>
<target name="encrypt" depends="build-version">
<!-- SOME ENCRYPTION OF SENSITIVE DATA -->
</target>
<target name="build-internal" depends="test-lib1, test-lib2, test-app, encrypt">
<echo>Running XCODE compiler</echo>
<exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
<arg value="clean"/>
<arg value="install"/>
<arg value="-target" />
<arg value="MyApp" />
<arg value="-configuration"/>
<arg value="${CONFIGURATION_INTERNAL}"/>
<arg value="SYMROOT=${build_release}" />
<env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/somesource/**\ /tmp/build/trunk/Libraries/someothersource/**"/>
</exec>
<echo>xcode build complete</echo>
</target>
<target name="test-lib1" depends="checkout">
<echo>Running XCODE compiler</echo>
<exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${somelib_dir}">
<arg value="clean"/>
<arg value="build"/>
<arg value="-target" />
<arg value="Lib1UnitTests"/>
<arg value="-sdk"/>
<arg value="iphonesimulator4.1"/>
<arg value="SYMROOT=${build_release}" />
</exec>
<echo>xcode build complete</echo>
</target>
<target name="test-lib2" depends="checkout">
<echo>Running XCODE compiler</echo>
<exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${somelib2_src_dir}">
<arg value="clean"/>
<arg value="build"/>
<arg value="-target" />
<arg value="Lib2UnitTests"/>
<arg value="-sdk"/>
<arg value="iphonesimulator4.1"/>
<arg value="SYMROOT=${build_release}" />
<env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1source/**"/>
</exec>
<echo>xcode build complete</echo>
</target>
<target name="test-app" depends="checkout">
<echo>Running XCODE compiler</echo>
<exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
<arg value="clean"/>
<arg value="build"/>
<arg value="-target" />
<arg value="AppUnitTests"/>
<arg value="-sdk"/>
<arg value="iphonesimulator4.1"/>
<arg value="SYMROOT=${build_release}" />
<env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1/**\ /tmp/build/trunk/Libraries/Lib2/**"/>
</exec>
<echo>xcode build complete</echo>
</target>
<target name="build-distribution" depends="internal-release, test-lib1, test-lib2, test-app">
<echo>Running XCODE compiler</echo>
<exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
<arg value="build"/>
<arg value="-target" />
<arg value="MyApp" />
<arg value="-configuration"/>
<arg value="${CONFIGURATION_DISTRIBUTION}"/>
<arg value="SYMROOT=${export_app}-${version.number}/Distribution" />
<env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1/**\ /tmp/build/trunk/Libraries/Lib2/**"/>
</exec>
<echo>xcode build complete</echo>
</target>
<target name="build-adhoc" depends="internal-release, test-lib1, test-lib2, test-app">
<echo>Running XCODE compiler</echo>
<exec executable="${xcode_builder}" failonerror="true" vmlauncher="false" dir="${app_src}">
<arg value="build"/>
<arg value="-target" />
<arg value="MyApp" />
<arg value="-configuration"/>
<arg value="${CONFIGURATION_ADHOC}"/>
<arg value="SYMROOT=${export_app}-${version.number}/AdHoc" />
<env key="USER_HEADER_SEARCH_PATHS" value="/tmp/build/trunk/Libraries/Lib1/**\ /tmp/build/trunk/Libraries/Lib2/**"/>
</exec>
<echo>xcode build complete</echo>
</target>
<target name="checkin" depends="build-internal" description="Commit source to CVS" >
<echo message="Committing to CVS ...." />
<echo message="${check_out_location}" />
<cvs cvsroot="${cvsroot}" command="commit -m 'Commit of internal release build ${version.number}' MyApp-Info.plist" dest="${check_out_location}/trunk/Applications/MyApp" />
<echo message="...commit done" />
</target>
<target name="tag-release" depends="checkin" description="Tag source in CVS" >
<echo message="Tagging source ... Release-${version.minor}" />
<echo message="${check_out_location}" />
<cvs cvsroot="${cvsroot}" command="tag Release-${version.minor}" dest="${check_out_location}"/>
<echo message="...tag done" />
</target>
<target name="internal-release" depends="tag-release" description="Tag source in CVS" >
<echo message="Creating Internal release ..." />
<echo message="Deploying files to . . .${export_app}" />
<copy todir="${export_app}-${version.number}">
<fileset dir="${prod_dir_internal}"/>
</copy>
<echo message="Internal release ${version.number} complete." />
</target>
<target name="override-default-env" description="Setup Env for Distribution" >
<property name = "LOGLEVEL" value = "WARN" />
</target>
<target name="distribution" depends="override-default-env, strip-settings, build-distribution" description="Create Distribution" >
<echo message="Creating Distribution ..." />
<echo message="Deploying files to . . .${export_app}-${version.number}/Distribution" />
<echo message="Distribution ${version.number} complete." />
</target>
<target name="adhoc" depends="override-default-env, strip-settings, build-adhoc" description="Create Ad Hoc Distribution" >
<echo message="Creating ad hoc distribution ..." />
<echo message="Deploying files to . . .${export_app}-${version.number}/AdHoc" />
<echo message="Ad hoc distribution ${version.number} complete." />
</target>
</project>
Hope this helps.