web-dev-qa-db-ja.com

コマンドラインツールを使用してMac OS X用の見栄えの良いDMGを作成するにはどうすればよいですか?

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

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

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

205
Ludvig A. Norin

たくさんの研究の末、私はこの答えを思いつきました。参照のために、ここに自分の質問に対する答えとしてここに入れます。

  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
191
Ludvig A. Norin

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

私は何年も前に、その時に経営していた会社のためにそれを作りました。それ以来、他の人々の貢献で生き残り、うまく機能していると伝えられています。

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

56

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

ここに私が長い間やっている方法があります。

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

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

  3. DMGを再度マウント解除します。すべての設定は今までに保存されているはずです。

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

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

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

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

テンプレートの初期レイアウトに関して、 FileStorm はそれを行うための優れたツールです。商用ですが、非常に強力で使いやすいです。通常バージョンは20ドル未満なので、本当に手頃な価格です。 FileStormを自動化してDMGを作成する(たとえばAppleScriptを介して)こともできますが、それを試したことはありませんが、完璧なテンプレートDMGが見つかったら、リリースごとに簡単に更新できます。

37
Mecki

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

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の作成者です)

26
Linus Unnebäck

このトピックに興味のある方のために、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
22
Ludvig A. Norin

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

14
Michael Tsai

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

5
Saurabh

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

/*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
4
Parag Bafna

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

4
Anni S

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

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

2
hor10zs

また、コマンドラインアプローチを使用して、パッケージ化と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

2
T.J. Yang

私はついに自分のプロジェクトでこれを機能させました(たまたまXcodeでした)。これらの3つのスクリプトをビルドフェーズに追加すると、製品のディスクイメージが自動的に作成されます。あなたがしなければならないのは、プロジェクトをビルドするだけで、DMGは製品フォルダーで待機します。

スクリプト1(一時ディスクイメージの作成):

#!/bin/bash
#Create a R/W DMG

dir="$TEMP_FILES_DIR/disk"
dmg="$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg"

rm -rf "$dir"
mkdir "$dir"
cp -R "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app" "$dir"
ln -s "/Applications" "$dir/Applications"
mkdir "$dir/.background"
cp "$PROJECT_DIR/$PROJECT_NAME/some_image.png" "$dir/.background"
rm -f "$dmg"
hdiutil create "$dmg" -srcfolder "$dir" -volname "$PRODUCT_NAME" -format UDRW

#Mount the disk image, and store the device name
hdiutil attach "$dmg" -noverify -noautoopen -readwrite

スクリプト2(ウィンドウプロパティスクリプトの設定):

#!/usr/bin/osascript
#get the dimensions of the main window using a bash script

set {width, height, scale} to words of (do Shell script "system_profiler SPDisplaysDataType | awk '/Main Display: Yes/{found=1} /Resolution/{width=$2; height=$4} /Retina/{scale=($2 == \"Yes\" ? 2 : 1)} /^ {8}[^ ]+/{if(found) {exit}; scale=1} END{printf \"%d %d %d\\n\", width, height, scale}'")
set x to ((width / 2) / scale)
set y to ((height / 2) / scale)

#get the product name using a bash script
set {product_name} to words of (do Shell script "printf \"%s\", $PRODUCT_NAME")
set background to alias ("Volumes:"&product_name&":.background:some_image.png")

tell application "Finder"
    tell disk product_name
        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 {x, y, (x + 479), (y + 383)}
        set theViewOptions to the icon view options of container window
        set arrangement of theViewOptions to not arranged
        set icon size of theViewOptions to 128
        set background picture of theViewOptions to background
        set position of item (product_name & ".app") of container window to {100, 225}
        set position of item "Applications" of container window to {375, 225}
        update without registering applications
        close
    end tell
end tell

上記のウィンドウの測定は、特に私の背景写真のサイズとアイコンの解像度のために私のプロジェクトで機能します。独自のプロジェクトでこれらの値を変更する必要がある場合があります。

スクリプト3(最終ディスクイメージスクリプトの作成):

#!/bin/bash
dir="$TEMP_FILES_DIR/disk"
cp "$PROJECT_DIR/$PROJECT_NAME/some_other_image.png" "$dir/"

#unmount the temp image file, then convert it to final image file
sync
sync
hdiutil detach /Volumes/$PRODUCT_NAME
rm -f "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"
hdiutil convert "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"
rm -f "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg"

#Change the icon of the image file
sips -i "$dir/some_other_image.png"
DeRez -only icns "$dir/some_other_image.png" > "$dir/tmpicns.rsrc"
Rez -append "$dir/tmpicns.rsrc" -o "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"
SetFile -a C "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg"

rm -rf "$dir"

使用している画像ファイルが$ PROJECT_DIR/$ PROJECT_NAME /ディレクトリにあることを確認してください!

2
P.M.

これを行うための新しい(使いやすい)コマンドラインユーティリティを作成しました。 Finder/AppleScript、または(非推奨の)Alias Manager APIに依存せず、設定と使用が簡単です。

とにかく、興味がある人は誰でもできます PyPiで見つけてください ;ドキュメントは Read The Docsで入手可能 です。

1
alastair

これらの答えは非常に複雑であり、時代は変わりました。以下は10.9で問題なく動作します。パーミッションは正しく、見た目もいいです。

ディレクトリから読み取り専用DMGを作成する

#!/bin/sh
# create_dmg Frobulator Frobulator.dmg path/to/frobulator/dir [ 'Your Code Sign Identity' ]
set -e

VOLNAME="$1"
DMG="$2"
SRC_DIR="$3"
CODESIGN_IDENTITY="$4"

hdiutil create -srcfolder "$SRC_DIR" \
  -volname "$VOLNAME" \
  -fs HFS+ -fsargs "-c c=64,a=16,e=16" \
  -format UDZO -imagekey zlib-level=9 "$DMG"

if [ -n "$CODESIGN_IDENTITY" ]; then
  codesign -s "$CODESIGN_IDENTITY" -v "$DMG"
fi

アイコン(.icnsタイプ)を使用して読み取り専用DMGを作成する

#!/bin/sh
# create_dmg_with_icon Frobulator Frobulator.dmg path/to/frobulator/dir path/to/someicon.icns [ 'Your Code Sign Identity' ]
set -e
VOLNAME="$1"
DMG="$2"
SRC_DIR="$3"
ICON_FILE="$4"
CODESIGN_IDENTITY="$5"

TMP_DMG="$(mktemp -u -t XXXXXXX)"
trap 'RESULT=$?; rm -f "$TMP_DMG"; exit $RESULT' INT QUIT TERM EXIT
hdiutil create -srcfolder "$SRC_DIR" -volname "$VOLNAME" -fs HFS+ \
               -fsargs "-c c=64,a=16,e=16" -format UDRW "$TMP_DMG"
TMP_DMG="${TMP_DMG}.dmg" # because OSX appends .dmg
DEVICE="$(hdiutil attach -readwrite -noautoopen "$TMP_DMG" | awk 'NR==1{print$1}')"
VOLUME="$(mount | grep "$DEVICE" | sed 's/^[^ ]* on //;s/ ([^)]*)$//')"
# start of DMG changes
cp "$ICON_FILE" "$VOLUME/.VolumeIcon.icns"
SetFile -c icnC "$VOLUME/.VolumeIcon.icns"
SetFile -a C "$VOLUME"
# end of DMG changes
hdiutil detach "$DEVICE"
hdiutil convert "$TMP_DMG" -format UDZO -imagekey zlib-level=9 -o "$DMG"
if [ -n "$CODESIGN_IDENTITY" ]; then
  codesign -s "$CODESIGN_IDENTITY" -v "$DMG"
fi

他に何かを行う必要がある場合、これらの最も簡単なことは、SRC_DIRの一時コピーを作成し、DMGを作成する前に変更を適用することです。

1
user246672