如何在 DMG 安装程序中使用 Chef Omnibus 创建 Mac OS .app 包
How to create a Mac OS .app bundle with Chef Omnibus in DMG installer
我对 Mac OS 的了解非常有限,有几个与 DMG 安装程序相关的问题。
我们有一个 运行 在 Windows、Mac 和 Ubuntu 上的应用程序。我们使用 Chef Omnibus.
为所有三个 OS 生成安装程序
我们的 DMG 安装程序有点基础,但工作正常,即我们的应用程序已按预期安装。但是,我们的用户没有简单的方法来启动应用程序 - 他们需要自己去寻找安装文件夹并找到启动 .sh 文件并 运行 它。
根据我目前收集到的信息,Mac OS bundle .app 可以帮助我们解决这个问题。但是,我没有找到有关如何在综合安装程序创建过程中创建捆绑包的任何信息。我可以看到捆绑包是 follow a specific structure:
的文件夹和文件的集合
- 一个info.plist文件
- 一个可执行文件 - 这可能是我们上面提到的 bash 文件
- 资源文件夹
- ...以及各种其他文件
我发现创建捆绑包的最简单方法是使用 xCode 编辑器,但我们不适合它。我们在 CI 进程中自动创建安装程序,我们希望保持这种方式,它非常高效和可靠。最好的办法是以某种方式扩展 Omnibus 进程,这样我们也可以获得这个捆绑文件。但是,在这一点上我什至不确定这是否可能。
我真的卡住了,所以我很感激任何指点。
这是我们的 distribution.xml 文件以供参考,以防与此问题相关。它被 Omnibus 用于 productbuild 命令。我一直在研究扩展它的选项,但与捆绑包没有任何关系:
<?xml version="1.0" standalone="no"?>
<installer-gui-script minSpecVersion="1">
<title><%= friendly_name %></title>
<background file="background.png" alignment="bottomleft" mime-
type="image/png"/>
<welcome file="welcome.html" mime-type="text/html"/>
<license file="license.html" mime-type="text/html"/>
<!-- Generated by productbuild - - synthesize -->
<pkg-ref id="<%= identifier %>"/>
<options customize="never" require-scripts="false"/>
<choices-outline>
<line choice="default">
<line choice="<%= identifier %>"/>
</line>
</choices-outline>
<choice id="default"/>
<choice id="<%= identifier %>" visible="false">
<pkg-ref id="<%= identifier %>"/>
</choice>
<pkg-ref id="<%= identifier %>" version="<%= version %>"
onConclusion="none"><%= component_pkg %></pkg-ref>
<domains enable_anywhere="false" enable_currentUserHome="true"
enable_localSystem="false" />
</installer-gui-script>
our application is installed as it should
听起来您确实需要为您的发行版生成 .app
。
.app
是一个特殊的文件夹结构:
MyApp.app/
Contents/
Info.plist
MacOS/
executable
Frameworks/
library.dylib
Resources/
icon.icns
Frameworks/
中的库应该通过 install_name_tool
链接到 executable
例如,
install_name_tool -change /opt/local/lib/library.dylib @rpath/library.dylib MyApp.app/Contents/MacOS/executable
install_name_tool -add_rpath @executable_path/../Frameworks MyApp.app/Contents/MacOS/executable
大多数其他东西都可以归类为资源,除了 Contents/
文件夹外,其他任何东西都不能进入应用程序的顶层。
您可以 codesign
在应用完成并完全捆绑后。
当你回到你的其他软件时,使用 .app
创建一个 .dmg
,然后你可以 codesign
那。
在 .dmg
的典型安装中,用户通常会看到该应用程序和 /Applications 文件夹的别名。要安装,用户将应用程序拖到 /Applications 文件夹中。
一些 .dmg
创作软件会做更复杂的事情,例如显示背景或需要最终用户许可协议。
我对 Mac OS 的了解非常有限,有几个与 DMG 安装程序相关的问题。
我们有一个 运行 在 Windows、Mac 和 Ubuntu 上的应用程序。我们使用 Chef Omnibus.
为所有三个 OS 生成安装程序我们的 DMG 安装程序有点基础,但工作正常,即我们的应用程序已按预期安装。但是,我们的用户没有简单的方法来启动应用程序 - 他们需要自己去寻找安装文件夹并找到启动 .sh 文件并 运行 它。
根据我目前收集到的信息,Mac OS bundle .app 可以帮助我们解决这个问题。但是,我没有找到有关如何在综合安装程序创建过程中创建捆绑包的任何信息。我可以看到捆绑包是 follow a specific structure:
的文件夹和文件的集合- 一个info.plist文件
- 一个可执行文件 - 这可能是我们上面提到的 bash 文件
- 资源文件夹
- ...以及各种其他文件
我发现创建捆绑包的最简单方法是使用 xCode 编辑器,但我们不适合它。我们在 CI 进程中自动创建安装程序,我们希望保持这种方式,它非常高效和可靠。最好的办法是以某种方式扩展 Omnibus 进程,这样我们也可以获得这个捆绑文件。但是,在这一点上我什至不确定这是否可能。
我真的卡住了,所以我很感激任何指点。
这是我们的 distribution.xml 文件以供参考,以防与此问题相关。它被 Omnibus 用于 productbuild 命令。我一直在研究扩展它的选项,但与捆绑包没有任何关系:
<?xml version="1.0" standalone="no"?>
<installer-gui-script minSpecVersion="1">
<title><%= friendly_name %></title>
<background file="background.png" alignment="bottomleft" mime-
type="image/png"/>
<welcome file="welcome.html" mime-type="text/html"/>
<license file="license.html" mime-type="text/html"/>
<!-- Generated by productbuild - - synthesize -->
<pkg-ref id="<%= identifier %>"/>
<options customize="never" require-scripts="false"/>
<choices-outline>
<line choice="default">
<line choice="<%= identifier %>"/>
</line>
</choices-outline>
<choice id="default"/>
<choice id="<%= identifier %>" visible="false">
<pkg-ref id="<%= identifier %>"/>
</choice>
<pkg-ref id="<%= identifier %>" version="<%= version %>"
onConclusion="none"><%= component_pkg %></pkg-ref>
<domains enable_anywhere="false" enable_currentUserHome="true"
enable_localSystem="false" />
</installer-gui-script>
our application is installed as it should
听起来您确实需要为您的发行版生成 .app
。
.app
是一个特殊的文件夹结构:
MyApp.app/
Contents/
Info.plist
MacOS/
executable
Frameworks/
library.dylib
Resources/
icon.icns
Frameworks/
中的库应该通过 install_name_tool
executable
例如,
install_name_tool -change /opt/local/lib/library.dylib @rpath/library.dylib MyApp.app/Contents/MacOS/executable
install_name_tool -add_rpath @executable_path/../Frameworks MyApp.app/Contents/MacOS/executable
大多数其他东西都可以归类为资源,除了 Contents/
文件夹外,其他任何东西都不能进入应用程序的顶层。
您可以 codesign
在应用完成并完全捆绑后。
当你回到你的其他软件时,使用 .app
创建一个 .dmg
,然后你可以 codesign
那。
在 .dmg
的典型安装中,用户通常会看到该应用程序和 /Applications 文件夹的别名。要安装,用户将应用程序拖到 /Applications 文件夹中。
一些 .dmg
创作软件会做更复杂的事情,例如显示背景或需要最终用户许可协议。