Catatan: Ini hanya untuk paket Pemasang OS X , paket untuk pengiriman ke Mac App Store mengikuti aturan yang berbeda.
Karena Gatekeeper Mountain Lion, saya akhirnya harus mengambil skrip pembuat PackageMaker saya di belakang gudang dan menembaknya. PackageMaker sudah dihapus dari Xcode dan dipindahkan ke "Alat Bantu untuk Xcode", jadi mudah-mudahan itu akan segera dilupakan.
Pertanyaannya adalah bagaimana cara menggunakan pkgbuild
, productbuild
dan pkgutil
menggantinya?
xcode
packagemaker
pkgbuild
productbuild
Catlan
sumber
sumber
Jawaban:
Proyek contoh kami memiliki dua target pembangunan: HelloWorld.app dan Helper.app. Kami membuat paket komponen untuk masing-masing dan menggabungkannya ke dalam arsip produk .
Sebuah paket komponen berisi muatan yang akan diinstal oleh X Installer OS. Meskipun paket komponen dapat diinstal sendiri, paket itu biasanya dimasukkan ke dalam arsip produk .
Alat kami: pkgbuild , productbuild , dan pkgutil
Setelah "Build and Archive" berhasil, buka $ BUILT_PRODUCTS_DIR di Terminal.
Ini memberi kita komponen-plist, Anda menemukan deskripsi nilai di bagian "Daftar Properti Komponen" . pkgbuild -root menghasilkan paket komponen , jika Anda tidak perlu mengubah properti default apa pun, Anda dapat menghilangkan parameter --component-plist pada perintah berikut.
productbuild - hasil sintesis dalam Definisi Distribusi .
Di Distribution.xml Anda dapat mengubah hal-hal seperti judul, latar belakang, selamat datang, readme, lisensi, dan sebagainya. Anda mengubah paket komponen dan definisi distribusi Anda dengan perintah ini menjadi arsip produk :
Saya sarankan untuk melihatnya iTunes Installers Distribution.xml untuk melihat apa yang mungkin. Anda dapat mengekstrak "Instal iTunes.pkg" dengan:
Mari kita kumpulkan
Saya biasanya memiliki folder bernama Paket dalam proyek saya yang mencakup hal-hal seperti Distribution.xml, komponen-plists, sumber daya dan skrip.
Tambahkan Fase Pembuatan Skrip Run yang dinamai "Generate Package", yang disetel ke skrip Run hanya saat menginstal :
Jika Anda tidak perlu mengubah paket setelah dibuat dengan productbuild, Anda dapat menyingkirkan
pkgutil --expand
danpkgutil --flatten
langkah - langkahnya. Juga Anda bisa menggunakan --sign paramenter pada productbuild bukan berjalan productsign .Tanda tangani Pemasang OS X
Paket ditandatangani dengan sertifikat Pemasang ID Pengembang yang dapat Anda unduh dari Utilitas Sertifikat Pengembang .
Penandatanganan mereka dilakukan dengan
--sign "Developer ID Installer: John Doe"
parameter pkgbuild , productbuild atau productsign .Perhatikan bahwa jika Anda akan membuat arsip produk yang ditandatangani menggunakan productbuild, tidak ada alasan untuk menandatangani paket komponen .
Semua jalan: Salin Paket ke Arsip Xcode
Untuk menyalin sesuatu ke Arsip Xcode kita tidak bisa menggunakan Fase Pembuatan Skrip Jalankan . Untuk ini, kita perlu menggunakan Skema Aksi.
Edit Skema dan perluas Arsip. Kemudian klik post-action dan tambahkan New Run Script Action :
Dalam Xcode 6:
Di Xcode 5, gunakan nilai ini sebagai
PKG
gantinya:Jika kontrol versi Anda tidak menyimpan informasi Skema Xcode, saya sarankan untuk menambahkan ini sebagai skrip shell ke proyek Anda sehingga Anda dapat dengan mudah mengembalikan tindakan dengan menyeret skrip dari ruang kerja ke dalam post-action.
Scripting
Ada dua jenis skrip: JavaScript di File Definisi Distribusi dan Skrip Shell.
Dokumentasi terbaik tentang Shell Script yang saya temukan di WhiteBox - PackageMaker How-to , tetapi baca ini dengan hati-hati karena mengacu pada format paket lama.
Bacaan Tambahan
Masalah dan Penanganan Masalah yang Diketahui
Panel Pilih Tujuan
Pengguna disajikan dengan opsi pilih tujuan dengan hanya satu pilihan - "Instal untuk semua pengguna komputer ini". Opsi muncul secara visual dipilih, tetapi pengguna perlu mengkliknya untuk melanjutkan dengan instalasi, menyebabkan beberapa kebingungan.
Dokumentasi Apel merekomendasikan untuk digunakan
<domains enable_anywhere ... />
tetapi ini memicu Pane Select Destination yang lebih buggy baru yang tidak digunakan Apple dalam Paket mereka.Menggunakan deprecate
<options rootVolumeOnly="true" />
memberi Anda Pane Pilih Tujuan lama.Anda ingin menginstal item ke folder home pengguna saat ini.
Jawaban singkat: JANGAN MENCOBANYA!
Jawaban panjang: BENAR-BENAR; JANGAN MENCOBANYA! Baca Masalah dan Solusi Pemasang . Anda tahu apa yang saya lakukan bahkan setelah membaca ini? Saya cukup bodoh untuk mencobanya. Mengatakan pada diri sendiri, saya yakin mereka memperbaiki masalah di 10.7 atau 10.8.
Pertama-tama saya melihat dari waktu ke waktu, Destinasi Pilih Pane Bug yang disebutkan di atas. Itu seharusnya menghentikan saya, tetapi saya mengabaikannya. Jika Anda tidak ingin menghabiskan waktu seminggu setelah Anda merilis perangkat lunak Anda menjawab e-mail dukungan bahwa mereka harus mengklik sekali pilihan biru yang bagus JANGAN gunakan ini.
Anda sekarang berpikir bahwa pengguna Anda cukup pintar untuk mengetahui panelnya, bukan? Nah di sini ada satu hal lagi tentang pemasangan folder rumah, MEREKA TIDAK BEKERJA!
Saya mengujinya selama dua minggu pada sekitar 10 mesin yang berbeda dengan versi OS yang berbeda dan apa yang tidak, dan tidak pernah gagal. Jadi saya mengirimnya. Dalam satu jam dari rilis saya balas mengenang dari pengguna yang tidak bisa menginstalnya. Log mengisyaratkan masalah izin Anda tidak akan dapat memperbaikinya.
Jadi mari kita ulangi sekali lagi: Kami tidak menggunakan Installer untuk instalasi folder rumah!
RTFD untuk Selamat Datang, Baca-saya, Lisensi dan Kesimpulan tidak diterima oleh
productbuild
.Pemasang didukung sejak awal file RTFD untuk membuat layar Selamat Datang cantik dengan gambar, tetapi productbuild tidak menerimanya.
Penanganan masalah: Gunakan file dummy rtf dan ganti dalam paket dengan setelah
productbuild
selesai.Catatan: Anda juga dapat memiliki gambar Retina di dalam file RTFD. Menggunakan multi-file gambar tiff untuk ini:
tiffutil -cat Welcome.tif Welcome_2x.tif -out FinalWelcome.tif
. Lebih detail .Memulai aplikasi saat instalasi dilakukan dengan skrip BundlePostInstallScriptPath :
Penting untuk menjalankan aplikasi sebagai pengguna yang masuk, bukan sebagai pengguna pemasang. Ini dilakukan dengan launchctl asuser uid path . Kami juga hanya menjalankannya saat itu bukan instalasi baris perintah, dilakukan dengan alat penginstal atau Apple Remote Desktop .
sumber
/tmp
untuk diproses nanti dalam skrip postflight, bagaimana cara menyusun daftar komponen? Semua dokumentasi yang tersedia tampaknya menganggap bahwa pengembang telah membuatnya--analyze
, setidaknya pada awalnya.Component Property List
Anda tidak perlu lari--analyze
. Untuk file postprocessing saya sarankan memasukkan semuanya ke dalam pkg dan mengatur lokasi pemasangan pkg ke/tmp
. Tapi mungkin saya salah paham pertanyaan Anda. Jika demikian poskan dalam versi yang lebih detail pada SO.Ada satu aplikasi yang sangat menarik oleh Stéphane Sudre yang melakukan semua ini untuk Anda, adalah skrip / mendukung bangunan dari baris perintah, memiliki GUI yang sangat bagus dan GRATIS. Yang menyedihkan adalah: itu disebut "Paket" yang membuatnya tidak mungkin ditemukan di google.
http://s.sudre.free.fr/Software/Packages/about.html
Saya berharap saya tahu tentang hal itu sebelum saya mulai membuat naskah saya sendiri.
sumber
FYI bagi mereka yang mencoba membuat penginstal paket untuk bundel atau plugin, mudah:
sumber
A +1 untuk jawaban yang diterima:
Seleksi Tujuan di Pemasang
Jika pemilihan domain (alias tujuan) diinginkan antara domain pengguna dan domain sistem daripada mencoba
<domains enable_anywhere="true">
menggunakan berikut:<domains enable_currentUserHome="true" enable_localSystem="true"/>
enable_currentUserHome menginstal aplikasi aplikasi di bawah
~/Applications/
danenable_localSystem
memungkinkan aplikasi diinstal di bawah/Application
Saya sudah mencoba ini di El Capitan 10.11.6 (15G1217) dan tampaknya berfungsi dengan baik di mesin 1 dev dan 2 VM berbeda yang saya coba.
sumber
Berikut ini skrip build yang membuat paket pemasang yang ditandatangani keluar dari build root.
sumber