首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Mac上使用pkgbuild和productbuild运行飞行后脚本构建安装包

如何在Mac上使用pkgbuild和productbuild运行飞行后脚本构建安装包
EN

Stack Overflow用户
提问于 2013-03-27 21:25:21
回答 1查看 4.3K关注 0票数 5

我想为Mac构建一个包含4个子软件包的安装包。子包是使用pkgbuild构建的。最终的包是用productbuild构建的,使用Distribution.xml表示欢迎和许可证文本,并选择安装位置。

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

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

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

我已经尝试通过添加一个脚本/文件夹到展开的pkg来使用展开-展开攻击,但是在我展开它之后似乎忽略了这一点。

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

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

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-02 21:19:39

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

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

代码语言:javascript
复制
echo "${DSTROOT}" > "${SHARED_INSTALLER_TEMP}/my_install_location"

然后在我的软件包中,需要这些信息,我通过postinstall脚本读取旧的收据(以防子包已经安装,并且用户“重新安装”遗漏了一些子包),然后从另一个包中读取临时文件。

因此,如果软件包已经安装并且没有重新安装,它将使用当前的安装位置,否则将通过临时文件使用新的安装位置。如果没有安装所需的软件包,则使用默认值并将其写入xcconfig文件(这可能不起作用):

代码语言:javascript
复制
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

在读取“旧”安装位置后,我使用之前从其他软件包中编写的临时文件检查是否有新的安装位置:

代码语言:javascript
复制
if [ -e "${SHARED_INSTALLER_TEMP}/my_install_location" ];
then
    MY_PACKAGE_DIR=`cat "${SHARED_INSTALLER_TEMP}/my_install_location"`
fi 

...
Write the xcconfig file...
...

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15659973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档