2013-03-27 9 views
5

Desidero creare un pacchetto di installazione per Mac OS X che contenga 4 pacchetti secondari. I pacchetti secondari sono compilati con pkgbuild. Il pacchetto finale è compilato con productbuild utilizzando un file Distribution.xml per il benvenuto e il testo della licenza e le opzioni di installazione.Come eseguire uno script Postflight utilizzando pkgbuild e productbuild su Mac Creazione di un pacchetto di installazione

Ora voglio eseguire uno script dopo l'installazione è riuscita. In particolare dopo che le ricevute di tutti i pacchetti sono state scritte dall'installatore.

Per quanto riguarda le pagine man e la documentazione e altri collegamenti utili, dovrei usare uno script postflight per questo. Sfortunatamente non riesco a farlo funzionare. L'ho chiamato postflight e aggiunto al pacchetto secondario con pkgbuild usando l'opzione --script ma sembra che pkgbuild non supporti gli script postflight. Quando lo chiamo postinstall viene eseguito, ma sfortunatamente prima che vengano scritte le ricevute.

Ho bisogno di essere eseguito dopo che le ricevute sono state scritte perché voglio scrivere un file xcconfig per XCode che constisting del percorso delle posizioni di installazione degli altri pacchetti usando lo strumento pkgutil.

Ho già provato a utilizzare l'hack di espansione-appiattimento aggiungendo una cartella Scripts al pkg espanso ma che sembra essere ignorato dopo averlo appiattito.

C'è un modo per soddisfare il mio bisogno? (Scrivere i percorsi di installazione scelti dei miei pacchetti in un file nel percorso di installazione di un pacchetto secondario)

Se possibile, evitare di utilizzare lo strumento deprecato packagemaker, almeno se esiste un altro modo migliore.

Grazie in anticipo

risposta

1

Come ho dovuto scoprire, infine, lo script Postflight viene eseguito anche prima che le ricevute sono scritte. Quindi la mia soluzione a questo problema è ora la seguente:

aggiungo script postinstallazione ai miei pacchetti che leggono la variabile d'ambiente DSTROOT fissato dalla installazione di Mac OS e scrivere in un file nella cartella Temp comune:

echo "${DSTROOT}" > "${SHARED_INSTALLER_TEMP}/my_install_location" 

Quindi nel mio pacchetto, che ha bisogno di queste informazioni, ho letto le vecchie ricevute tramite uno script postinstall (nel caso in cui il pacchetto secondario sia già installato e l'utente "reinstalla" lasciando fuori alcuni dei pacchetti secondari) e quindi il file temporaneo dall'altro pacchetto.

Quindi, se il pacchetto è già installato e non reinstallato, utilizza la posizione di installazione corrente altrimenti utilizza la nuova posizione di installazione tramite i file temporanei. Se non è presente il pacchetto richiesto non è stato installato in modo da utilizzare i valori di default e li scrivere sul file xcconfig (che probabilmente non funzionerà):

pkgutil --pkg-info-plist my.package.bundle > "${SHARED_INSTALLER_TEMP}/tmp.plist" 
if [ -e "${SHARED_INSTALLER_TEMP}/tmp.plist" ]; 
then 
    MY_PACKAGE_VOL=`/usr/libexec/PlistBuddy -c "Print :volume" "${SHARED_INSTALLER_TEMP}/tmp.plist"` 
    MY_PACKAGE_DIR=`/usr/libexec/PlistBuddy -c "Print :install-location" "${SHARED_INSTALLER_TEMP}/tmp.plist"`  
    MY_PACKAGE_DIR="${MY_PACKAGE_VOL}${MY_PACKAGE_DIR}" 
fi 

Dopo aver letto il "vecchio" percorso di installazione, controllo se Ho una nuova posizione di installazione utilizzando il temp file precedentemente scritto dagli altri pacchetti:

if [ -e "${SHARED_INSTALLER_TEMP}/my_install_location" ]; 
then 
    MY_PACKAGE_DIR=`cat "${SHARED_INSTALLER_TEMP}/my_install_location"` 
fi 

... 
Write the xcconfig file... 
... 

Se qualcuno ha una soluzione migliore fammelo sapere.

Problemi correlati