2013-03-27 224 views
5

我想構建一個包含4個子包的Mac OS X安裝包。子包是用pkgbuild構建的。 使用Distribution.xml爲productbuild構建最終包,以獲取歡迎和許可證文本並安裝位置選項。如何在Mac上使用pkgbuild和productbuild運行postflight腳本構建安裝包

現在我想在安裝成功後運行腳本。特別是在所有包裝的收據由安裝人員編寫之後。

據我瞭解手冊頁和文檔和其他有用的鏈接,我應該使用postflight腳本。不幸的是我無法讓它工作。我將它命名爲postflight,並使用--script選項將其添加到pkgbuild的子包中,但似乎pkgbuild不支持postflight腳本。當我將它命名爲postinstall時,它會運行,但不幸的是在寫入收據之前。

我需要在收據寫入後運行,因爲我想爲使用pkgutil工具的其他程序包的安裝位置的位置常量編寫一個xcconfig文件。

我已經嘗試使用expand-flatten hack,通過將腳本/文件夾添加到展開的pkg中,但在展平後它似乎被忽略。

有沒有辦法實現我的需求? (將我的包的選定安裝位置寫入子包的安裝位置中的文件)

如果可能,我希望避免使用棄用的包裝工具,至少如果還有其他更好的方法。

在此先感謝

回答

1

正如我只好找出最後,寫在收據之前還執行的飛行後的腳本。所以,我解決這個問題現在是以下幾點:

我加入後的腳本到我的包,上面寫着DSTROOT環境變量被Mac OS安裝程序設置,並將它們在共享臨時文件夾寫入文件:

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

然後在我的軟件包中,需要這些信息,我通過postinstall腳本讀取舊的收據(如果已經安裝了子軟件包,並且用戶「重新安裝」而省去某些子軟件包),然後使用臨時文件來自另一個包裹。

因此,如果軟件包已安裝且未重新安裝,它將使用當前的安裝位置,否則它將通過臨時文件使用新的安裝位置。如果沒有出現所需的軟件包沒有安裝,所以我使用默認值,並將其寫入到xcconfig文件(可能不會正常工作):

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 

讀「舊」安裝後的位置,我檢查我有一個新的使用先前寫入臨時文件從其他軟件包安裝位置:

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

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

如果有人有更好的解決方案,讓我知道。

相關問題