Xcode & ldquo; Сборка и архив & rdquo; из командной строки

Это зависит от того, операционные системы, как правило, очищают его для вас, но если вы работаете, например, встраиваемое программное обеспечение, оно может не быть выпущено.

Просто убедитесь, что вы освободили его, он может сэкономить вам много времени, когда вы захотите интегрировать его в большой проект.

376
задан Dan Fabulich 21 July 2010 в 05:46
поделиться

19 ответов

Я нашел, как автоматизировать процесс сборки и архивирования из командной строки, я только что написал статью в блоге , объясняющую, как этого добиться.

Команду, которую вы должны использовать, это 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}"

Все подробности вы найдете в в статье . Если у вас есть какие-либо вопросы, не стесняйтесь их задавать.

309
ответ дан mles 21 July 2010 в 05:46
поделиться

Как построить проект iOS с помощью команды?

Clean : codebuild clean -workspace work-space-name.xcworkspace -scheme scheme-name 

& amp;

Archive : xcodebuild archive -workspace work-space-name.xcworkspace -scheme "scheme-name" -configuration Release -archivePath IPA-name.xcarchive 

& amp;

Export : xcodebuild -exportArchive -archivePath IPA-name.xcarchive -exportPath IPA-name.ipa -exportOptionsPlist exportOptions.plist


Что такое ExportOptions.plist?

ExportOptions.plist требуется в Xcode. Позволяет указать некоторые параметры при создании файла ipa. Вы можете выбрать параметры в дружественном пользовательском интерфейсе, когда вы используете Xcode для архивирования своего приложения.

Важно : Метод выпуска и разработки отличается в ExportOptions.plist

AppStore:

exportOptions_release ~ method = app-store

Разработка

exportOptions_dev ~ method = development

1
ответ дан Hasnain Haider K Niazi 21 July 2010 в 05:46
поделиться

Вы имеете в виду проверить / поделиться / отправить варианты? Я думаю, что они специфичны для XCode и не подходят для инструмента сборки из командной строки.

С некоторой сообразительностью, держу пари, ты мог бы сделать сценарий, чтобы сделать это для тебя. Похоже, они просто хранятся в ~/Library/MobileDevice/Archived Applications/ с UUDI и списком. Я не могу себе представить, что так же сложно будет спроектировать валидатор.

Процесс, который меня интересует, автоматизирует отправку сборок бета-тестерам. (Поскольку передача в App Store происходит нечасто, я не возражаю делать это вручную, тем более что мне часто приходится добавлять новый текст описания.) Выполняя псевдо-сборку + архив с использованием интерфейса командной строки Xcode, я могу запускать автоматические сборки из каждого коммита кода, создавать файлы IPA со встроенными профилями обеспечения и отправлять их по электронной почте тестерам.

1
ответ дан Michael Grinich 21 July 2010 в 05:46
поделиться

После обновления до Xcode 8 я обнаружил, что корпоративный ipa, генерируемый командой

/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, и все возвращается в норму.

2
ответ дан Suhaib 21 July 2010 в 05:46
поделиться

Если вы используете следующий инструмент: 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}"

источник

2
ответ дан Community 21 July 2010 в 05:46
поделиться

попробуйте xctool, это замена для xcodebuild от Apple, которая упрощает создание и тестирование продуктов для iOS и Mac. Это особенно полезно для непрерывной интеграции. Он имеет несколько дополнительных функций:

  1. Запускает те же тесты, что и Xcode.app.
  2. Структурированный вывод результатов сборки и тестирования.
  3. Удобный для человека цвет ANSI.

№ 3 чрезвычайно полезен. Я не могу, если кто-то может прочитать вывод консоли xcodebuild, я не могу, обычно он дает мне одну строку с 5000+ символами. Даже труднее читать, чем дипломную работу.

xctool: https://github.com/facebook/xctool

2
ответ дан Zitao Xiong 21 July 2010 в 05:46
поделиться

Улучшая ответ Винсента, я написал скрипт для этого: xcodearchive
Он позволяет вам архивировать (генерировать ipa) ваш проект через командную строку. Думайте об этом как о сестре команды xcodebuild, но для архивации.

Код доступен на github: http://github.com/gcerquant/xcodearchive


Один из вариантов сценария - включить архивирование Символы dSYM в архиве с метками времени. Нет оправдания тому, чтобы больше не хранить символы и не иметь возможности символизировать журнал аварийного сбоя, который вы можете получить позже.

3
ответ дан Guillaume 21 July 2010 в 05:46
поделиться

Пройдя еще один шаг, загрузите в iTunesConnect через командную строку с Xcode 7 ! (Предполагая, что вы начинаете с .ipa, который был подписан с правильным профилем выпуска и подписью.)

Введите altool, интерфейс CLI для загрузчика приложений ( docs , стр. 38). Скрытая глубоко в структуре Xcode.app, это удобная функция, позволяющая загружать файлы непосредственно в 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 и выберите новую сборку для тестирования с помощью testflight.

Заключительное примечание: Если вы получаете сообщение «Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application», вы можете следовать предложению этого ответа SO , чтобы запустить символическую ссылку на правильное местоположение:

ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms
4
ответ дан Community 21 July 2010 в 05:46
поделиться

Перейдите в папку, где находится корневой каталог вашего проекта, и:

xcodebuild -project projectname -activetarget -activeconfiguration archive
6
ответ дан erick2red 21 July 2010 в 05:46
поделиться

С Xcode 4.2 вы можете использовать флаг -scheme, чтобы сделать это:

xcodebuild -scheme <SchemeName> archive

После этой команды Архив появится в Xcode Organizer.

277
ответ дан Besi 21 July 2010 в 05:46
поделиться

Я использовал свой собственный скрипт для создания пакета 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

Скрипт также увеличивает номер версии. Вы можете удалить эту часть, если она не нужна. Надеюсь, это поможет.

27
ответ дан Arrix 21 July 2010 в 05:46
поделиться

Ниже приведено краткое описание шагов, которые необходимо выполнить, и параметров, которые необходимо передать при создании ipa с использованием terrminal:

  1. Перейдите в папку, в которой находится файл MyApp.xcodeproject, в терминал

  2. Используя приведенную ниже команду, вы получите все цели приложения

    /usr/bin/xcodebuild -list 
    
  3. После выполнения вышеуказанной команды: вы получите список целей, из которых вы должны выбрать конкретную цель, которую вы хотите сгенерировать .ipa

    /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
    
  4. Приведенная выше команда создает проект и создает файл .app. путь к файлу .app: ./build/Release-iphoneos/MyApp.app

  5. После успешного завершения сборки выполните следующую команду, чтобы сгенерировать .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”)
  1. ipa будет сгенерирован в выбранном выходном каталоге « $ {OUTDIR } "
14
ответ дан Karthikeyan Vaithilingam 21 July 2010 в 05:46
поделиться

Обновление моего ответа с помощью Xcode 9 и Swift

Архив

xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchive

Экспорт IPA ( обратите внимание на список параметров экспорта )

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 установлен в агенте сборки для архивации и экспорта.

Для этого вы можете использовать любой из двух вариантов.

  1. Использовать полный путь к xcodebuild,

/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild

  1. Использовать 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 и работает нормально для меня.

127
ответ дан Raj 21 July 2010 в 05:46
поделиться

Я нашел некоторые другие ответы здесь трудными для начала. Эта статья сделала, если для меня. Некоторые пути, возможно, должны быть абсолютными, как упомянуто в других ответах.

Команда:

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"
16
ответ дан zekel 21 July 2010 в 05:46
поделиться

Инструмент xcodebuild может создавать и экспортировать архивные продукты с флагом -exportArchive (начиная с Xcode 5). Этап экспорта ранее был возможен только через пользовательский интерфейс Xcode Organizer.

Сначала заархивируйте свое приложение:

xcodebuild -scheme <scheme name> archive

Учитывая $ARCHIVE_PATH (путь к файлу .xcarchive ), экспортируйте приложение из архива одним из следующих способов:

Файл iOS .ipa :

xcodebuild -exportArchive -exportFormat ipa -archivePath "$ARCHIVE_PATH" -exportPath "myApp.ipa" -exportProvisioningProfile "My App Provisioning profile"

Mac .app Файл:

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).

23
ответ дан Nik 21 July 2010 в 05:46
поделиться

Мы разработали приложение для 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>&Auml;ltere Versionen<\/h3>.<ul>.<li>\)/\1\
${ITUNES_LINK}\
\3\2<\/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>

Для настройки необходимо импортировать сертификат распределения и профиль обеспечения в цепочку ключей назначенного пользователя.

24
ответ дан FuePi 21 July 2010 в 05:46
поделиться

Для Xcode 7 у вас есть намного более простое решение. Единственная дополнительная работа заключается в том, что вам нужно создать файл конфигурации для экспорта архива.

(По сравнению с Xcode 6, в результатах xcrun xcodebuild -help, -exportFormat и -exportProvisioningProfile опции больше не упоминаются; первый удален, а последний заменен -exportOptionsPlist.)

Шаг 1 , измените каталог на папку, включающую файл .xcodeproject или .xcworkspace.

cd MyProjectFolder

Шаг 2 , используйте Xcode или /usr/libexec/PlistBuddy exportOptions.plist для создания файла опций экспорта. Кстати, xcrun xcodebuild -help скажет вам, какие ключи нужно вставить в файл plist.

Шаг 3 , создайте файл .xcarchive (фактически, папку) (сборка / каталог будет автоматически создан XCode прямо сейчас),

xcrun xcodebuild -scheme MyApp -configuration Release archive -archivePath build/MyApp.xcarchive

Шаг 4 , экспортируйте как файл .ipa следующим образом, который отличается от Xcode6

xcrun xcodebuild -exportArchive -exportPath build/ -archivePath build/MyApp.xcarchive/ -exportOptionsPlist exportOptions.plist

Теперь вы получаете файл ipa в каталоге build /. Просто отправьте его в Apple App Store.

Кстати, файл ipa, созданный Xcode 7, намного больше, чем Xcode 6.

14
ответ дан DawnSong 21 July 2010 в 05:46
поделиться

Вы МОЖЕТЕ отказаться от сборки, как это делает XCode, чтобы вы могли протестировать и отправить тот же двоичный файл. Например, в моем сценарии (аналогичном описанному выше) я создаю свою версию выпуска, подписанную как сборку AdHoc, затем архивирую ее как IPA для тестирования, затем подаю в отставку с моим сертификатом распространения и создаю zip-файл, который я и отправляю Яблоко. Соответствующая строка:

codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
15
ответ дан Duane Fields 21 July 2010 в 05:46
поделиться

Xcode 8:


Формат IPA:

xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'

Экспортирует архив MyMobileApp.xcarchive в виде файла IPA для путь MyMobileApp.ipa с использованием профиля обеспечения MyMobileApp Distribution Profile.

Формат APP:

xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team'

Экспортирует архив MyMacApp.xcarchive в виде файла PKG по пути MyMacApp.pkg, используя приложение, подписывающее код подписи приложения ID разработчика: Моя команда. Установщик подписывает удостоверение личности Идентификатор разработчика Установщик: Моя команда неявно используется для подписи экспортируемого пакета.

Страница руководства по Xcodebuild

8
ответ дан Suhaib 21 July 2010 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: