将PackageMaker命令行构建安装程序移植到pkgbuild

时间:2012-08-03 13:30:04

标签: macos installer packagemaker pkgbuild

我一直在尝试将Mac PackageMaker命令行构建移植到pkgbuild和productbuild但是我被卡住了。遗憾的是,除了这个StackOverflow post以及pkgbuildproductbuild手册页之外,我没有找到任何记录这些新程序如何工作的内容。

这是我的问题。我创建了一个根安装目录,其中包含以下文件:

/some_path/Applications
                       /MyProgram.app
          /Library
                  /Frameworks
                             /MyFramework.framework
                                                   /[library files...]

下面的命令行调用对PackageMaker非常有用。它创建了一个安装程序,安装了上面的所有文件。

$ /Developer/usr/bin/packagemaker \
    --title "My Program" \
    --root /some_path \
    --version 1.0.0 \
    --filter "\.DS_Store" \
    --resources ./resources/ \
    --scripts ./scripts/ \
    --root-volume-only \
    --domain system \
    --verbose \
    --no-relocate \
    --target 10.5 \
    --id com.my_company.pkg \
    --out MyProgram.pkg

现在我正在尝试用pkgbuild编写这个并遇到一个重大问题。我使用以下电话:

$ pkgbuild \
    --root /some_path \
    --version 1.0.0 \
    --install-location "/" \
    --scripts "./scripts/" \
    --identifier "com.my_company.pkg" \
    MyProgram.pkg

此命令构建一个安装程序,将MyProgram.framework目录复制到/ Library / Frameworks中。但是,它不会将MyProgram.app文件安装到/ Applications目录中。当我查看安装程序日志时,我看到以下消息:

  

Applications / MyProgram.app重定位到   /some_path/Applications/MyProgram.app

有人可以解释为什么不将这个MyProgram.app文件添加到/ Applications目录中,就像PackageMaker一样吗?

4 个答案:

答案 0 :(得分:4)

不幸的是,这个问题的答案并不完全是我想要的。我无法弄清楚如何从流程中消除PackageMaker。但是,有一个解决方案包括pkgutil和PackageMaker,以完全在命令行上创建带有自定义欢迎消息,许可证和背景图像的安装程序。 PackageMaker GUI需要 NOT 。步骤如下:

  1. 在特殊目录结构上运行packagemaker command line可执行文件。此目录结构反映了Mac文件系统。阅读旧的但可靠的"PackageMaker How-to" tutorial
  2. 运行pkgutil(pkgutil --expand)以提取包内容
  3. 查看内容并确定要更改的内容。一些选项是欢迎消息,许可证和背景图像。
  4. 添加命令以通过命令行更改这些文件。有关详细信息,请查看"Automating Apple's PackageMaker" tutorial。最简单的方法就是运行类似echo '<background file="your_background.png">'的内容。
  5. 运行pkgutil(pkgutil --flatten)以重建包。

答案 1 :(得分:2)

首先,您确定需要安装人员吗?您可以将框架放在应用程序中。至少可以说,安装程序和pkgbuild有点不稳定。

现在问题就在眼前:重定位与用户可以将应用程序从/ Applications移动到say / WorkApplications / PrivateApplications这一事实有关。在您的情况下,安装程序可能会在构建文件夹中找到您的应用程序并将其安装在此文件夹中。

我认为安装程序使用Application Bundle Identifier和Spotlight进行重定位,因此对于测试,您可以将build文件夹添加到Spotlight忽略列表。

您可以在Component Property List BundleIsRelocatable中进行定义。如果你真的必须安装一个全局框架,那么你需要将BundleIsRelocatable设置为false。

答案 2 :(得分:2)

The question you reference几乎完全消除了Package Maker所需的一切。我添加的一件事是在sed调用之后使用productbuild --synthesize ...将行插入到分发文件中。例如,以下是我已经构建组件包后使用的一些终端命令:

productbuild --synthesize --package "components/SubPackage.pkg" "distribution.xml"
sed -i "" \
-e '$ i\
\    <title>Installer Title</title>' \
-e '$ i\
\    <background file="background.png" alignment="left" scaling="proportional" />' \
-e '$ i\
\    <welcome file="welcome.rtf" />' \
"distribution.xml"
productbuild --distribution "distribution.xml" --resources "resources/" --package-path "components/" "Installer.pkg"

这样可以避免使用pkgutil --expandpkgutil --flatten来修改安装程序。

答案 3 :(得分:0)

创建组件plist文件,该文件具有可重定位属性的值。

pkgbuild --analyze --root "$dst_src_root" "$installer_root/Components.plist"

编辑组件plist并将“ BundleIsRelocatable”设置为false。 由于安装程序的内容不变(一个应用程序和一个插件),因此这在我的项目中完成了一次。我每次都重复使用相同的组件plist来创建内容包。

sudo pkgbuild --root "$dst_src_root" --component-plist "$installer_root/Components.plist" --identifier "com.company.app" --version "1.0" --scripts "$dst_scpt_root" "$dst_pkg_root/InstallPackage/cisContents.pkg" 

然后使用productbuild,我们可以创建最终包