2012-08-03 73 views
12

我一直在试图将Mac PackageMaker命令行构建移植到pkgbuild和productbuild,但我卡住了。不幸的是,我没有发现任何记录这些新程序如何工作的东西,除了这个StackOverflow postpkgbuildproductbuild手册页。将PackageMaker命令行构建安装程序移植到pkgbuild

这是我的问题。我创建了具有以下文件根目录安装在它:下面

/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目录为/库/框架。但是它不会将MyProgram.app文件安装到/ Applications目录中。当我看到安装日志我看到这条消息:

应用/ MyProgram.app搬迁到 /some_path/Applications/MyProgram.app

任何人都可以摆脱一些轻为什么这个ISN”将MyProgram.app文件添加到像PackageMaker那样的/ Applications目录中?

回答

4

不幸的是,这个问题的答案不是我正在寻找的。我无法弄清楚如何从流程中清除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)来重建软件包。
1

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

现在要解决的问题:重新定位与用户可以将应用程序从应用程序移动到/ WorkApplications/PrivateApplications这一事实相关。在你的情况下,安装程序可能会在build文件夹中找到你的应用程序并将其安装在这个文件夹中。

我认为安装程序使用应用程序包标识符和Spotlight进行重定位,因此对于测试,您可以将生成文件夹添加到Spotlight忽略列表。

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

1

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

相关问题