5

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

现在我想在安装成功后运行一个脚本。特别是在所有打包的收据都由安装人员写好之后。

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

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

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

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

如果可能的话,我想避免使用已弃用的 packagemaker 工具,至少如果有另一种更好的方法的话。

提前致谢

4

1 回答 1

2

正如我最后不得不发现的那样,飞行后脚本也在写收据之前执行。所以我对这个问题的解决方案现在如下:

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

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

然后在我的包中,需要这些信息,我通过安装后脚本读取旧收据(如果子包已经安装并且用户“重新安装”而忽略了一些子包),然后是另一个临时文件包裹。

因此,如果软件包已安装且未重新安装,它将使用当前安装位置,否则它将通过临时文件使用新安装位置。如果没有任何内容,则未安装所需的软件包,因此我使用默认值并将它们写入 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...
...

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

于 2013-04-02T13:19:39.003 回答