- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为 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/
我是一名优秀的程序员,十分优秀!