xcode - कमांड लाइन से एक्सकोड "बिल्ड एंड आर्काइव"




command-line build (12)

एक्सकोड 3.2 बिल्ड मेनू, "बिल्ड एंड आर्काइव" के तहत एक शानदार नई सुविधा प्रदान करता है जो विज्ञापन हॉक वितरण के लिए उपयुक्त एक .ipa फ़ाइल उत्पन्न करता है। आप ऑर्गनाइज़र भी खोल सकते हैं, "संग्रहीत अनुप्रयोग" पर जा सकते हैं, और "iTunesConnect पर एप्लिकेशन सबमिट करें।"

क्या कमांड लाइन (बिल्ड स्क्रिप्ट के हिस्से के रूप में) से "बिल्ड और आर्काइव" का उपयोग करने का कोई तरीका है? मुझे लगता है कि xcodebuild किसी भी तरह शामिल होगा, लेकिन man पेज इस बारे में कुछ भी नहीं कहता है।

अद्यतन माइकल Grinich स्पष्टीकरण का अनुरोध किया; यहां आप वास्तव में कमांड लाइन बिल्ड के साथ क्या नहीं कर सकते हैं, विशेषताओं के साथ आप "बिल्ड और आर्काइव" के बाद केवल एक्सकोड के ऑर्गनाइज़र के साथ ही कर सकते हैं।

  1. बीटा टेस्टर्स के साथ अपना आईपीए साझा करने के लिए आप "एप्लिकेशन साझा करें ..." पर क्लिक कर सकते हैं। चूंकि गिलाउम नीचे बताता है, कुछ एक्सकोड जादू के कारण, इस आईपीए फ़ाइल को अलग से वितरित .मोबाइलप्रोविजन फ़ाइल की आवश्यकता नहीं होती है जो बीटा टेस्टर्स को स्थापित करने की आवश्यकता होती है; वह जादुई है। कोई कमांड लाइन स्क्रिप्ट नहीं कर सकती है। उदाहरण के लिए, एरिक्स की स्क्रिप्ट (1 मई को प्रस्तुत) उस आवश्यकता को पूरा नहीं करती है।
  2. सबसे महत्वपूर्ण बात यह है कि, बीटा ने एक बिल्ड का परीक्षण करने के बाद, आप "आईट्यून्स कनेक्ट पर एप्लिकेशन जमा करें" पर क्लिक कर सकते हैं, जो कि इसे पुनर्निर्माण के बिना, आपके द्वारा परीक्षण किए जाने वाले बहुत ही बाइनरी ऐप्पल के लिए बिल्कुल समान बनाता है। कमांड लाइन से यह असंभव है, क्योंकि ऐप पर हस्ताक्षर करना निर्माण प्रक्रिया का हिस्सा है; आप विज्ञापन हॉक बीटा परीक्षण के लिए बिट्स पर हस्ताक्षर कर सकते हैं या आप उन्हें ऐप स्टोर में जमा करने के लिए साइन इन कर सकते हैं, लेकिन दोनों नहीं। कमांड लाइन पर बनाया गया कोई भी आईपीए फोन पर बीटा परीक्षण नहीं किया जा सकता है और फिर सीधे ऐप्पल को सबमिट किया जा सकता है।

मैं किसी के साथ आने और मुझे गलत साबित करने के लिए प्यार करता हूं: ये दोनों सुविधाएं एक्सकोड जीयूआई में बहुत अच्छी काम करती हैं और कमांड लाइन से दोहराया नहीं जा सकता है।


एक्सकोड 8:

आईपीए प्रारूप:

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

प्रावधान प्रोफ़ाइल MyMobileApp वितरण प्रोफ़ाइल का उपयोग कर MyMobileApp.ipa पथ पर आईपीए फ़ाइल के रूप में MyMobileApp.xcarchive संग्रह को निर्यात करता है।

एपीपी प्रारूप:

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

एप्लाइ-कैशन एप्लिकेशन कैशन साइनिंग पहचान का उपयोग कर MyMacApp.pkg पथ पर एक PKG फ़ाइल के रूप में संग्रह MyMacApp.xcarchive को निर्यात करता है डेवलपर आईडी अनुप्रयोग: मेरी टीम। संस्थापक हस्ताक्षर पहचान डेवलपर आईडी इंस्टॉलर: मेरी टीम का निर्यात निर्यात पैकेज पर हस्ताक्षर करने के लिए किया जाता है।

एक्सकोडबिल्ड मैन पेज


xctool आज़माएं, यह ऐप्पल के xcodebuild के प्रतिस्थापन है जो आईओएस और मैक उत्पादों का निर्माण और परीक्षण करना आसान बनाता है। यह निरंतर एकीकरण के लिए विशेष रूप से सहायक है। इसमें कुछ अतिरिक्त विशेषताएं हैं:

  1. Xcode.app के समान परीक्षण चलाता है।
  2. निर्माण और परीक्षण परिणामों के संरचित उत्पादन।
  3. मानव-अनुकूल, एएनएसआई-रंगीन आउटपुट।

संख्या 3 बेहद उपयोगी है। मैं नहीं करता कि कोई भी xcodebuild के कंसोल आउटपुट को पढ़ सकता है, मैं नहीं कर सकता, आमतौर पर यह मुझे 5000+ अक्षरों के साथ एक पंक्ति देता है। एक थीसिस पेपर से पढ़ने के लिए भी मुश्किल है।

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


आप वैध / शेयर / जमा विकल्प का मतलब है? मुझे लगता है कि वे एक्सकोड के लिए विशिष्ट हैं, और कमांड लाइन निर्माण उपकरण के लिए उपयुक्त नहीं हैं।

कुछ चतुरता के साथ, मैं शर्त लगाता हूं कि आप इसे करने के लिए एक स्क्रिप्ट बना सकते हैं। ऐसा लगता है कि वे सिर्फ ~/Library/MobileDevice/Archived Applications/ मोबाइलडिवाइस ~/Library/MobileDevice/Archived Applications/ यूयूडीआई और एक प्लिस्ट के साथ ~/Library/MobileDevice/Archived Applications/ । मैं कल्पना नहीं कर सकता कि यह वैधता इंजीनियर को रिवर्स करना मुश्किल होगा।

जिस प्रक्रिया में मुझे दिलचस्पी है, वह बीटा टेस्टर्स को बिल्ड भेज रहा है। (चूंकि ऐप स्टोर सबमिशन अकसर होता है, इसलिए मुझे इसे मैन्युअल रूप से करने में कोई फर्क नहीं पड़ता है, खासकर जब से मुझे अक्सर नया विवरण टेक्स्ट जोड़ना पड़ता है।) एक्सकोड के सीएलआई का उपयोग करके एक छद्म बिल्ड + आर्काइव करके, मैं प्रत्येक कोड प्रतिबद्धता से स्वचालित बिल्ड को ट्रिगर कर सकता हूं, एम्बेडेड प्रावधान प्रोफाइल के साथ आईपीए फाइलें बनाएं, और इसे परीक्षकों को ईमेल करें।


उस फ़ोल्डर पर जाएं जहां आपकी परियोजना रूट है और:

xcodebuild -project projectname -activetarget -activeconfiguration archive

एक्सकोड 4.2 के साथ आप यह करने के लिए -शेम ध्वज का उपयोग कर सकते हैं:

xcodebuild -scheme <SchemeName> archive

इस आदेश के बाद संग्रह एक्सकोड ऑर्गनाइज़र में दिखाई देगा।


एक्सकोड 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}" 

कुछ हस्ताक्षर मुद्दे के कारण कमांड लॉन्च नहीं किया जा सकता है। लॉग इंगित करता है कि "चेतावनी: पैकेज अनुप्रयोग को बहिष्कृत किया गया है, इसके बजाय xcodebuild -exportArchive उपयोग करें।

तो मैं xcodebuild -exportArchive स्विच xcodebuild -exportArchive और सब कुछ सामान्य हो गया।


मैं विज्ञापन वितरण के लिए आईपीए पैकेज उत्पन्न करने के लिए अपनी खुद की बिल्ड स्क्रिप्ट का उपयोग कर रहा हूं।

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

लिपि संस्करण संख्या भी बढ़ाती है। यदि आवश्यक नहीं है तो आप उस हिस्से को हटा सकते हैं। आशा करता हूँ की ये काम करेगा।


मैंने अनुसरण करने के लिए चरणों का एक संक्षिप्त विवरण दिया है, और नीचे दिए गए क्षेत्र का उपयोग करके आईपीए उत्पन्न करते समय पास करने के लिए पैरामीटर दिए गए हैं:

  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. आईपीए चयनित आउटपुट निर्देशिका " $ {OUTDIR} " पर जेनरेट की जाएगी

यदि आप अगले टूल का उपयोग करते हैं: 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}"

source


विन्सेंट के जवाब पर सुधार करते हुए, मैंने ऐसा करने के लिए एक स्क्रिप्ट लिखी: xcodearchive
यह आपको कमांड लाइन के माध्यम से अपनी परियोजना को संग्रहित करने (एक आईपीए उत्पन्न) करने की अनुमति देता है। इसके बारे में xcodebuild कमांड की बहन की तरह सोचें, लेकिन संग्रह के लिए।

कोड github पर उपलब्ध है: http://github.com/gcerquant/xcodearchive


स्क्रिप्ट का एक विकल्प एक टाइमस्टैम्प संग्रह में डीएसवाईएम प्रतीकों के संग्रह को सक्षम करना है। प्रतीकों को और नहीं रखने का कोई बहाना नहीं है, और आप बाद में प्राप्त होने वाले क्रैश लॉग का प्रतीक नहीं कर पाएंगे।


हमने एक्सकोड 4.2.1 के साथ एक आईपैड ऐप विकसित किया और ओटीए वितरण के लिए हमारे निरंतर एकीकरण (जेनकींस) में निर्माण को एकीकृत करना चाहता था। यहां समाधान है जिसके साथ मैं आया था:

# 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

फिर जेनकींस हमारे वेबसर्वर को आईपीए, प्लेस्ट और एचटीएमएल फाइल अपलोड करता है।

यह प्लास्ट टेम्पलेट है:

<?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 उपकरण - एक्सपोर्टपोर्ट फ्लैग ( एक्सकोड 5 के रूप में) के साथ संग्रह उत्पादों का निर्माण और निर्यात कर सकता है। एक्सकोड ऑर्गनाइज़र यूआई के माध्यम से निर्यात चरण पहले ही संभव था।

पहले अपने ऐप को संग्रहित करें:

xcodebuild -scheme <scheme name> archive

$ARCHIVE_PATH ( .xcarchive फ़ाइल का पथ) दिया गया है, ऐप को निम्न में से किसी एक के साथ संग्रह से निर्यात करें:

आईओएस। आईपीए फ़ाइल:

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

मैक .एप फ़ाइल:

xcodebuild -exportArchive -exportFormat app -archivePath "$ARCHIVE_PATH" -exportPath "myApp.app" -exportSigningIdentity "Developer ID Application: My Software Company"

दोनों आदेशों में -exportProvisioningProfile और -exportSigningIdentity तर्क वैकल्पिक हैं। semantics पर विवरण के लिए man xcodebuild । इन उदाहरणों में, आईओएस बिल्ड के लिए प्रावधान प्रोफाइल ने एडहोक वितरण प्रावधान प्रोफ़ाइल निर्दिष्ट की है, और मैक ऐप के लिए हस्ताक्षर पहचान ने तृतीय पक्ष एप्लिकेशन (यानी मैक ऐप स्टोर के माध्यम से वितरित नहीं) के रूप में निर्यात के लिए डेवलपर आईडी निर्दिष्ट की है।







build