14

我一直在尝试将 Mac PackageMaker命令行构建移植到 pkgbuild 和 productbuild 但我被卡住了。不幸的是,除了这篇StackOverflow 帖子以及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

谁能解释一下为什么没有像 PackageMaker 那样将 MyProgram.app 文件添加到 /Applications 目录中?

4

4 回答 4

4

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

  1. 在特殊目录结构上运行packagemaker 命令行可执行文件。此目录结构反映了 Mac 文件系统。在旧的但可靠的“PackageMaker How-to”教程中阅读更多信息。
  2. 运行 pkgutil ( pkgutil --expand) 以提取包内容
  3. 查看内容并确定要更改的内容。一些选项是欢迎信息、许可证和背景图像。
  4. 添加命令以通过命令行更改这些文件。查看“自动化 Apple 的 PackageMaker”教程以获取更多信息。最简单的方法就是运行这样的东西echo '<background file="your_background.png">'
  5. 运行 pkgutil ( pkgutil --flatten) 以重建包。
于 2012-10-03T14:00:42.803 回答
2

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

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

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

您可以在组件属性列表 BundleIsRelocatable中定义。如果你真的必须安装一个全局框架,这是一个你想将 BundleIsRelocatable 设置为 false 的包。

于 2012-08-03T14:56:36.053 回答
2

您引用的问题几乎包含完全消除 Package Maker 所需的一切。我添加的一件事是sedproductbuild --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修改安装程序。

于 2013-04-26T16:41:15.697 回答
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,我们可以创建最终包

于 2019-05-24T08:41:05.310 回答