2013-03-27 22 views
5

Chcę zbudować pakiet instalacyjny dla systemu Mac OS X zawierający 4 pakiety podrzędne. Pakiety podrzędne są budowane z pkgbuild. Ostateczny pakiet jest budowany z produktu za pomocą pliku Distribution.xml dla tekstu powitalnego i licencji oraz wyboru lokalizacji instalacji.Jak uruchomić skrypt postów przy użyciu pkgbuild i productbuild na komputerze Mac, tworząc pakiet instalacyjny

Teraz chcę uruchomić skrypt po pomyślnym zakończeniu instalacji. W szczególności po tym, jak wpływy wszystkich pakietów są zapisywane przez instalatora.

O ile rozumiem strony man i dokumentację oraz inne użyteczne linki, powinienem użyć do tego skryptu postflight. Niestety nie mogę go uruchomić. Nadałem mu nazwę postflight i dodano do pakietu podrzędnego za pomocą pkgbuild, używając opcji --script, ale wygląda na to, że pkgbuild nie obsługuje skryptów postflight. Kiedy nazywam to postinstalacją, działa, ale niestety, zanim zostaną napisane wpływy.

Muszę uruchomić po zapisaniu paragonu, ponieważ chcę napisać plik xcconfig dla XCode polegający na lokalizacji instalacji innych pakietów za pomocą narzędzia pkgutil.

Próbowałem już użyć rozszerzonego spłaszczenia, dodając skrypt do folderu rozwiniętego, ale to wydaje się ignorowane po spłaszczeniu go.

Czy istnieje sposób, aby spełnić moją potrzebę? (Zapisywanie wybranych lokalizacji instalacji moich pakietów do pliku w miejscu instalacji pakietu podrzędnego)

Jeśli to możliwe, chcę uniknąć używania przestarzałego narzędzia do pakowania, przynajmniej jeśli jest inny lepszy sposób.

góry dzięki

Odpowiedz

1

Ponieważ musiałem dowiedzieć się w końcu, skrypt postflight jest również wykonywane przed wpływy są napisane. Więc moje rozwiązanie tego problemu jest następujące:

dodam skrypty postinstall do moich pakietów, które czytają zmienną środowiskową DSTROOT ustawiony przez instalatora systemu Mac OS i zapisać je do pliku w folderze udostępnionym temp:

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

Następnie w moim pakiecie, który potrzebuje tych informacji, czytam stare pokwitowania za pomocą skryptu poinstalacyjnego (w przypadku, gdy pakiet podrzędny jest już zainstalowany, a użytkownik "ponownie instaluje" pomijając niektóre pakiety podrzędne), a następnie plik tymczasowy z innego pakietu.

Tak więc, jeśli pakiet jest już zainstalowany i nie jest ponownie instalowany, używa bieżącej lokalizacji instalacji, w przeciwnym razie używa nowej lokalizacji instalacji za pośrednictwem plików tymczasowych. Jeśli nic nie jest obecnie wymagany pakiet nie został zainstalowany, więc użyć wartości domyślnych i zapisać je do pliku xcconfig (które prawdopodobnie nie będą działać):

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 

Po przeczytaniu „starej” lokalizacji instalacji, sprawdzić, czy Mam nową lokalizację instalacji przy użyciu wcześniej zapisanego pliku tymczasowego z innych pakietów:

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

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

Jeśli ktoś ma lepsze rozwiązanie, daj mi znać.