如何在Mac上使用pkgbuild和productbuild运行postflight脚本来构建安装包

时间:2013-03-27 13:25:21

标签: macos installer productbuild pkgbuild

我想为Mac OS X构建一个包含4个子包的安装包。子包是使用pkgbuild构建的。 最终的包使用product.xml构建,使用Distribution.xml进行欢迎和许可文本以及安装位置选择。

现在我想在安装成功后运行脚本。特别是在所有打包的收据都由安装程序写入之后。

据我了解手册页和文档以及其他有用的链接,我应该使用postflight脚本。不幸的是我无法让它发挥作用。我将它命名为postflight并使用--script选项添加到pkgbuild的子包中,但似乎pkgbuild不支持postflight脚本。当我将其命名为postinstall时,它会在收据写入之前运行,但不幸的是。

我需要在写入收据后运行,因为我想使用pkgutil工具为XCode编写一个xcconfig文件,以构成其他软件包安装位置的位置。

我已经尝试通过在扩展的pkg中添加Scripts /文件夹来使用expand-flatten hack但是在我展平它之后似乎被忽略了。

有没有办法满足我的需求? (将我的包的选定安装位置写入子包的安装位置中的文件)

如果可能的话,我想避免使用已弃用的软件包制作工具,至少如果还有其他更好的方法。

提前致谢

1 个答案:

答案 0 :(得分:2)

正如我最后要发现的那样,postflight脚本也会在收据写入之前执行。所以我现在解决这个问题的方法如下:

我将postinstall脚本添加到我的软件包中,该软件包读取Mac OS安装程序设置的DSTROOT环境变量,并将它们写入共享临时文件夹中的文件:

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...
...

如果有人有更好的解决方案,请告诉我。