224

Macアプリケーション用の素敵なインストーラーを作成する必要があります。サイズ、レイアウト、背景画像が事前定義されたディスクイメージ(DMG)にしたい。

これをスクリプトでプログラム的に実行して、既存のビルドシステムに統合する必要があります(インストーラーを作成するだけなので、実際にはパックシステムの方が多くなります。ビルドは個別に行われます)。

「hdiutil」を使用してDMGの作成をすでに行っていますが、アイコンレイアウトを作成し、背景ビットマップを指定する方法についてはまだわかりません。

4

15 に答える 15

204

多くの調査の後、私はこの答えを思いついたので、参考のために、私自身の質問に対する答えとしてここに掲載します。

  1. システム環境設定>>ユニバーサルアクセスで「補助デバイスへのアクセスを有効にする」にチェックが入っていることを確認してください。AppleScript が機能するために必要です。この変更後、再起動が必要になる場合があります (そうしないと、Mac OS X Server 10.4 では機能しません)。

  2. R/W DMG を作成します。結果よりも大きくする必要があります。この例では、bash 変数 "size" に Kb 単位のサイズが含まれており、"source" bash 変数のフォルダーの内容が DMG にコピーされます。

    hdiutil create -srcfolder "${source}" -volname "${title}" -fs HFS+ \
          -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${size}k pack.temp.dmg
    
  3. ディスク イメージをマウントし、デバイス名を保存します (この操作の後、数秒間スリープを使用することをお勧めします)。

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. 背景画像 (PNG 形式) を DMG の ".background" というフォルダーに保存し、その名前を "backgroundPictureName" 変数に保存します。

  5. AppleScript を使用してビジュアル スタイルを設定します (.app の名前は bash 変数「applicationName」にある必要があり、必要に応じて他のプロパティに変数を使用します)。

    echo '
       tell application "Finder"
         tell disk "'${title}'"
               open
               set current view of container window to icon view
               set toolbar visible of container window to false
               set statusbar visible of container window to false
               set the bounds of container window to {400, 100, 885, 430}
               set theViewOptions to the icon view options of container window
               set arrangement of theViewOptions to not arranged
               set icon size of theViewOptions to 72
               set background picture of theViewOptions to file ".background:'${backgroundPictureName}'"
               make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
               set position of item "'${applicationName}'" of container window to {100, 100}
               set position of item "Applications" of container window to {375, 100}
               update without registering applications
               delay 5
               close
         end tell
       end tell
    ' | osascript
    
  6. アクセス許可を適切に設定し、圧縮して解放することにより、DMG をファイナライズします。

    chmod -Rf go-w /Volumes/"${title}"
    sync
    sync
    hdiutil detach ${device}
    hdiutil convert "/pack.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "${finalDMGName}"
    rm -f /pack.temp.dmg 
    

Snow Leopard では、上記の AppleScript はアイコンの位置を正しく設定しません。これは Snow Leopard のバグのようです。1 つの回避策は、アイコンを設定した後に単純に close/open を呼び出すことです。つまり、次のようになります。

..
set position of item "'${applicationName}'" of container window to {100, 100}
set position of item "Applications" of container window to {375, 100}
close
open
于 2009-10-03T12:05:26.397 に答える
61

カスタムの背景、カスタムのアイコンの配置、およびボリューム名を使用して派手な DMG を構築する create-dmgと呼ばれる小さな Bash スクリプトがあります。

当時経営していた会社のために何年も前に構築しました。それ以来、他の人々の貢献によって存続しており、うまく機能していると報告されています。

また、Node.js に基づいたより現代的で積極的な取り組みのように見えるnode-appdmgもあります。それもチェックしてください。

于 2009-03-10T03:40:41.997 に答える
40

そこに行かないでください。長年の Mac 開発者として、本当にうまく機能するソリューションはありません。私は非常に多くの解決策を試しましたが、どれもあまり良くありません。問題は、Apple が必要なデータのメタデータ形式を実際に文書化していないことだと思います。

これが私が長い間やっている方法で、非常に成功しています:

  1. 予想されるバイナリ ファイルと readme などの追加ファイルを保持するのに十分な大きさの、書き込み可能な (!) 新しい DMG を作成します (スパースが機能する場合があります)。

  2. DMG をマウントし、Finder で手動で、またはそれを行うのに適したツールを使用してレイアウトを指定します。背景画像は通常、DMG の隠しフォルダー (".something") に入れられた画像です。アプリのコピーをそこに置きます (どのバージョンでも、古いものでもかまいません)。そこに必要な他のファイル (エイリアス、readme など) をコピーします。古いバージョンでも問題ありません。アイコンのサイズと位置が適切であることを確認します (IOW、DMG を希望どおりにレイアウトします)。

  3. DMG を再度アンマウントします。これで、すべての設定が保存されます。

  4. 次のように機能する create DMG スクリプトを記述します。

  • DMG をコピーするので、元の DMG には二度と触れません。
  • コピーをマウントします。
  • すべてのファイルを最新のもの (ビルド後の最新のアプリなど) に置き換えます。コマンドラインでmvまたはdittoを使用するだけです。そのようなファイルを置き換えると、アイコンは同じままで、位置も同じままで、ファイル(またはディレクトリ)の内容以外はすべて同じままです(少なくとも、そのタスクに通常使用する同上で) . もちろん、背景画像を別のものに置き換えることもできます (サイズが同じであることを確認してください)。
  • ファイルを置き換えた後、スクリプトで DMG コピーを再度アンマウントします。
  • 最後に、hdiutil を呼び出して、書き込み可能なものを圧縮された (書き込み不可能な) DMG に変換します。

この方法は最適とは言えないかもしれませんが、実際にはうまく機能します。元の DMG (DMG テンプレート) をバージョン管理 (SVN など) の下に置くこともできるので、誤って変更/破棄した場合でも、問題がなかったリビジョンに戻ることができます。DMG テンプレートを Xcode プロジェクトに追加し、DMG に属する他のすべてのファイル (readme、URL ファイル、背景画像) をすべてバージョン管理下に置いてから、ターゲット (たとえば、「Create DMG」という名前の外部ターゲット) を作成できます。上記の DMG スクリプトを実行し、古いメイン ターゲットを依存ターゲットとして追加します。スクリプトで ${SRCROOT} を使用して Xcode ツリーのファイルにアクセスでき (常に製品のソース ルート)、${BUILT_PRODUCTS_DIR} を使用してビルド製品にアクセスできます (常に Xcode がビルド結果を作成するディレクトリです)。 .

結果: 実際、Xcode はビルドの最後に DMG を生成できます。リリースの準備ができている DMG。この方法で非常に簡単にリリース DMG を作成できるだけでなく、コマンド ラインから xcodebuild を使用して (たとえば、自動化されたナイトリー ビルド)、自動化されたプロセスで (必要に応じてヘッドレス サーバー上で) 実際に作成できます。

于 2008-09-18T21:11:57.590 に答える
25

この回答を提供することで、この質問を最新のものにします。

appdmgシンプルな json 仕様から dmg ファイルを作成する、シンプルで使いやすいオープン ソースのコマンド ライン プログラムです。公式 Web サイトの readme を参照してください。

https://github.com/LinusU/node-appdmg

簡単な例:

  1. appdmg をインストールする

    npm install -g appdmg
    
  2. json ファイルを書き込む ( spec.json)

    {
      "title": "Test Title",
      "background": "background.png",
      "icon-size": 80,
      "contents": [
        { "x": 192, "y": 344, "type": "file", "path": "TestApp.app" },
        { "x": 448, "y": 344, "type": "link", "path": "/Applications" }
      ]
    }
    
  3. プログラムを実行

    appdmg spec.json test.dmg
    

(免責事項。私は appdmg の作成者です)

于 2015-01-23T15:12:07.197 に答える
22

このトピックに興味がある方のために、DMG の作成方法について説明する必要があります。

hdiutil create XXX.dmg -volname "YYY" -fs HFS+ -srcfolder "ZZZ"

どこ

XXX == disk image file name (duh!)
YYY == window title displayed when DMG is opened
ZZZ == Path to a folder containing the files that will be copied into the DMG
于 2008-09-18T21:13:35.620 に答える
13

私のアプリ、DropDMGは、背景画像、アイコン レイアウト、カスタム ボリューム アイコン、およびソフトウェア ライセンス契約を含むディスク イメージを簡単に作成する方法です。これは、「dropdmg」コマンドライン ツールまたは AppleScript を介してビルド システムから制御できます。必要に応じて、画像とライセンスの RTF ファイルをバージョン管理システムに保存できます。

于 2010-06-30T15:38:26.373 に答える
9

見栄えの良い DMG を作成するために、よく書かれたオープン ソースを使用することができます。

于 2015-12-20T13:23:04.200 に答える
6

プロセスを自動化するこの素晴らしい Mac アプリを見つけました - http://www.araelium.com/dmgcanvas/ Mac アプリ用の dmg インストーラーを作成している場合は、必ず確認してください。

于 2012-02-22T14:05:40.860 に答える
5

カスタム ボリューム アイコンを設定する場合は、以下のコマンドを使用します。

/*Add a drive icon*/
cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"  


/*SetFile -c icnC will change the creator of the file to icnC*/
SetFile -c icnC /<your path>/.VolumeIcon.icns

今すぐ読み取り/書き込みdmgを作成します

/*to set custom icon attribute*/
SetFile -a C /Volumes/dmgName
于 2013-08-26T12:16:54.023 に答える
2

.DS_Store ファイルは、Windows の設定を Mac に保存します。Windows の設定には、アイコンのレイアウト、ウィンドウの背景、ウィンドウのサイズなどが含まれます。ファイルの配置とウィンドウの背景を保持するために、マウントされたイメージのウィンドウを作成するには、.DS_Store ファイルが必要です。

.DS_Store ファイルを作成したら、作成したインストーラー (DMG) にコピーするだけです。

于 2010-04-14T08:09:40.290 に答える
2

また、「スクリプトでプログラムで」パッケージ化とdmgの作成を行うには、コマンドラインアプローチを使用する必要があります。これまでに見つけた最良の答えは、Adium プロジェクトのリリース ビルディング フレームワーク (R1 を参照) によるものです。OSX WindowsServer GUI の対話を回避できるカスタム スクリプト (AdiumApplescriptRunner) があります。「osascript applescript.scpt」アプローチでは、ビルダーとしてログインし、コマンド ライン vt100 セッションから dmg 作成を実行する必要があります。

OSX パッケージ管理システムは、このタスクを簡単かつ体系的に実行できる他の Unixen と比較して、それほど高度ではありません。

R1: http://hg.adium.im/adium-1.4/file/00d944a3ef16/Release

于 2011-10-09T12:55:20.087 に答える