การจัดทำแพคเกจโปรแกรมติดตั้ง macOS ซึ่งเป็นรหัสผู้พัฒนาพร้อม


189

หมายเหตุ: นี่สำหรับแพ็คเกจOS X Installerเท่านั้นแพคเกจสำหรับการส่งไปยังMac App Store เป็นไปตามกฎที่แตกต่างกัน

เนื่องจากผู้รักษาประตูของ Mountain Lion ในที่สุดฉันก็ต้องใช้PackageMakerสร้างสคริปต์ของฉันไว้ด้านหลังโรงนาและยิงมัน PackageMaker ถูกลบออกจาก Xcode แล้วและย้ายไปที่ "Auxiliary Tools for Xcode" ดังนั้นหวังว่ามันจะถูกลืมในไม่ช้า

คำถามคือวิธีที่ฉันจะใช้pkgbuild, productbuildและpkgutilที่จะเปลี่ยนมันได้หรือไม่


ดังนั้นฉันสมมติว่าปัญหากับ packagemaker ไม่สามารถลงนามไฟล์ pkg อย่างถูกต้องเพื่อใช้กับ gatekeeper บน Mountain Lion ได้หรือไม่?
JasonZ

1
เป็นไปได้ แต่ PackageMaker มักจะมีรถนรกและเลิกกับ Mac OS X 10.6 Snow Leopard มันจะช่วยคุณประหยัดเวลาในระยะยาวเพียงแค่ทำความคุ้นเคยกับเครื่องมือใหม่
catlan

@catlan: คุณมีลิงค์อย่างเป็นทางการที่บอกว่า packagemaker เลิกใช้แล้วในวันที่ 10.6 หรือไม่?
คาร์ล

2
@carleeto: มันไม่เคยประกาศว่าถูกคัดออกเพียงแค่ลบออกจาก Xcode และในที่สุดก็ "หายไป" เหมือนผู้ประท้วงชาวพม่า
ข้อผิดพลาด

5
บันทึกประจำรุ่น Xcode 4.6: การเลิกใช้งานของเครื่องทำแพคเกจadcdownload.apple.com/Developer_Tools/xcode_4.6/…
catlan

คำตอบ:


344

โครงการตัวอย่างของเรามีสองเป้าหมายการสร้าง: HelloWorld.app และ Helper.app เราทำแพคเกจส่วนประกอบสำหรับแต่ละและรวมไว้ในที่เก็บสินค้า

แพคเกจองค์ประกอบที่มีน้ำหนักบรรทุกที่จะติดตั้งโดยการติดตั้ง OS X แม้ว่าจะเป็นแพคเกจองค์ประกอบที่สามารถติดตั้งบนของตัวเองก็มักจะรวมอยู่ในที่เก็บสินค้า

เครื่องมือของเรา: pkgbuild , productbuildและpkgutil

หลังจาก "สร้างและเก็บถาวร" สำเร็จให้เปิด $ BUILT_PRODUCTS_DIR ในเทอร์มินัล

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

นี้ทำให้เรามีองค์ประกอบ 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คุณสามารถเปลี่ยนแปลงสิ่งต่าง ๆ เช่นชื่อพื้นหลังยินดีต้อนรับ readme ใบอนุญาตและอื่น ๆ คุณเปลี่ยนแพ็กเกจคอมโพเนนต์ของคุณและนิยามการแจกจ่ายด้วยคำสั่งนี้เป็นไฟล์เก็บถาวรผลิตภัณฑ์ :

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

ฉันแนะนำให้ดูที่iTunes Installers Distribution.xml เพื่อดูว่าอะไรเป็นไปได้ คุณสามารถแตก "ติดตั้ง iTunes.pkg" ด้วย:

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

มารวมกัน

ฉันมักจะมีโฟลเดอร์ชื่อ Package ในโครงการของฉันซึ่งรวมถึงสิ่งต่าง ๆ เช่น Distribution.xml, ส่วนประกอบ, ทรัพยากรและสคริปต์

เพิ่มRun Script Build Phaseชื่อ "Generate Package" ซึ่งถูกตั้งค่าเป็นRun script เมื่อติดตั้งเท่านั้น :

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}"

หากคุณไม่ได้มีการเปลี่ยนแพคเกจหลังจากที่สร้างขึ้นด้วยproductbuildคุณสามารถกำจัดpkgutil --expandและpkgutil --flattenขั้นตอน นอกจากนี้คุณสามารถใช้--sign paramenter บนproductbuildแทนที่จะวิ่งproductsign

ลงชื่อเข้าใช้ตัวติดตั้ง OS X

แพคเกจถูกเซ็นชื่อด้วยDeveloper ID Installerใบรับรองที่คุณสามารถดาวน์โหลดได้จากนักพัฒนาซอฟต์แวร์รับรองยูทิลิตี้

พวกเขาจะทำการลงนามกับ--sign "Developer ID Installer: John Doe"พารามิเตอร์ของpkgbuild , productbuildหรือ productsign

โปรดทราบว่าถ้าคุณกำลังจะสร้างลงนามสินค้าที่เก็บโดยใช้ productbuild มีเหตุผลที่จะลงนามในไม่มีแพคเกจคอมโพเนนต์

Developer Certificate Utility

ตลอดทาง: คัดลอกแพ็คเกจลงใน Xcode Archive

ในการคัดลอกบางสิ่งบางอย่างเข้าไปใน Xcode เอกสารเก่าเราไม่สามารถใช้เฟสรูปร่างเรียกใช้สคริปต์ สำหรับสิ่งนี้เราต้องใช้ Scheme Action

แก้ไข Scheme และขยายที่เก็บถาวร จากนั้นคลิกโพสต์แอ็คชันและเพิ่มแอ็คชันเรียกใช้สคริปต์ใหม่ :

ใน 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 Scheme ฉันแนะนำให้เพิ่มเป็น shell script ในโครงการของคุณเพื่อให้คุณสามารถกู้คืนการกระทำได้โดยการลากสคริปต์จากพื้นที่ทำงานไปยัง post-action

การเขียนสคริปต์

การสร้างสคริปต์มีสองประเภท: JavaScript ในไฟล์นิยามการแจกจ่ายและเชลล์สคริปต์

เอกสารที่ดีที่สุดเกี่ยวกับ Shell Scripts ที่พบในWhiteBox - PackageMaker How-toแต่อ่านด้วยความระมัดระวังเพราะมันอ้างถึงรูปแบบแพคเกจเก่า

อ่านเพิ่มเติม

ปัญหาที่ทราบและวิธีแก้ปัญหา

ปลายทางเลือกบานหน้าต่าง

ผู้ใช้มีตัวเลือกการเลือกปลายทางโดยมีเพียงตัวเลือกเดียว - "ติดตั้งสำหรับผู้ใช้ทุกคนของคอมพิวเตอร์เครื่องนี้" ตัวเลือกนั้นปรากฏขึ้นให้เลือกด้วยสายตา แต่ผู้ใช้จำเป็นต้องคลิกเพื่อดำเนินการติดตั้งต่อไปทำให้เกิดความสับสน

ตัวอย่างการแสดงข้อผิดพลาดของตัวติดตั้ง

เอกสารประกอบของแอปเปิ้ลแนะนำให้ใช้ <domains enable_anywhere ... />แต่สิ่งนี้จะเป็นตัวกระตุ้นให้เลือกบานหน้าต่างปลายทางที่ใหม่กว่าซึ่งแอปเปิ้ลไม่ได้ใช้ในแพ็คเกจใด ๆ

การใช้ค่าเสื่อมราคา<options rootVolumeOnly="true" />จะให้ปลายทางเลือกบานหน้าต่างเก่าแก่คุณ ตัวอย่างที่แสดงปลายทางเก่าเลือกบานหน้าต่าง


คุณต้องการติดตั้งรายการลงในโฟลเดอร์โฮมของผู้ใช้ปัจจุบัน

คำตอบสั้น ๆ : อย่าลอง!

คำตอบยาว: จริง ๆ ; อย่าลอง! อ่านปัญหาและวิธีแก้ไขตัวติดตั้งปัญหาการติดตั้งและวิธีการแก้ไขคุณรู้ไหมว่าฉันทำอะไรหลังจากอ่านข้อความนี้? ฉันโง่พอที่จะลอง บอกตัวเองฉันแน่ใจว่าพวกเขาแก้ไขปัญหาใน 10.7 หรือ 10.8

ก่อนอื่นที่ฉันเห็นเป็นครั้งคราวปลายทางที่กล่าวถึงเลือกบานหน้าต่างข้อผิดพลาด ที่ควรจะหยุดฉัน แต่ฉันไม่สนใจมัน หากคุณไม่ต้องการใช้เวลาหนึ่งสัปดาห์หลังจากที่คุณปล่อยซอฟต์แวร์ตอบรับการสนับสนุนทางอีเมลที่พวกเขาต้องคลิกเมื่อเลือกสีน้ำเงินที่ดีอย่าใช้สิ่งนี้

ตอนนี้คุณกำลังคิดว่าผู้ใช้ของคุณฉลาดพอที่จะคิดออกแผงใช่มั้ย ทีนี้นี่คืออีกเรื่องเกี่ยวกับการติดตั้งโฮมโฟลเดอร์พวกเขาไม่ทำงาน!

ฉันทดสอบเป็นเวลาสองสัปดาห์ในเครื่องที่แตกต่างกันประมาณ 10 เครื่องด้วยระบบปฏิบัติการที่แตกต่างกันและสิ่งใดที่มันไม่เคยล้มเหลว ดังนั้นฉันส่งมัน ภายในหนึ่งชั่วโมงของการเปิดตัวฉันเสียใจที่ผู้ใช้ไม่สามารถติดตั้งได้ บันทึกที่บอกใบ้ถึงปัญหาการอนุญาตที่คุณไม่สามารถแก้ไขได้

ลองทำซ้ำอีกครั้ง: เราไม่ได้ใช้ตัวติดตั้งสำหรับการติดตั้งโฟลเดอร์บ้าน!


RTFD สำหรับ Welcome, Read-me, License และข้อสรุปไม่เป็นที่ยอมรับ productbuildอ่านฉันใบอนุญาตและข้อสรุปไม่ได้รับการยอมรับจาก

ตัวติดตั้งรองรับตั้งแต่ไฟล์ RTFD เริ่มต้นเพื่อสร้างหน้าจอต้อนรับด้วยรูปภาพ แต่การสร้างผลิตภัณฑ์ไม่ยอมรับ

วิธีแก้ปัญหา: ใช้ไฟล์ dummy rtf และแทนที่ในแพ็กเกจภายในเวลาไม่นาน productbuildทำเสร็จแล้ว

หมายเหตุ: คุณสามารถมีภาพ Retina ภายในไฟล์ RTFD ใช้หลายรูปแบบ TIFF 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

จำเป็นต้องเรียกใช้แอปในฐานะผู้ใช้ที่เข้าสู่ระบบไม่ใช่ในฐานะผู้ใช้โปรแกรมติดตั้ง นี้จะกระทำด้วยlaunchctl asuser เส้นทาง นอกจากนี้เราเพียงเรียกใช้มันเมื่อมันไม่ได้ติดตั้งบรรทัดคำสั่งทำได้ด้วยการติดตั้งเครื่องมือหรือแอปเปิ้ลสก์ท็อประยะไกล



9
นี่คือการสอนที่ยอดเยี่ยม แต่ถือว่าการมีอยู่ของการรวมกลุ่มสำเร็จรูป ตัวอย่างเช่นถ้าฉันติดตั้งไฟล์เดียวลงใน/tmpการดำเนินการภายหลังในสคริปต์ postflight ฉันจะจัดโครงสร้างรายการส่วนประกอบได้อย่างไร เอกสารที่มีทั้งหมดดูเหมือนว่าผู้พัฒนาได้สร้างขึ้นด้วย--analyzeอย่างน้อยในตอนแรก
ข้อผิดพลาด

1
ถ้าคุณไม่จำเป็นต้องมีการเปลี่ยนแปลงอะไรในที่คุณไม่จำเป็นต้องวิ่งComponent Property List --analyzeสำหรับไฟล์ที่ทำการประมวลผลภายหลังผมแนะนำให้วางมันไว้ใน pkg และตั้งค่าตำแหน่งที่ติดตั้ง pkg /tmpไว้ แต่บางทีฉันอาจจะเข้าใจผิดคำถามของคุณ ถ้าเป็นเช่นนั้นโพสต์ไว้ในรายละเอียดเพิ่มเติมเกี่ยวกับ SO
catlan

2
โปรดสังเกตุว่ามันไม่สมเหตุสมผลเลยที่จะสร้างแพ็คเกจผ่านทางบรรทัดคำสั่งพยายามที่จะหนีจากบั๊กทั้งหมดในแอพบรรจุภัณฑ์ ค่อนข้างเห็นความคิดเห็นของฉันด้านล่างในการใช้แอปพลิเคชัน "แพ็คเกจ" โดยStéphane Sudre ซึ่งแก้ปัญหาทั้งหมดให้คุณ!
Bram de Jong

5
@BramdeJong "ไม่มีเหตุผล" ฉันไม่เห็นด้วย. Apple บำรุงรักษาเครื่องมือบรรทัดคำสั่ง แพ็คเกจเป็นแอปของบุคคลที่สามที่ไม่ได้รับการสนับสนุนจากชุมชนและอาจแตกหักในอนาคตหากแอปเปิ้ลเปลี่ยนอะไรบางอย่างที่รุนแรง สำหรับฉันฉันอยากจะรู้เทคนิคบรรทัดคำสั่งเพื่อที่ว่าถ้าแอปเปิ้ลเปลี่ยนอะไรบางอย่างที่รุนแรงฉันก็สามารถวิ่งต่อไปได้
Volomike

5
$ pkgbuild - root ./HelloWorld.app ผิด (สมมติว่า. app เป็นกลุ่มแอปจริง) pkgbuild ทำงานบนรูทปลายทาง: ie: โฟลเดอร์ที่มีบันเดิลที่สร้างโดยกลุ่มเครื่องมือ xcode ดังนั้นอาร์กิวเมนต์ของ pkgbuild คือพา ธ ไปยังโฟลเดอร์ที่มีของชุดข้อมูลที่เราต้องการจัดทำ ไม่สามารถรับผลลัพธ์ที่ถูกต้องในแพ็คเกจที่มีเพียงโฟลเดอร์เนื้อหาแอพ มันจะไม่ติดตั้งเป็นชุดแอปจริง ของแถมอยู่ในส่วนประกอบ หากไม่มีรายการ RootRelativeBundlePath ที่ระบุบันเดิลของแอปแสดงว่าคุณเมาแล้ว
Jonathan Mitchell

185

มีแอปพลิเคชั่นที่น่าสนใจมากอย่างหนึ่งโดยStéphane Sudre ซึ่งทำสิ่งเหล่านี้ให้คุณทั้งหมดเป็นสคริปต์ / รองรับการสร้างจากบรรทัดคำสั่งมี GUI ที่ดีมากและฟรี สิ่งที่น่าเศร้าคือมันเรียกว่า "แพคเกจ" ซึ่งทำให้ไม่สามารถค้นหาได้ใน google

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

ฉันอยากรู้เกี่ยวกับมันก่อนที่ฉันจะเริ่มเขียนสคริปต์ของตัวเอง

ภาพหน้าจอแอปพลิเคชันแพคเกจ


11
ฉันไม่อยากจะเชื่อว่าโพสต์นี้ไม่มีจุดเพิ่มเติม ซอฟต์แวร์นั้นน่าทึ่งและสนับสนุนการสร้างจากบรรทัดคำสั่ง
Cesar Mendoza

1
ทุกคนพยายามลงชื่อแพคเกจด้วยเครื่องมือนี้หรือไม่? ฉันไม่สามารถรับรายการเมนู "ตั้งใบรับรอง" เพื่อเปิดใช้งาน ....
GTAE86

2
@ user283182: ชนช้ามากแน่นอนคุณได้คิดออกแล้ว แต่อาจจะช่วยคนอื่น ๆ - ฉันคิดว่าปัญหาที่คุณเผชิญอยู่นั้นมีรายละเอียดอยู่ใน [Mac App Store Review Guidelines] ( developer.apple.com/app- ร้านค้า / รีวิว / แนวทาง / mac / … ) กฎ 2.14: "แอปต้องได้รับการบรรจุและส่งโดยใช้เทคโนโลยีการบรรจุของ Apple ที่รวมอยู่ใน Xcode - ไม่อนุญาตให้ติดตั้งของบุคคลที่สาม"
ผู้สูงอายุผู้สูงอายุ

4
ฉันหวังว่านี่เป็นแอปที่ต้องชำระเงินและนักพัฒนาซอฟต์แวร์กำลังอัปเดตและแก้ไขอย่างต่อเนื่อง Packages.app ยอดเยี่ยมโดยเฉพาะถ้าคุณต้องการปรับใช้แอปของคุณอย่างรวดเร็ว ฉันใช้เวลาทั้งหมด 3 นาทีในการติดตั้งอ่านภาพรวมตั้งค่าโครงการของฉันและสร้างแพ็คเกจที่ติดตั้งได้ ขอชื่นชมความยิ่งใหญ่ของStéphane
Nikolay Christov

1
แอพนี้ยอดเยี่ยม!
Spencer Müller Diniz

3

FYI สำหรับผู้ที่พยายามสร้างแพ็คเกจติดตั้งสำหรับบันเดิลหรือปลั๊กอินมันเป็นเรื่องง่าย:

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

2
FYI มีความแตกต่างระหว่างการสร้าง. pkg การสร้างตัวติดตั้งจริงพร้อมหน้าจอต้อนรับใบอนุญาตและอื่น ๆ
catlan

อ๋อฉันรู้แล้วฉันวางสิ่งนี้ไว้ที่นี่เพราะฉันไม่พบการอ้างอิงถึงการสร้าง pkg installer สำหรับปลั๊กอิน
gngrwzrd

สิ่งนี้ทำให้ฉันกลิ้ง เพียงขั้นต่ำเพื่อให้ดิน
uchuugaka

3

คำตอบที่ยอมรับ +1:

การเลือกปลายทางในโปรแกรมติดตั้ง

หากต้องการการเลือกโดเมน (aka ปลายทาง) ระหว่างโดเมนผู้ใช้และโดเมนระบบแทนที่จะลอง<domains enable_anywhere="true">ใช้สิ่งต่อไปนี้:

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

enable_currentUserHomeติดตั้งแอปพลิเคชันภายใต้~/Applications/และenable_localSystemอนุญาตให้ติดตั้งแอปพลิเคชันภายใต้/Application

ฉันได้ลองใน El Capitan 10.11.6 (15G1217) และดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์แบบในเครื่อง 1 dev และ VM ที่แตกต่างกัน 2 เครื่องที่ฉันลอง


วิธีนี้ใช้งานได้ดี แต่ด้วย GOT'CHA: หากคุณติดตั้งต่อผู้ใช้ครั้งแรกจากนั้นติดตั้งต่อเครื่องการติดตั้งจะอยู่ใน user-dir ไม่ใช่ machine-dir แต่มีสิทธิ์ sudo ตรงกันข้ามไม่ใช่กรณี: คุณสามารถติดตั้งต่อเครื่องและต่อผู้ใช้หลังจากนั้นและมีในทั้งสองสถานที่
Terje Dahl

@TerjeDahl ใช่นี่เป็นเพราะการติดตั้งโพสต์บันเดิลจะถูกย้ายไปยังสถานที่เดียวกันบันเดิล id ติดตั้งก่อนหน้านี้โดยการติดตั้ง (และติดตั้งรู้ว่า) สิ่งนี้สามารถป้องกันได้ด้วยการตั้งค่าบางอย่างในไฟล์ Manifest ที่ฉันจำไม่ได้ตอนนี้
PnotNP

@ PnotNP Ah หากคุณเป็นคนใจดีที่จะกลับมาพร้อมกับสภาพแวดล้อมเหล่านั้นถ้าคุณจำได้นั่นก็จะดีมาก!
Terje Dahl

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
Doug Richardson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.