【问题标题】:Porting PackageMaker command line build installer to pkgbuild将 PackageMaker 命令行构建安装程序移植到 pkgbuild
【发布时间】:2012-08-01 13:29:42
【问题描述】:

我一直在尝试将 Mac PackageMaker 命令行构建移植到 pkgbuild 和 productbuild,但我被卡住了。不幸的是,除了StackOverflow postpkgbuildproductbuild 手册页之外,我还没有找到太多记录这些新程序如何工作的内容。

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

/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 目录中?

【问题讨论】:

    标签: macos installation packagemaker pkgbuild


    【解决方案1】:

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

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

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

    您可以在Component Property List 中定义BundleIsRelocatable。如果你真的必须安装一个全局框架,这是一个你想要将 BundleIsRelocatable 设置为 false 的包。

    【讨论】:

      【解决方案2】:

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

      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) 来重建包。

      【讨论】:

        【解决方案3】:

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

        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 来修改安装程序。

        【讨论】:

          【解决方案4】:

          创建组件 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,我们可以创建最终包

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-30
            • 2013-05-17
            • 1970-01-01
            • 2015-01-13
            • 2022-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多