ecr*_*eif 5 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,但是在我展平之后这似乎被忽略了.
有没有办法满足我的需求?(将我的包的选定安装位置写入子包的安装位置中的文件)
如果可能的话,我想避免使用已弃用的packagemaker工具,至少如果还有其他更好的方法.
提前致谢
正如我最后不得不发现的那样,postflight 脚本也在写入收据之前执行。所以我现在解决这个问题的方法如下:
我将安装后脚本添加到我的包中,这些脚本读取 Mac OS 安装程序设置的 DSTROOT 环境变量,并将它们写入共享临时文件夹中的文件中:
echo "${DSTROOT}" > "${SHARED_INSTALLER_TEMP}/my_install_location"
Run Code Online (Sandbox Code Playgroud)
然后在我的包中,需要这些信息,我通过安装后脚本读取旧收据(如果子包已经安装并且用户“重新安装”留下了一些子包),然后从另一个读取临时文件包裹。
因此,如果软件包已安装且未重新安装,它将使用当前安装位置,否则它将通过临时文件使用新的安装位置。如果不存在任何内容,则未安装所需的包,因此我使用默认值并将它们写入 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
Run Code Online (Sandbox Code Playgroud)
阅读“旧”安装位置后,我使用其他软件包中先前写入的临时文件检查是否有新的安装位置:
if [ -e "${SHARED_INSTALLER_TEMP}/my_install_location" ];
then
MY_PACKAGE_DIR=`cat "${SHARED_INSTALLER_TEMP}/my_install_location"`
fi
...
Write the xcconfig file...
...
Run Code Online (Sandbox Code Playgroud)
如果有人有更好的解决方案请告诉我。