2013-03-27 218 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... 
... 

如果有人有更好的解决方案,让我知道。

相关问题