MacOS Installer पैकेज बनाना जो Developer ID तैयार हो


188

नोट: यह केवल OS X इंस्टालर पैकेजों के लिए है, मैक ऐप स्टोर में जमा करने के लिए पैकेज विभिन्न नियमों का पालन करते हैं।

माउंटेन लायन के गेटकीपर की वजह से आखिरकार मुझे अपने पैकेजमेकर को खलिहान के पीछे स्क्रिप्ट बनाने और उसे शूट करना पड़ा । पैकेजमेकर को पहले ही Xcode से हटा दिया गया था और "Xcode के लिए सहायक उपकरण" में स्थानांतरित कर दिया गया था, इसलिए उम्मीद है कि इसे जल्द ही भुला दिया जाएगा।

सवाल यह है कि मैं का उपयोग करते हैं pkgbuild, productbuildऔर pkgutilइसे बदलना?


तो मुझे लगता है कि पैकेजमेकर के साथ समस्या माउंटेन लायन पर गेटकीपर के साथ उपयोग के लिए pkg फाइलों पर ठीक से हस्ताक्षर करने में असमर्थता है?
जेसन

1
यह संभव है, लेकिन पैकेजमेकर हमेशा छोटी गाड़ी में नरक होता है, और मैक ओएस एक्स 10.6 स्नो लेपर्ड के साथ पदावनत हो जाता है। यह आपको नए उपकरणों से परिचित होने के लिए लंबे समय में समय की बचत करेगा।
23

@ कैटेलन: क्या आपके पास एक आधिकारिक लिंक है जो कहता है कि पैकेजमेकर को 10.6 पर पदावनत कर दिया गया है?
कार्ल

2
@carleeto: यह कभी भी अपवित्र होने की घोषणा नहीं की गई थी, बस Xcode से हटा दिया गया था और अंततः बर्मीज़ रक्षक की तरह "गायब" हो गया।
बग

5
Xcode 4.6 रिलीज़ नोट: पैकेज मेकर का अपचयन adcdownload.apple.com/Developer_Tools/xcode_4.6/……
catlan

जवाबों:


343

हमारे उदाहरण प्रोजेक्ट में दो निर्मित लक्ष्य हैं: HelloWorld.app और हेल्पर.app। हम प्रत्येक के लिए एक घटक पैकेज बनाते हैं और उन्हें एक उत्पाद संग्रह में जोड़ते हैं ।

एक घटक पैकेज में OS X इंस्टालर द्वारा स्थापित किया जाने वाला पेलोड शामिल है। हालांकि एक घटक पैकेज को अपने दम पर स्थापित किया जा सकता है, इसे आमतौर पर उत्पाद संग्रह में शामिल किया जाता है ।

हमारे उपकरण: pkgbuild , productbuild , और pkgutil

एक सफल "बिल्ड एंड आर्काइव" के बाद टर्मिनल में $ BUILT_PRODUCT_DIR खोलें।

$ cd ~/Library/Developer/Xcode/DerivedData/.../InstallationBuildProductsLocation
$ pkgbuild --analyze --root ./HelloWorld.app HelloWorldAppComponents.plist
$ pkgbuild --analyze --root ./Helper.app HelperAppComponents.plist

इससे हमें कंपोनेंट-प्लिस्ट मिलता है, आपको "कंपोनेंट प्रॉपर्टी लिस्ट" सेक्शन में वैल्यू डिस्क्रिप्शन मिलता है । pkgbuild -root घटक पैकेज उत्पन्न करता है , यदि आपको किसी भी डिफ़ॉल्ट गुण को बदलने की आवश्यकता नहीं है, तो आप निम्नलिखित कमांड में --component-plist पैरामीटर को छोड़ सकते हैं ।

productbuild - synthesize परिणाम वितरण परिभाषा में

$ pkgbuild --root ./HelloWorld.app \
    --component-plist HelloWorldAppComponents.plist \
    HelloWorld.pkg
$ pkgbuild --root ./Helper.app \
    --component-plist HelperAppComponents.plist \
    Helper.pkg
$ productbuild --synthesize \
    --package HelloWorld.pkg --package Helper.pkg \
    Distribution.xml 

में Distribution.xml आप शीर्षक, पृष्ठभूमि, स्वागत, रीडमी, लाइसेंस, और इतने पर जैसी चीज़ों को बदल सकते हैं। आप अपने घटक पैकेज और वितरण परिभाषा को इस आदेश के साथ उत्पाद संग्रह में बदलते हैं :

$ productbuild --distribution ./Distribution.xml \
    --package-path . \
    ./Installer.pkg

मैं देख लेने की सलाह देता हूं यह देखने के लिए कि क्या संभव है iTunes Installers Distribution.xml हैं। आप "iTunes.pkg इंस्टॉल करें" को इसके साथ निकाल सकते हैं:

$ pkgutil --expand "Install iTunes.pkg" "Install iTunes"

चलो इसे एक साथ रखा

मेरे पास आमतौर पर मेरे प्रोजेक्ट में पैकेज नाम का एक फोल्डर होता है जिसमें डिस्ट्रीब्यूशन.एक्सएमएल, कंपोनेंट-प्लिस्ट, रिसोर्सेज और स्क्रिप्ट जैसी चीजें शामिल होती हैं।

"जनरेट पैकेज" नाम से एक रन स्क्रिप्ट बिल्ड फेज जोड़ें , जो इंस्टॉल करते समय केवल स्क्रिप्ट चलाने के लिए सेट है :

VERSION=$(defaults read "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/Contents/Info" CFBundleVersion)

PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
TMP1_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp1.pkg"
TMP2_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp2"
TMP3_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp3.pkg"
ARCHIVE_FILENAME="${BUILT_PRODUCTS_DIR}/${PACKAGE_NAME}.pkg"

pkgbuild --root "${INSTALL_ROOT}" \
    --component-plist "./Package/HelloWorldAppComponents.plist" \
    --scripts "./Package/Scripts" \
    --identifier "com.test.pkg.HelloWorld" \
    --version "$VERSION" \
    --install-location "/" \
    "${BUILT_PRODUCTS_DIR}/HelloWorld.pkg"
pkgbuild --root "${BUILT_PRODUCTS_DIR}/Helper.app" \
    --component-plist "./Package/HelperAppComponents.plist" \
    --identifier "com.test.pkg.Helper" \
    --version "$VERSION" \
    --install-location "/" \
    "${BUILT_PRODUCTS_DIR}/Helper.pkg"
productbuild --distribution "./Package/Distribution.xml"  \
    --package-path "${BUILT_PRODUCTS_DIR}" \
    --resources "./Package/Resources" \
    "${TMP1_ARCHIVE}"

pkgutil --expand "${TMP1_ARCHIVE}" "${TMP2_ARCHIVE}"

# Patches and Workarounds

pkgutil --flatten "${TMP2_ARCHIVE}" "${TMP3_ARCHIVE}"

productsign --sign "Developer ID Installer: John Doe" \
    "${TMP3_ARCHIVE}" "${ARCHIVE_FILENAME}"

यदि आपको उत्पाद के निर्माण के बाद पैकेज को बदलना नहीं है, तो आप इससे छुटकारा पा सकते हैं pkgutil --expandऔर pkgutil --flattenकदम बढ़ा सकते हैं । इसके अलावा, आप इस्तेमाल कर सकते हैं --sign पर paramenter productbuild बजाय चलाने का productsign

एक OS X इंस्टॉलर साइन इन करें

डेवलपर आईडी इंस्टालर प्रमाणपत्र के साथ पैकेज पर हस्ताक्षर किए जाते हैं जिसे आप डेवलपर प्रमाणपत्र उपयोगिता से डाउनलोड कर सकते हैं ।

वे हस्ताक्षर करने के साथ किया जाता है --sign "Developer ID Installer: John Doe"के पैरामीटर pkgbuild , productbuild या productsign

ध्यान दें कि यदि आप productbuild का उपयोग करके एक हस्ताक्षरित उत्पाद संग्रह बनाने जा रहे हैं , तो घटक संकुल पर हस्ताक्षर करने का कोई कारण नहीं है

डेवलपर प्रमाणपत्र उपयोगिता

सभी तरह: Xcode संग्रह में पैकेज की प्रतिलिपि बनाएँ

Xcode संग्रह में कुछ कॉपी करने के लिए हम रन स्क्रिप्ट बिल्ड चरण का उपयोग नहीं कर सकते हैं । इसके लिए हमें एक स्कीम एक्शन का उपयोग करने की आवश्यकता है।

योजना संपादित करें और पुरालेख का विस्तार करें। फिर पोस्ट-एक्शन पर क्लिक करें और एक नया रन स्क्रिप्ट एक्शन जोड़ें :

Xcode 6 में:

#!/bin/bash

PACKAGES="${ARCHIVE_PATH}/Packages"

PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
ARCHIVE_FILENAME="$PACKAGE_NAME.pkg"
PKG="${OBJROOT}/../BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"

if [ -f "${PKG}" ]; then
    mkdir "${PACKAGES}"
    cp -r "${PKG}" "${PACKAGES}"
fi

Xcode 5 में, PKGइसके बजाय इस मान का उपयोग करें :

PKG="${OBJROOT}/ArchiveIntermediates/${TARGET_NAME}/BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"

यदि आपका संस्करण नियंत्रण Xcode योजना की जानकारी संग्रहीत नहीं करता है, तो मैं सुझाव देता हूं कि इसे अपनी परियोजना में शेल स्क्रिप्ट के रूप में जोड़ा जाए ताकि आप कार्यक्षेत्र से स्क्रिप्ट को पोस्ट-एक्शन में खींचकर कार्रवाई को सरल रूप से बहाल कर सकें।

स्क्रिप्टिंग

स्क्रिप्टिंग के दो अलग-अलग प्रकार हैं: जावास्क्रिप्ट इन डिस्ट्रीब्यूशन डेफिनिशन फाइल्स और शेल स्क्रिप्ट।

व्हाइटबॉक्स में पाए गए शेल लिपियों के बारे में सबसे अच्छा प्रलेखन - पैकेजमेकर हाउ-टू , लेकिन इसे सावधानी से पढ़ें क्योंकि यह पुराने पैकेज प्रारूप को संदर्भित करता है।

अतिरिक्त पढ़ना

ज्ञात समस्याएँ और समाधान

गंतव्य चयन फलक

उपयोगकर्ता को केवल एक ही विकल्प के साथ गंतव्य चयन विकल्प के साथ प्रस्तुत किया जाता है - "इस कंप्यूटर के सभी उपयोगकर्ताओं के लिए इंस्टॉल करें"। विकल्प नेत्रहीन रूप से चयनित दिखाई देता है, लेकिन उपयोगकर्ता को स्थापना के साथ आगे बढ़ने के लिए उस पर क्लिक करने की आवश्यकता होती है, जिससे कुछ भ्रम होता है।

इंस्टॉलर बग दिखाने वाला उदाहरण

सेब प्रलेखन उपयोग करने की सलाह देता है <domains enable_anywhere ... /> करता है, लेकिन यह नए और अधिक छोटी गाड़ी गंतव्य चयन फलक को चलाता है जिसे Apple अपने किसी भी पैकेज में उपयोग नहीं करता है।

डेप्रिसिएट का उपयोग करने से <options rootVolumeOnly="true" />आपको पुराना डेस्टिनेशन सेलेक्ट पेन मिलेगा। उदाहरण पुराने गंतव्य चयन फलक को दिखा रहा है


आप आइटम को वर्तमान उपयोगकर्ता के होम फ़ोल्डर में स्थापित करना चाहते हैं।

संक्षिप्त उत्तर: यह कोशिश मत करो!

लंबे उत्तर: वास्तव में; यह कोशिश मत करो! इंस्टालर की समस्याएं और समाधान पढ़ें । आप जानते हैं कि मैंने इसे पढ़कर भी क्या किया? मैं इसे आजमाने के लिए काफी बेवकूफ था। अपने आप को बताने से मुझे यकीन है कि उन्होंने 10.7 या 10.8 में मुद्दे तय किए हैं।

सबसे पहले मैंने समय-समय पर उपर्युक्त गंतव्य चयन फलक बग को देखा। मुझे रोकना चाहिए था, लेकिन मैंने इसे नजरअंदाज कर दिया। यदि आप समर्थन ई-मेल का जवाब देने वाले अपने सॉफ़्टवेयर को जारी करने के बाद सप्ताह नहीं बिताना चाहते हैं, तो उन्हें एक बार अच्छे नीले चयन पर क्लिक करना होगा।

अब आप सोच रहे हैं कि आपके उपयोगकर्ता पैनल का पता लगाने के लिए पर्याप्त स्मार्ट हैं, क्या आप नहीं हैं? अच्छी तरह से यहाँ घर फ़ोल्डर स्थापना के बारे में एक और बात है, वे काम नहीं करते हैं!

मैंने इसे दो हफ्तों तक लगभग 10 अलग-अलग मशीनों पर अलग-अलग ओएस संस्करणों के साथ परीक्षण किया और क्या नहीं, और यह कभी विफल नहीं हुआ। इसलिए मैंने इसे भेज दिया। रिलीज के एक घंटे के भीतर मैं उन उपयोगकर्ताओं से वापस दिल मिला जो इसे स्थापित नहीं कर सके। लॉग उन मुद्दों की अनुमति देने के संकेत देता है जिन्हें आप ठीक करने में सक्षम नहीं हैं।

तो चलिए इसे एक बार फिर से दोहराते हैं: हम होम फोल्डर इंस्टालेशन के लिए इंस्टॉलर का उपयोग नहीं करते हैं!


वेलकम, रीड-मी, लाइसेंस और निष्कर्ष के लिए RTFD द्वारा स्वीकार नहीं किया जाता है productbuild

आरटीएफडी फ़ाइलों के साथ शुरुआत से समर्थित इंस्टॉलर, छवियों के साथ सुंदर स्वागत स्क्रीन बनाने के लिए, लेकिन उत्पाद निर्माण उन्हें स्वीकार नहीं करता है।

वर्कअराउंड: एक डमी आरटीएफ फ़ाइल का उपयोग करें और बाद में इसे पैकेज में बदल दें productbuild

नोट: आप रेटिना छवियों को RTFD फ़ाइल के अंदर भी रख सकते हैं। इसके लिए मल्टी-इमेज टिफ़ फ़ाइलों का उपयोग करें tiffutil -cat Welcome.tif Welcome_2x.tif -out FinalWelcome.tif:। अधिक जानकारी


जब स्थापना एक साथ किया जाता है एक आवेदन शुरू BundlePostInstallScriptPath स्क्रिप्ट:

#!/bin/bash

LOGGED_IN_USER_ID=`id -u "${USER}"`

if [ "${COMMAND_LINE_INSTALL}" = "" ]
then
    /bin/launchctl asuser "${LOGGED_IN_USER_ID}" /usr/bin/open -g PATH_OR_BUNDLE_ID
fi

exit 0

एप्लिकेशन को उपयोगकर्ता के रूप में लॉग इन करना महत्वपूर्ण है, इंस्टॉलर उपयोगकर्ता के रूप में नहीं। यह लॉन्चर एक्ट्यूसर यूआईडी पथ के साथ किया जाता है । इसके अलावा हम इसे केवल तब चलाते हैं जब यह इंस्टॉलर टूल या Apple रिमोट डेस्कटॉप के साथ कमांड लाइन इंस्टॉलेशन नहीं होता है ।



9
यह एक उत्कृष्ट ट्यूटोरियल है, लेकिन पूर्वनिर्मित बंडलों के अस्तित्व को मानता है। यदि मैं, उदाहरण के लिए, /tmpपोस्टफलाइट स्क्रिप्ट में बाद में संसाधित होने वाली एकल फ़ाइल स्थापित करता हूं, तो मैं घटक सूची कैसे तैयार करूं? सभी उपलब्ध दस्तावेज यह मानकर चलते हैं कि डेवलपर ने इसे --analyzeकम से कम शुरुआत में बनाया है।
बग

1
यदि आपको कुछ भी बदलने की आवश्यकता नहीं है, तो Component Property Listआपको चलाने की आवश्यकता नहीं है --analyze। पोस्टप्रोसेसिंग फ़ाइलों के लिए मेरा सुझाव है कि उन सभी को एक pkg में डालें और उस pkg को स्थान पर स्थापित करें /tmp। लेकिन शायद मैं आपके सवाल को गलत समझूं। यदि ऐसा है तो इसे एसओ पर अधिक विस्तृत संस्करण में पोस्ट करें।
19

2
कृपया ध्यान दें कि यह कमांड लाइन के माध्यम से पैकेज बनाने के लिए बिल्कुल कोई मतलब नहीं है, पैकेजिंग ऐप में सभी बग्स से बचने की कोशिश कर रहा है। बल्कि स्टीफन सुद्रे द्वारा "पैकेज" एप्लिकेशन का उपयोग करने के बारे में मेरी टिप्पणी नीचे देखें जो आपके लिए सभी समस्याओं को हल करता है!
ब्रैम डी जोंग

5
@BramdeJong "कोई मतलब नहीं है"। मैं असहमत हूं। Apple कमांड लाइन टूल को बनाए रखता है। संकुल एक तृतीय-पक्ष ऐप है जो समुदाय समर्थित नहीं है और भविष्य में टूट सकता है यदि Apple कुछ कठोर बदलता है। मेरे लिए, मैं इसके बजाय कमांड लाइन तकनीक को जानता हूं ताकि, अगर Apple कुछ कठोर परिवर्तन करता है, तो मैं चालू रख सकता हूं।
Volomike

5
$ pkgbuild --root ./HelloWorld.app गलत है (यह मानते हुए कि .app एक वास्तविक ऐप बंडल है)। pkgbuild एक गंतव्य रूट पर संचालित होता है: यानी: एक फ़ोल्डर जो एक बंडल बनाता है जो xcode टूल चेन द्वारा उत्पन्न होता है। इसलिए pkgbuild करने का तर्क बंडल के उस फ़ोल्डर के लिए पथ है जिसे हम पैकेज करना चाहते हैं। एक पैकेज में यह सही परिणाम प्राप्त करने में विफल रहता है जिसमें सिर्फ ऐप सामग्री फ़ोल्डर होता है। यह एक वास्तविक ऐप बंडल के रूप में स्थापित नहीं होगा। सस्ता घटक घटक में है। अगर इसमें रूट बंडलिवबंडलेपथ प्रविष्टि शामिल नहीं है जो ऐप बंडल को निर्दिष्ट करता है तो आपने खराब कर दिया है।
जोनाथन मिशेल

185

स्टीफन सुडर द्वारा एक बहुत ही दिलचस्प एप्लिकेशन है जो आपके लिए यह सब करता है, कमांड लाइन से स्क्रिप्ट करने योग्य / समर्थन इमारत है, एक सुपर अच्छा जीयूआई है और मुफ़्त है। दुःख की बात यह है: इसे "संकुल" कहा जाता है जो Google में खोजना असंभव बनाता है।

http://s.sudre.free.fr/Software/Packages/about.html

काश, मैं अपनी स्क्रिप्ट्स को हैंडीक्राफ्ट करने से पहले इसके बारे में जानता।

पैकेज अनुप्रयोग स्क्रीनशॉट


11
मुझे विश्वास नहीं हो रहा है कि इस पोस्ट में अधिक बिंदु नहीं हैं। वह सॉफ्टवेयर अद्भुत है और यह कमांड लाइन से निर्माण का समर्थन करता है।
सेसर मेंडोज़ा

1
किसी ने इस उपकरण के साथ एक पैकेज पर हस्ताक्षर करने की कोशिश की? मुझे सक्रिय करने के लिए "सेट सर्टिफिकेट" मेनू आइटम नहीं मिल सकता है ....
GTAE86

2
@ user283182: बहुत देर से टक्कर, निश्चित रूप से आप पहले ही इसका पता लगा चुके हैं, लेकिन शायद यह दूसरों की मदद करेगा - मुझे लगता है कि आप जिस मुद्दे का सामना कर रहे हैं, वह [मैक ऐप स्टोर समीक्षा दिशानिर्देशों] ( developer.apple.com/app- ) में विस्तृत है। स्टोर / समीक्षा / दिशानिर्देश / मैक /… ), नियम 2.14: "ऐप्स को पैक किया जाना चाहिए और Xcode में शामिल Apple की पैकेजिंग तकनीकों का उपयोग करके प्रस्तुत किया जाना चाहिए - किसी भी तीसरे पक्ष के इंस्टॉलर की अनुमति नहीं है।"
बड़े बुजुर्ग

4
काश यह एक पेड ऐप होता और डेवलपर लगातार अपडेट और पैचिंग कर रहा होता। अगर आप जल्दी से अपने ऐप को तैनात करना चाहते हैं, तो Package.app बहुत बढ़िया है। अवलोकन को स्थापित करने, अपनी परियोजना को स्थापित करने और इंस्टॉल करने योग्य पैकेज बनाने में मुझे कुल 3 मिनट का समय लगा। स्टीफन के लिए बड़े यश।
निकोले क्रिस्टोव

1
यह ऐप कमाल का है!
स्पेंसर मुलर डिनिज

3

बंडल या प्लगइन के लिए पैकेज इंस्टॉलर बनाने की कोशिश कर रहे लोगों के लिए FYI करना, यह आसान है:

pkgbuild --component "Color Lists.colorPicker" --install-location ~/Library/ColorPickers ColorLists.pkg

2
FYI करें, स्वागत स्क्रीन, लाइसेंस वगैरह के साथ .pkg बनाने का वास्तविक इंस्टॉलर बनाने में अंतर है।
catlan

हाँ, मुझे पता है, मैंने इसे यहाँ रखा क्योंकि मुझे प्लगइन के लिए pkg इंस्टॉलर बनाने का संदर्भ नहीं मिला।
gngrwzrd

इससे मुझे रोल मिला। ग्राउंडिंग देने के लिए बस न्यूनतम।
uchuugaka

3

A +1 स्वीकृत उत्तर:

इंस्टॉलर में गंतव्य चयन

यदि डोमेन (उर्फ गंतव्य) चयन उपयोगकर्ता डोमेन और सिस्टम डोमेन के बीच वांछित है, तो <domains enable_anywhere="true">निम्नलिखित उपयोग करने की कोशिश करने के बजाय :

<domains enable_currentUserHome="true" enable_localSystem="true"/>

enable_currentUserHome के अंतर्गत एप्लिकेशन एप्लिकेशन इंस्टॉल करता है ~/Applications/और एप्लिकेशन को इसके अंतर्गत इंस्टॉल करने की enable_localSystemअनुमति देता है/Application

मैंने इसे एल कैपिटन 10.11.6 (15G1217) में आज़माया है और यह 1 देव मशीन और 2 अलग-अलग वीएम में मैंने काम करने की पूरी कोशिश की है।


यह अच्छी तरह से काम करता है, लेकिन एक GOT'CHA के साथ: यदि आप पहले प्रति-उपयोगकर्ता स्थापित करते हैं, तो प्रति-मशीन स्थापित करें, इंस्टॉल उपयोगकर्ता-dir में होगा, मशीन-dir नहीं, बल्कि sudo- अधिकारों के साथ। इसके विपरीत नहीं है: आप प्रति-मशीन स्थापित कर सकते हैं, और फिर प्रति-उपयोगकर्ता बाद में और इसे दोनों स्थानों पर रख सकते हैं।
डाहल

@TerjeDahl यह इसलिए है क्योंकि पोस्ट इंस्टॉलेशन बंडल को स्थान पर ले जाया जाता है वही बंडल आईडी इंस्टॉलर द्वारा पहले स्थापित किया गया था (और इंस्टॉलर को पता है कि)। इसे मैनिफ़ेस्ट फ़ाइल में कुछ सेटिंग्स द्वारा रोका जा सकता है जो मुझे अभी याद नहीं हैं।
पॉट्नप

@ PnotNP आह। यदि आप उन सेटिंग के साथ वापस आने के लिए इतने दयालु होंगे यदि आप याद रख सकते हैं, तो यह बहुत अच्छा होगा!
टेर्जे डाहल

2

यहां एक बिल्ड स्क्रिप्ट है जो एक बिल्ड रूट से एक हस्ताक्षरित इंस्टॉलर पैकेज बनाता है।

#!/bin/bash
# TRIMCheck build script
# Copyright Doug Richardson 2015
# Usage: build.sh
#
# The result is a disk image that contains the TRIMCheck installer.
#

DSTROOT=/tmp/trimcheck.dst
SRCROOT=/tmp/trimcheck.src

INSTALLER_PATH=/tmp/trimcheck
INSTALLER_PKG="TRIMCheck.pkg"
INSTALLER="$INSTALLER_PATH/$INSTALLER_PKG"

#
# Clean out anything that doesn't belong.
#
echo Going to clean out build directories
rm -rf build $DSTROOT $SRCROOT $INSTALLER_PATH
echo Build directories cleaned out


#
# Build
#
echo ------------------
echo Installing Sources
echo ------------------
xcodebuild -project TRIMCheck.xcodeproj installsrc SRCROOT=$SRCROOT || exit 1

echo ----------------
echo Building Project
echo ----------------
pushd $SRCROOT
xcodebuild -project TRIMCheck.xcodeproj -target trimcheck -configuration Release install || exit 1
popd

echo ------------------
echo Building Installer
echo ------------------
mkdir -p "$INSTALLER_PATH" || exit 1

echo "Runing pkgbuild. Note you must be connected to Internet for this to work as it"
echo "has to contact a time server in order to generate a trusted timestamp. See"
echo "man pkgbuild for more info under SIGNED PACKAGES."
pkgbuild --identifier "com.delicioussafari.TRIMCheck" \
    --sign "Developer ID Installer: Douglas Richardson (4L84QT8KA9)" \
    --root "$DSTROOT" \
    "$INSTALLER" || exit 1


echo Successfully built TRIMCheck
open "$INSTALLER_PATH"

exit 0

1
हाँ, pkgbuild एक .pkg इंस्टॉलर बनाता है।
डग रिचर्डसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.