gpt4 book ai didi

macos - 如何在 Mac 上使用 pkgbuild 和 Productbuild 运行 postflight 脚本构建安装包

转载 作者:行者123 更新时间:2023-12-01 16:32:17 33 4
gpt4 key购买 nike

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

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

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

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

我已经尝试通过将 Scripts/文件夹添加到扩展的 pkg 中来使用扩展展平黑客,但在我展平它后似乎会被忽略。

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

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

提前致谢

最佳答案

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

我将安装后脚本添加到我的包中,这些脚本读取 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...
...

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

关于macos - 如何在 Mac 上使用 pkgbuild 和 Productbuild 运行 postflight 脚本构建安装包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15659973/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com