development

명령 줄에서 Xcode“빌드 및 아카이브”

big-blog 2020. 2. 25. 22:47
반응형

명령 줄에서 Xcode“빌드 및 아카이브”


Xcode 3.2는 빌드 메뉴 아래 "빌드 및 보관"에서 Ad Hoc 배포에 적합한 .ipa 파일을 생성하는 멋진 새 기능을 제공합니다. Organizer를 열고 "아카이브 응용 프로그램"및 "iTunesConnect에 응용 프로그램 제출"로 이동할 수도 있습니다.

명령 행에서 "빌드 및 아카이브"를 사용하는 방법이 있습니까 (빌드 스크립트의 일부로)? 나는 xcodebuild어떻게 든 관련이 있다고 가정 하지만 man페이지는 이것에 대해 아무 말도하지 않는 것 같습니다.

업데이트 Michael Grinich는 설명을 요청했습니다. 커맨드 라인 빌드로 할 수없는 것, "빌드 및 아카이브"후에 Xcode의 오거나이저로만 할 수있는 기능입니다.

  1. "애플리케이션 공유 ..."를 클릭하여 IPA를 베타 테스터와 공유 할 수 있습니다. Guillaume이 아래에 지적한 바와 같이, 일부 Xcode 매직으로 인해이 IPA 파일에는 베타 테스터가 설치해야하는 별도로 배포 된 .mobileprovision 파일이 필요하지 않습니다. 그것은 마술이다. 명령 줄 스크립트로는 할 수 없습니다. 예를 들어 Arrix의 스크립트 (5 월 1 일 제출)는 해당 요구 사항을 충족하지 않습니다.
  2. 더 중요한 것은, 빌드를 베타 테스트 한 후에 "응용 프로그램을 iTunes Connect에 제출"을 클릭하면 테스트를 빌드하지 않고 테스트 한 바이너리 인 Apple에 해당 빌드를 제출할 수 있습니다. 앱 서명은 빌드 프로세스의 일부이기 때문에 명령 줄에서는 불가능합니다. Ad Hoc 베타 테스트를 위해 비트를 서명하거나 App Store에 제출하기 위해 비트를 서명 할 수 있지만 둘다는 아닙니다. 명령 줄에 구축 된 IPA는 전화에서 베타 테스트를 거친 다음 Apple에 직접 제출할 수 없습니다.

누군가가 와서 나를 잘못 알고 싶어합니다.이 두 기능 모두 Xcode GUI에서 훌륭하게 작동하며 명령 줄에서 복제 할 수 없습니다.


comand 라인에서 빌드 및 아카이브 프로세스를 자동화하는 방법을 찾았으며, 이를 달성하는 방법을 설명하는 블로그 기사를 작성 했습니다.

사용해야하는 명령은 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

이 명령 후에 Archive는 Xcode Organizer에 나타납니다.


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


teamcity / jenkins와 같은 CI / CD 도구로 프로젝트를 빌드하는 데 이것을 사용하는 사람들은 빌드 에이전트에 설치된 올바른 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 예제 작성을위한 명령 행 스크립트입니다. Desktop / MyiOSApp 폴더에있는 iPhone xcode 프로젝트가 있습니다.

다음 명령을 하나씩 실행하십시오.

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

스크립트는 또한 버전 번호를 증가시킵니다. 필요하지 않은 경우 해당 부분을 제거 할 수 있습니다. 도움이 되길 바랍니다.


우리는 XCode 4.2.1로 iPad 앱을 개발했으며 OTA 배포를 위해 빌드를 지속적인 통합 (Jenkins)에 통합하려고했습니다. 내가 생각해 낸 해결책은 다음과 같습니다.

# 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

그런 다음 Jenkins는 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>

이를 설정하려면 배포 인증서 및 프로비저닝 프로파일을 지정된 사용자의 키 체인으로 가져와야합니다.


xcodebuild도구는 -exportArchive 플래그 (Xcode 5 기준)를 사용하여 아카이브 제품을 빌드하고 내보낼 수 있습니다 . 내보내기 단계는 이전에는 Xcode Organizer UI를 통해서만 가능했습니다.

먼저 앱을 보관하십시오.

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 앱의 서명 ID는 써드 파티 애플리케이션 (Mac App Store를 통해 분배되지 않음)으로 내보낼 개발자 ID를 지정했습니다.


나는 여기에 가기 어려운 다른 답변 중 일부를 발견했습니다. 이 기사 는 저에게 도움이되었습니다. 다른 답변에서 언급했듯이 일부 경로는 절대적이어야 할 수도 있습니다.

명령 :

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 파일을 작성합니다. 사과. 관련 라인은 다음과 같습니다

codesign -f -vv -s "$DistributionIdentity" "$APPDIR"

들어 엑스 코드 7 , 당신은 훨씬 더 간단한 해결책이있다. 추가 작업은 아카이브를 내보내기 위해 구성 plist 파일을 작성해야한다는 것입니다.

(결과에서 엑스 코드 (6)에 비해 xcrun xcodebuild -help, -exportFormat그리고 -exportProvisioningProfile옵션은 더 이상 언급되지 않으며, 전자가 삭제되고, 후자에 의해 대체된다 -exportOptionsPlist).

1 단계 : 디렉토리를 .xcodeproject 또는 .xcworkspace 파일을 포함하는 폴더로 변경하십시오.

cd MyProjectFolder

2 단계 : Xcode를 사용하거나 /usr/libexec/PlistBuddy exportOptions.plist내보내기 옵션 plist 파일을 작성하십시오. 그건 그렇고, xcrun xcodebuild -helpplist 파일에 어떤 키를 삽입 해야하는지 알려줍니다.

3 단계 , 다음과 같이 .xcarchive 파일 (실제로 폴더)을 만듭니다 (build / 디렉토리는 Xcode에 의해 자동으로 생성됩니다),

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

4 단계 , Xcode6과 다른 .ipa 파일로 내보내기

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

이제 build / 디렉토리에 ipa 파일이 있습니다. Apple App Store로 보내십시오.

그런데 Xcode 7로 만든 ipa 파일은 Xcode 6보다 훨씬 큽니다.


다음 단계에 대한 간단한 설명과 아래 terrminal을 사용하여 ipa를 생성하는 동안 전달할 매개 변수를 제공했습니다.

  1. 터미널에 MyApp.xcodeproject 파일이 들어있는 폴더로 이동하십시오

  2. 아래 주어진 명령을 사용하면 응용 프로그램의 모든 대상을 얻을 수 있습니다

    /usr/bin/xcodebuild -list 
    
  3. 위 명령을 실행하면 생성해야 할 특정 대상을 선택해야하는 대상 목록이 표시됩니다.

    /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. 선택한 출력 디렉토리 " $ {OUTDIR} " 에서 ipa가 생성됩니다.

Xcode 8 :


IPA 형식 :

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

프로비저닝 프로파일 MyMobileApp 배포 프로파일을 사용하여 MyMobileApp.xcarchive 아카이브를 IPA 파일로 MyMobileApp.ipa 경로에 내 보냅니다.

APP 형식 :

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

응용 프로그램 응용 프로그램 양이온 서명 ID 개발자 ID 응용 프로그램 : 내 팀을 사용하여 MyMacApp.xcarchive 아카이브를 PKG 파일로 MyMacApp.pkg 경로로 내 보냅니다. 설치 프로그램 서명 ID 개발자 ID 설치 프로그램 : 내 팀은 내 보낸 패키지에 서명하는 데 내재적으로 사용됩니다.

Xcodebuild 매뉴얼 페이지


프로젝트 루트가있는 폴더로 이동하여 다음을 수행하십시오.

xcodebuild -project projectname -activetarget -activeconfiguration archive

한 단계 더 나아가 Xcode 7 명령 줄을 통해 iTunesConnect에 업로드 ! ( .ipa올바른 릴리스 프로파일로 서명 된 서명 및 서명 ID 로 시작한다고 가정 하십시오.)

altoolApplication Loader의 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바로 애플. 암호는 선택 사항이며 명령을 해제하면 암호를 묻는 메시지가 나타납니다.

확인 단계에서 앱에 문제가있는 경우 콘솔에서이를 인쇄합니다.

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

Vincent의 답변을 개선하기 위해 스크립트를 작성했습니다 xcodearchive
. 명령 행을 통해 프로젝트를 아카이브 (ipa 생성) 할 수 있습니다. 그것을 xcodebuild명령 의 여동생처럼 생각 하지만 보관하십시오.

코드는 github에서 사용할 수 있습니다 : http://github.com/gcerquant/xcodearchive


스크립트의 한 가지 옵션은 타임 스탬프가 지정된 아카이브에서 dSYM 심볼을 아카이브하는 것입니다. 더 이상 기호를 유지하지 않을 이유가 없으며 나중에 수신 할 크래시 로그를 기호화 할 수 없습니다.


xctool을 사용해보십시오 .Apple xcodebuild를 대체하여 iOS 및 Mac 제품을 쉽게 빌드하고 테스트 할 수 있습니다. 지속적인 통합에 특히 도움이됩니다. 몇 가지 추가 기능이 있습니다.

  1. Xcode.app와 동일한 테스트를 실행합니다.
  2. 빌드 및 테스트 결과의 구조화 된 출력.
  3. 인간 친화적 인 ANSI 컬러 출력.

No.3은 매우 유용합니다. 누구든지 xcodebuild의 콘솔 출력을 읽을 수 없다면 보통 5000 + 문자로 한 줄을 줄 수 없습니다. 논문보다 읽기가 더 어렵다.

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


다음 도구를 사용하는 경우 : 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로 업데이트 한 후 엔터프라이즈 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하고 모든 것이 정상으로 돌아 왔습니다.


확인 / 공유 / 제출 옵션을 의미합니까? Xcode에만 해당되며 명령 줄 빌드 도구에는 적합하지 않다고 생각합니다.

영리하게, 나는 당신을 위해 그것을 할 수있는 대본을 만들 수 있다고 확신합니다. ~/Library/MobileDevice/Archived Applications/UUDI 및 plist와 함께 저장된 것 같습니다 . 유효성 검사기를 리버스 엔지니어링하는 것이 어려울 것이라고는 상상할 수 없습니다.

자동화하고 싶은 프로세스는 베타 테스터에게 빌드를 보내는 것입니다. (App Store 제출이 드물게 발생하기 때문에, 특히 새 설명 텍스트를 추가해야하기 때문에 수동으로 처리하는 것은 중요하지 않습니다.) Xcode의 CLI를 사용하여 의사 빌드 + 아카이브를 수행하면 모든 코드 커밋에서 자동 빌드를 트리거 할 수 있습니다. 프로비저닝 프로파일이 포함 된 IPA 파일을 작성하여 테스터에게 이메일로 보냅니다.


명령으로 iOS 프로젝트를 빌드하는 방법은 무엇입니까?

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

&&

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

&&

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


ExportOptions.plist은 (는) 무엇 이죠?

ExportOptions.plist는 Xcode에 필요합니다. ipa 파일을 작성할 때 일부 옵션을 지정할 수 있습니다. Xcode를 사용하여 앱을 보관할 때 친숙한 UI에서 옵션을 선택할 수 있습니다.

중요 : ExportOptions.plist AppStore 에서 릴리스 및 개발 방법이 다릅니다

.

exportOptions_release ~ 메소드 = app-store

개발

exportOptions_dev ~ 방법 = 개발

참고 URL : https://stackoverflow.com/questions/2664885/xcode-build-and-archive-from-command-line



반응형