Xcode "сборка и архивирование" из командной строки
Xcode 3.2 предоставляет удивительную новую функцию в меню Build, "Build and Archive", которая генерирует.ipa файл подходит для специального распространения. Вы также можете открыть органайзер, перейти в "архивные приложения" и "отправить приложение в iTunesConnect."
есть ли способ использовать "Build and Archive" из командной строки (как часть сценария сборки)? Я бы предположил, что xcodebuild были бы вовлечены как-то, но man страница, кажется, ничего не говорит о этот.
обновление Михаил Гринич запросил разъяснение; вот что именно вы не можете сделать с сборками командной строки, функции, которые вы можете сделать только с организатором Xcode после того, как вы "построите и Архивируете."
- вы можете нажать кнопку "Поделиться приложения..."чтобы поделиться своим IPA с бета-тестерами. Как указывает Гийом ниже, из-за некоторой магии Xcode этот IPA-файл не требует отдельного распространения .mobileprovision файл, который бета-тестеры должны установить; это волшебно. Ни один скрипт командной строки не может этого сделать. Например, сценарий Arrix (представленный 1 мая) не соответствует этому требованию.
- что еще более важно, после бета-тестирования сборки вы можете нажать "отправить приложение в iTunes Connect", чтобы отправить ту же самую сборку в Apple, тот самый двоичный файл, который вы тестировали, без его восстановления. Это невозможно из командной строки, потому что подписание приложения является частью процесса сборки; вы можете подписать биты для специального бета-тестирования или вы можете подписать их для отправки в магазин приложений, но не оба. Ни один IPA, построенный в командной строке, не может быть бета-тестирован на телефонах, а затем отправлен непосредственно в Apple.
Я бы хотел, чтобы кто-то пришел и доказал, что я ошибаюсь: обе эти функции отлично работают в графическом интерфейсе Xcode и не могут быть реплицированы из командной строки.
18 ответов:
Я нашел как автоматизировать процесс сборки и архив из командной строки, я просто написал статья в блоге объясняя, как вы можете достичь этого.
команда, которую вы должны использовать
xcrun:/usr/bin/xcrun -sdk iphoneos PackageApplication \ -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" \ -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" \ --sign "${DEVELOPER_NAME}" \ --embed "${PROVISONING_PROFILE}"вы найдете все подробности в статьи. Если у вас возникли вопросы, не стесняйтесь спрашивать.
С помощью Xcode 4.2 вы можете использовать флаг-scheme для этого:
xcodebuild -scheme <SchemeName> archiveпосле этой команды архив появится в организаторе Xcode.
обновление моего ответа с помощью Xcode 9 и Swift
архиве
xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchiveэкспорт IPA (обратите внимание на опцию экспорта plist)
xcodebuild -exportArchive -archivePath <ProjectName>.xcarchive -exportOptionsPlist <ProjectName>/exportOptions.plist -exportPath <ProjectName>.ipa
для тех, кто не знает о exportOptions.plist, https://blog.bitrise.io/new-export-options-plist-in-xcode-9
те, кто использовал это для создания проекта в инструментах CI/CD, таких как teamcity / jenkins, пожалуйста, убедитесь, что вы используете правильный xcode, установленный в Агенте сборки для архивирования и экспорта.
вы можете использовать любой из ниже 2 варианта для этого.
- используйте полный путь к xcodebuild,
/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild
- использовать xcode-select,
xcode-select -switch /Applications/Xcode 9.3.1.app
ниже старый ответ
вот сценарий командной строки для создания архив и пример IPA. У меня есть проект iPhone xcode , который находится в папке Desktop/MyiOSApp.
выполните следующие команды одну за другой .
cd /Users/username/Desktop/MyiOSApp/ xcodebuild -scheme MyiOSApp archive \ -archivePath /Users/username/Desktop/MyiOSApp.xcarchive xcodebuild -exportArchive -exportFormat ipa \ -archivePath "/Users/username/Desktop/MyiOSApp.xcarchive" \ -exportPath "/Users/username/Desktop/MyiOSApp.ipa" \ -exportProvisioningProfile "MyCompany Distribution Profile"это тестируется с Xcode 5 и работает нормально для меня.
я использовал свой собственный скрипт сборки для создания пакета ipa для специального распространения.
die() { echo "$*" >&2 exit 1 } appname='AppName' config='Ad Hoc Distribution' sdk='iphoneos3.1.3' project_dir=$(pwd) echo using configuration $config echo updating version number agvtool bump -all fullversion="$(agvtool mvers -terse1)($(agvtool vers -terse))" echo building version $fullversion xcodebuild -activetarget -configuration "$config" -sdk $sdk build || die "build failed" echo making ipa... # packaging cd build/"$config"-iphoneos || die "no such directory" rm -rf Payload rm -f "$appname".*.ipa mkdir Payload cp -Rp "$appname.app" Payload/ if [ -f "$project_dir"/iTunesArtwork ] ; then cp -f "$project_dir"/iTunesArtwork Payload/iTunesArtwork fi ipaname="$appname.$fullversion.$(date -u +%Y%m%d%H%M%S).ipa" zip -r $ipaname Payload echo finished making $ipanameскрипт также увеличивает номер версии. Вы можете удалить эту часть, если она не нужна. Надеюсь, это поможет.
мы разработали приложение для iPad с XCode 4.2.1 и хотели интегрировать сборку в нашу непрерывную интеграцию (Jenkins) для распространения OTA. Вот решение, которое я придумал:
# Unlock keychain security unlock-keychain -p jenkins /Users/jenkins/Library/Keychains/login.keychain # Build and sign app xcodebuild -configuration Distribution clean build # Set variables APP_PATH="$PWD/build/Distribution-iphoneos/iPadApp.app" VERSION=`defaults read $APP_PATH/Info CFBundleShortVersionString` REVISION=`defaults read $APP_PATH/Info CFBundleVersion` DATE=`date +"%Y%m%d-%H%M%S"` ITUNES_LINK="<a href=\"itms-services:\/\/?action=download-manifest\&url=https:\/\/xxx.xxx.xxx\/iPadApp-$VERSION.$REVISION-$DATE.plist\">Download iPad2-App v$VERSION.$REVISION-$DATE<\/a>" # Package and verify app xcrun -sdk iphoneos PackageApplication -v build/Distribution-iphoneos/iPadApp.app -o $PWD/iPadApp-$VERSION.$REVISION-$DATE.ipa # Create plist cat iPadApp.plist.template | sed -e "s/${VERSION}/$VERSION/" -e "s/${DATE}/$DATE/" -e "s/${REVISION}/$REVISION/" > iPadApp-$VERSION.$REVISION-$DATE.plist # Update index.html curl https://xxx.xxx.xxx/index.html -o index.html.$DATE cat index.html.$DATE | sed -n '1h;1!H;${;g;s/\(<h3>Aktuelle Version<\/h3>\)\(.*\)\(<h3>Ältere Versionen<\/h3>.<ul>.<li>\)/\ ${ITUNES_LINK}\ <\/li>\ <li>/g;p;}' | sed -e "s/${ITUNES_LINK}/$ITUNES_LINK/" > index.htmlзатем Дженкинс загружает файлы ipa, plist и html на наш веб-сервер.
это шаблон plist:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>items</key> <array> <dict> <key>assets</key> <array> <dict> <key>kind</key> <string>software-package</string> <key>url</key> <string>https://xxx.xxx.xxx/iPadApp-${VERSION}.${REVISION}-${DATE}.ipa</string> </dict> <dict> <key>kind</key> <string>full-size-image</string> <key>needs-shine</key> <true/> <key>url</key> <string>https://xxx.xxx.xxx/iPadApp.png</string> </dict> <dict> <key>kind</key> <string>display-image</string> <key>needs-shine</key> <true/> <key>url</key> <string>https://xxx.xxx.xxx/iPadApp_sm.png</string> </dict> </array> <key>metadata</key> <dict> <key>bundle-identifier</key> <string>xxx.xxx.xxx.iPadApp</string> <key>bundle-version</key> <string>${VERSION}</string> <key>kind</key> <string>software</string> <key>subtitle</key> <string>iPad2-App</string> <key>title</key> <string>iPadApp</string> </dict> </dict> </array> </dict> </plist>чтобы настроить это, необходимо импортировать сертификат распространения и профиль подготовки в связку ключей назначенного пользователя.
The
xcodebuildинструмент может создавать и экспортировать архивные продукты с помощью - exportArchive флаг (начиная с Xcode 5). Шаг экспорта ранее был возможен только через пользовательский интерфейс Xcode Organizer.первый архив вашего приложения:
xcodebuild -scheme <scheme name> archiveдано
$ARCHIVE_PATH(путь к .xcarchive file), экспортировать приложение из архива с одним из следующих:iOS .ipa file:
xcodebuild -exportArchive -exportFormat ipa -archivePath "$ARCHIVE_PATH" -exportPath "myApp.ipa" -exportProvisioningProfile "My App Provisioning profile"Mac .приложение файл:
xcodebuild -exportArchive -exportFormat app -archivePath "$ARCHIVE_PATH" -exportPath "myApp.app" -exportSigningIdentity "Developer ID Application: My Software Company"в обеих командах - exportProvisioningProfile и - exportSigningIdentity аргументы являются необязательными.
man xcodebuildподробнее о семантике. В этих примерах профиль подготовки для сборки iOS задал профиль подготовки распространения AdHoc, а идентификатор подписи для приложения Mac задал идентификатор разработчика для экспорта в качестве стороннего приложения (т. е. не распространяется через Mac App Store).
Я нашел некоторые из других ответов здесь трудно получить. в этой статье а если для меня. Некоторые пути могут быть абсолютными, как указано в других ответах.
Команды:
xcrun -sdk iphoneos PackageApplication \ "/path/to/build/MyApp.app" \ -o "output/path/to/MyApp.ipa" \ --sign "iPhone Distribution: My Company" \ --embed "/path/to/something.mobileprovision"
вы можете фактически отказаться от сборки, как и XCode, чтобы вы могли протестировать и отправить тот же двоичный файл. Например, в моем скрипте (аналогичном приведенным выше) я создаю свою версию выпуска, подписанную как сборку AdHoc, затем я архивирую ее как IPA для тестирования, а затем увольняюсь с моим сертификатом распространения и создаю zip-файл, который я отправляю в Apple. Соответствующая строка:
codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
на Xcode 7, у вас есть гораздо более простое решение. Единственная дополнительная работа заключается в том, что вам нужно создать файл plist конфигурации для экспорта архива.
(по сравнению с Xcode 6, в результатах
xcrun xcodebuild -help,-exportFormatи-exportProvisioningProfileпараметры больше не упоминаются; первый удаляется, а второй заменяется-exportOptionsPlist.)Шаг 1 перейдите в каталог папку в том числе .xcodeproject или .xcworkspace все файл.
cd MyProjectFolderШаг 2, используйте Xcode или
/usr/libexec/PlistBuddy exportOptions.plistдля создания параметров экспорта plist файла. Кстати,xcrun xcodebuild -helpрасскажет вам, какие ключи вы должны вставить в файл plist.Шаг 3 создать .xcarchive файл (папка, на самом деле) следующим образом(сборка/ каталог будет автоматически создан Xcode прямо сейчас),
xcrun xcodebuild -scheme MyApp -configuration Release archive -archivePath build/MyApp.xcarchiveШаг 4 экспортировать как .файл такой, которая отличается от Xcode6
xcrun xcodebuild -exportArchive -exportPath build/ -archivePath build/MyApp.xcarchive/ -exportOptionsPlist exportOptions.plistтеперь вы получаете ipa-файл в build / directory. Просто отправьте его в apple App Store.
кстати, ipa-файл, созданный Xcode 7, намного больше, чем Xcode 6.
Я дал краткое описание шагов, чтобы следовать, и параметры для передачи при создании ipa с помощью terrminal ниже:
перейдите в папку, содержащую MyApp.файл xcodeproject в терминале
С помощью команды, приведенной ниже, вы получите все цели приложения
/usr/bin/xcodebuild -listпосле выполнения вышеуказанной команды вы получите список целей, из которых вы должны выбрать конкретная цель, которую вы должны создать .ipa
/usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Releaseприведенная выше команда создает проект и создает .файл приложения.Путь, чтобы найти .файл приложения-это
./build/Release-iphoneos/MyApp.appпосле завершения сборки выполните следующую команду для создания .ipa приложения с использованием имени разработчика и профиля подготовки с использованием синтаксиса ниже:
/usr/bin/xcrun -sdk iphoneos PackageApplication -v “${TARGET}.app” -o “${OUTDIR}/${TARGET}.ipa” –sign “${IDENTITY}” –embed “${PROVISONING_PROFILE}”объяснение каждого параметра в вышеуказанном синтаксис:
${TARGET}.app == Target path (ex :/Users/XXXXXX/desktop/Application/build/Release-iphoneos/MyApp.app) ${OUTDIR} == Select the output directory(Where you want to save .ipa file) ${IDENTITY} == iPhone Developer: XXXXXXX (XXXXXXXXXX)(which can be obtained from Keychain access) ${PROVISONING_PROFILE} == Path to the provisioning profile(/Users/XXXXXX/Library/MobileDevice/Provisioning Profiles/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.mobileprovision”)
- ipa будет генерироваться в выбранном выходном каталоге"${OUTDIR}"
Xcode 8:
формат IPA:
xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'экспортирует архив MyMobileApp.xcarchive как IPA-файл к пути MyMobileApp.ИПА с помощью профиль подготовки профиль распространения MyMobileApp.
приложение:
xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team'экспортирует архив MyMacApp.xcarchive как файл PKG к пути MyMacApp.ПКГ используя приложение приложение катион подписание identity Developer ID Application: моя команда. Удостоверение подписи установщика Установщик идентификатора разработчика: моя команда неявно используется для подписи экспортированного пакета.
перейдите в папку, где находится корень вашего проекта и:
xcodebuild -project projectname -activetarget -activeconfiguration archive
переход на один шаг дальше, загрузка в iTunesConnect через командную строку с Xcode 7! (Предполагая, что вы начинаете с
.ipaЭто было подписано с правильным профилем выпуска и удостоверением подписи.)введите
altool, интерфейс CLI для загрузчика приложений (docs, стр. 38). Скрытый глубоко внутри Xcode.структура приложения, это удобная функция, чтобы позволить нам загрузить непосредственно в ItunesConnect./Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altoolпросто запустить
$ altool --upload-app -f file -u username [-p password]чтобы загрузить ваш новоиспеченный.ipaпрямо в Apple. Пароль является необязательным и будет запрашивать его, если вы оставите его вне команды.если есть какие-либо проблемы с приложением во время шага проверки, консоль распечатает их.
вам, вероятно, придется экспортировать путь к
altoolесли вы не хотите, чтобы сохранить его расположение.export PATH=$PATH:/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/вот оно! Просто войдите в систему iTunesConnect.com и выберите новую сборку для тестирования с помощью испытательный полет.
Конечная Нота: если вы получаете сообщение об ошибке, говорящее
Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application, вы можете следовать предложению о это так ответ, чтобы запустить символическую ссылку в нужное место:ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms
улучшая ответ Винсента, я написал сценарий, чтобы сделать это:
xcodearchive
Это позволяет архивировать (генерировать ipa) ваш проект через командную строку. Думай об этом как о сестреxcodebuildкоманда, но для архивирования.код доступен на github:http://github.com/gcerquant/xcodearchive
Один из вариантов сценария-включить архивирование символов dSYM в архиве с меткой времени. Нет оправдания, чтобы не держать символы больше, и не сможет символизировать журнал сбоев, который вы можете получить позже.
попробуйте xctool, это замена для xcodebuild от Apple, что делает его легче создавать и тестировать iOS и Mac продукты. Это особенно полезно для непрерывной интеграции. Он имеет несколько дополнительных функций:
- запускает те же тесты, что и Xcode.приложение.
- структурированный вывод результатов сборки и тестирования.
- дружественный к Человек, Анси-покрашенный выход.
№ 3 чрезвычайно полезен. Я не могу, если кто-то может прочитать вывод консоли xcodebuild, я не могу, обычно это давало мне одну строку с 5000 + символов. Еще труднее читать, чем дипломную работу.
Если вы используете следующий инструмент: https://github.com/nomad/shenzhen
затем эта задача очень проста:
which ipa 1>/dev/null 2>&1 || echo 'no shenzhen. to install use: sudo gem install shenzhen --no-ri --no-rdoc' ipa build --verbose --scheme "${schemeName}"
после обновления Xcode до версии 8, я обнаружил, что предприятия, МПа, создаваемого
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}"команда не может быть запущена из-за некоторых проблем с подписью. Бревно указывает на то, что "предупреждение: PackageApplication является устаревшим, используйте
xcodebuild -exportArchiveвместо.поэтому я переключаюсь на
xcodebuild -exportArchiveи все стало нормально.
вы имеете в виду параметры validate/share/submit? Я думаю, что они специфичны для Xcode и не подходят для инструмента сборки командной строки.
С некоторым умом, я уверен, вы могли бы сделать скрипт, чтобы сделать это для вас. Похоже, они просто хранятся в
~/Library/MobileDevice/Archived Applications/с UUDI и plist. Я не могу себе представить, что было бы так сложно перепроектировать валидатор.процесс, который я заинтересован в автоматизации, отправляет сборки бета-тестерам. (С момента отправки в App Store случается нечасто, я не против делать это вручную, тем более, что мне часто нужно добавлять новый текст описания.) Делая псевдо-архив Build+с помощью CLI Xcode, я могу запускать автоматические сборки из каждой фиксации кода, создавать файлы IPA со встроенными профилями подготовки и отправлять их по электронной почте тестерам.
Comments