Remarque: Ceci concerne uniquement les packages du programme d' installation OS X , les packages à soumettre au Mac App Store suivent des règles différentes.
À cause du Gatekeeper de Mountain Lion, j'ai finalement dû prendre mon script de construction PackageMaker derrière la grange et le tirer. PackageMaker a déjà été supprimé de Xcode et déplacé dans "Auxiliary Tools for Xcode", donc j'espère qu'il sera bientôt oublié.
La question est de savoir comment puis-je utiliser pkgbuild
, productbuild
et pkgutil
de le remplacer?
Réponses:
Notre exemple de projet a deux cibles de construction: HelloWorld.app et Helper.app. Nous créons un package de composants pour chacun et les combinons dans une archive produit .
Un package de composants contient une charge utile à installer par le programme d'installation d'OS X. Bien qu'un package de composants puisse être installé seul, il est généralement incorporé dans une archive de produit .
Nos outils: PKGBUILD , productbuild et pkgutil
Après un "Build and Archive" réussi, ouvrez $ BUILT_PRODUCTS_DIR dans le Terminal.
Cela nous donne le composant-plist, vous trouvez la description de la valeur dans la section "Liste des propriétés des composants" . pkgbuild -root génère les packages de composants , si vous n'avez pas besoin de modifier l'une des propriétés par défaut, vous pouvez omettre le paramètre --component-plist dans la commande suivante.
productbuild --synthesize donne une définition de distribution .
Dans le fichier Distribution.xml, vous pouvez modifier des éléments tels que le titre, l'arrière-plan, la bienvenue, le fichier Lisez-moi, la licence, etc. Vous transformez vos packages de composants et votre définition de distribution avec cette commande en une archive de produit :
Je recommande de jeter un œil à iTunes Installers Distribution.xml pour voir ce qui est possible. Vous pouvez extraire "Install iTunes.pkg" avec:
Permet de le mettre ensemble
J'ai généralement un dossier nommé Package dans mon projet qui comprend des éléments tels que Distribution.xml, des listes de composants, des ressources et des scripts.
Ajoutez une phase de génération de script d'exécution nommée "Générer le package", qui est définie sur Exécuter le script uniquement lors de l'installation :
Si vous n'avez pas à modifier le package après sa génération avec productbuild, vous pouvez supprimer les étapes
pkgutil --expand
etpkgutil --flatten
. Vous pouvez également utiliser le --sign paramenter sur productbuild au lieu de courir productsign .Signer un programme d'installation OS X
Les packages sont signés avec le certificat Developer ID Installer que vous pouvez télécharger à partir de Developer Certificate Utility .
La signature se fait avec le
--sign "Developer ID Installer: John Doe"
paramètre pkgbuild , productbuild ou productsign .Notez que si vous allez créer une archive de produit signée à l' aide de productbuild, il n'y a aucune raison de signer les packages de composants .
Tout le chemin: Copiez le package dans Xcode Archive
Pour copier quelque chose dans l'archive Xcode, nous ne pouvons pas utiliser la phase de construction du script d'exécution . Pour cela, nous devons utiliser une action de schéma.
Modifiez le schéma et développez Archive. Cliquez ensuite sur post-actions et ajoutez une nouvelle action d'exécution de script :
Dans Xcode 6:
Dans Xcode 5, utilisez
PKG
plutôt cette valeur pour :Dans le cas où votre contrôle de version ne stocke pas les informations Xcode Scheme, je suggère de l'ajouter en tant que script shell à votre projet afin que vous puissiez simplement restaurer l'action en faisant glisser le script de l'espace de travail vers la post-action.
Scripting
Il existe deux types de scripts différents: JavaScript dans les fichiers de définition de distribution et les scripts Shell.
La meilleure documentation sur les scripts Shell que j'ai trouvée dans WhiteBox - PackageMaker How-to , mais lisez-la avec prudence car elle fait référence à l'ancien format de package.
Lecture supplémentaire
Problèmes connus et solutions de contournement
Volet de sélection de destination
L'utilisateur se voit proposer l'option de sélection de destination avec un seul choix - «Installer pour tous les utilisateurs de cet ordinateur». L'option apparaît visuellement sélectionnée, mais l'utilisateur doit cliquer dessus afin de procéder à l'installation, ce qui crée une certaine confusion.
La documentation d'Apples recommande d'utiliser,
<domains enable_anywhere ... />
mais cela déclenche le nouveau volet de sélection de destination plus bogué qu'Apple n'utilise dans aucun de ses packages.L'utilisation de la version obsolète
<options rootVolumeOnly="true" />
vous donne l'ancien volet de sélection de destination.Vous souhaitez installer des éléments dans le dossier d'accueil de l'utilisateur actuel.
Réponse courte: N'ESSAYEZ PAS!
Réponse longue: VRAIMENT; N'ESSAYEZ PAS! Lisez les problèmes et solutions du programme d'installation . Vous savez ce que j'ai fait même après avoir lu ceci? J'ai été assez stupide pour l'essayer. Me disant que je suis sûr qu'ils ont résolu les problèmes dans 10.7 ou 10.8.
Tout d'abord, j'ai vu de temps en temps le bogue du volet de sélection de destination mentionné ci-dessus. Cela aurait dû m'arrêter, mais je l'ai ignoré. Si vous ne voulez pas passer la semaine après la sortie de votre logiciel à répondre aux e-mails de support, ils doivent cliquer une fois sur la belle sélection bleue, NE PAS l'utiliser.
Vous pensez maintenant que vos utilisateurs sont assez intelligents pour comprendre le panneau, n'est-ce pas? Eh bien, voici une autre chose à propos de l'installation du dossier personnel, ILS NE FONCTIONNENT PAS!
Je l'ai testé pendant deux semaines sur environ 10 machines différentes avec différentes versions d'OS et autres, et cela n'a jamais échoué. Alors je l'ai expédié. Moins d'une heure après la sortie, je suis ravi des utilisateurs qui ne pouvaient tout simplement pas l'installer. Les journaux suggèrent des problèmes d'autorisation que vous ne pourrez pas résoudre.
Répétons-le donc encore une fois: nous n'utilisons pas le programme d'installation pour les installations du dossier personnel!
RTFD pour Bienvenue, Lisez-moi, Licence et Conclusion n'est pas accepté par
productbuild
.Programme d'installation pris en charge depuis le début des fichiers RTFD pour créer de jolis écrans de bienvenue avec des images, mais productbuild ne les accepte pas.
Solutions de contournement: utilisez un fichier rtf factice et remplacez-le dans le package par une fois
productbuild
terminé.Remarque: vous pouvez également avoir des images Retina dans le fichier RTFD. Utilisez des fichiers TIFF multi-images pour ceci:
tiffutil -cat Welcome.tif Welcome_2x.tif -out FinalWelcome.tif
. Plus de détails .Démarrage d'une application lorsque l'installation est effectuée avec un script BundlePostInstallScriptPath :
Il est important d'exécuter l'application en tant qu'utilisateur connecté et non en tant qu'utilisateur installateur. Ceci est fait avec le chemin uid de launchctl asuser . De plus, nous ne l'exécutons que lorsqu'il ne s'agit pas d'une installation en ligne de commande, effectuée avec l' outil d' installation ou Apple Remote Desktop .
la source
/tmp
pour être traité ultérieurement dans un script postflight, comment structurer la liste des composants? Toute la documentation disponible semble supposer que le développeur l'a générée avec--analyze
, au moins initialement.Component Property List
vous n'avez pas besoin de courir--analyze
. Pour les fichiers de post-traitement, je suggère de les mettre tous dans un pkg et de définir cet emplacement d'installation de pkg sur/tmp
. Mais peut-être ai-je mal compris votre question. Si c'est le cas, publiez-le dans une version plus détaillée sur SO.Il existe une application très intéressante de Stéphane Sudre qui fait tout cela pour vous, est scriptable / prend en charge la construction à partir de la ligne de commande, a une interface graphique super sympa et est GRATUITE. Ce qui est triste, c'est qu'il s'appelle "Packages", ce qui rend impossible la recherche sur Google.
http://s.sudre.free.fr/Software/Packages/about.html
J'aurais aimé le savoir avant de commencer à créer mes propres scripts.
la source
Pour info, pour ceux qui essaient de créer un programme d'installation de package pour un bundle ou un plugin, c'est facile:
la source
Un +1 à la réponse acceptée:
Sélection de la destination dans l'installateur
Si la sélection du domaine (aka destination) est souhaitée entre le domaine utilisateur et le domaine système, alors plutôt que d'essayer d'
<domains enable_anywhere="true">
utiliser ce qui suit:<domains enable_currentUserHome="true" enable_localSystem="true"/>
enable_currentUserHome installe l'application d'application sous
~/Applications/
etenable_localSystem
permet à l'application d'être installée sous/Application
J'ai essayé cela dans El Capitan 10.11.6 (15G1217) et cela semble fonctionner parfaitement dans 1 machine de développement et 2 machines virtuelles différentes que j'ai essayées.
la source
Voici un script de construction qui crée un package d'installation signé à partir d'une racine de construction.
la source