Macアプリケーション用の素敵なインストーラーを作成する必要があります。事前定義されたサイズ、レイアウト、背景画像を備えたディスクイメージ(DMG)にしたい。
これをプログラムでスクリプトで実行し、既存のビルドシステムに統合する必要があります(インストーラーのみを作成するため、実際にはパックシステムのようです。ビルドは個別に行われます)。
私はすでに「hdiutil」を使用してDMGの作成を行っていますが、アイコンのレイアウトを作成して背景のビットマップを指定する方法はまだわかりません。
Macアプリケーション用の素敵なインストーラーを作成する必要があります。事前定義されたサイズ、レイアウト、背景画像を備えたディスクイメージ(DMG)にしたい。
これをプログラムでスクリプトで実行し、既存のビルドシステムに統合する必要があります(インストーラーのみを作成するため、実際にはパックシステムのようです。ビルドは個別に行われます)。
私はすでに「hdiutil」を使用してDMGの作成を行っていますが、アイコンのレイアウトを作成して背景のビットマップを指定する方法はまだわかりません。
回答:
多くの調査の結果、私はこの答えを思いついたので、参考のために、これを自分の質問の答えとしてここに置きます。
[システム環境設定]> [ユニバーサルアクセス]で[支援デバイスのアクセスを有効にする]がオンになっていることを確認します。AppleScriptが機能するために必要です。この変更後に再起動が必要になる場合があります(Mac OS X Server 10.4ではそれ以外の方法では機能しません)。
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
ディスクイメージをマウントし、デバイス名を保存します(この操作後、数秒間スリープを使用することをお勧めします)。
device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
egrep '^/dev/' | sed 1q | awk '{print $1}')
背景画像(PNG形式)をDMGの「.background」というフォルダーに保存し、その名前を「backgroundPictureName」変数に保存します。
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
権限を適切に設定し、圧縮して解放することにより、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
sleep
.画像をマウンディングした後に推奨します。どのぐらいの間?プロセスの完了を確定的に待つことはできませんか?delay 5
AppleScriptでも同じです。私はそれらの非常に悪い経験があったので、そのような恣意的な待ち時間に常に警戒しています。2.ステップ6で、sync
2回電話をかけます。なぜですか。
カスタム背景、カスタムアイコンの配置、ボリューム名を使用して、ファンシーDMGを作成するcreate-dmgという小さなBashスクリプトがあります。
何年も前に、当時経営していた会社のために構築しました。それ以来、それは他の人々の貢献で生き残り、伝えられるところによればうまく機能します。
Node.jsに基づいたよりモダンでアクティブな作業のように見えるnode-appdmgもあります。同様にそれをチェックしてください。
/Applications
アプリがからの実行を検出した場合の自動コピーのボーナスポイント~/Downloads
。John Gruberによるこの古い記事も参照してください。
そこに行かないでください。長期のMac開発者として、私はあなたに保証することができます。実際にうまく機能している解決策はありません。私は非常に多くの解決策を試しましたが、それらはすべてあまり良くありません。問題は、Appleが実際に必要なデータのメタデータ形式を文書化していないことだと思います。
これが私が長い間それを非常にうまくやっている方法です:
予想されるバイナリとreadmeなどの追加ファイルを保持するのに十分な大きさの新しいDMG、writeable(!)を作成します(スパースが機能する場合があります)。
DMGをマウントし、Finderで手動で、またはそれを行うのに適したツールを使用してレイアウトを指定します(優れたツールについては、下部にあるFileStormリンクを参照してください)。背景画像は通常、DMGの非表示フォルダー(「.something」)に配置した画像です。アプリのコピーをそこに配置します(どのバージョンでも、古いバージョンでもかまいません)。必要な他のファイル(エイリアス、readmeなど)をコピーします。古いバージョンでも問題ありません。アイコンのサイズと位置が適切であることを確認してください(IOW、DMGを希望どおりにレイアウトします)。
DMGを再度マウント解除します。これで、すべての設定が保存されます。
次のように機能するDMG作成スクリプトを記述します。
この方法は最適に聞こえないかもしれませんが、私を信じて、それは実際には本当にうまく機能します。元のDMG(DMGテンプレート)をバージョン管理(例:SVN)のもとに置くことができるため、誤って変更/破棄した場合でも、問題のないリビジョンに戻ることができます。XMGプロジェクトにDMGテンプレートを追加し、DMGに属する他のすべてのファイル(readme、URLファイル、背景画像)をすべてバージョン管理下に置いてから、ターゲット(「Create DMG」という名前の外部ターゲットなど)を作成できます。上記のDMGスクリプトを実行し、古いメインターゲットを依存ターゲットとして追加します。スクリプトで$ {SRCROOT}を使用してXcodeツリーのファイルにアクセスでき(常に製品のソースルートです)、$ {BUILT_PRODUCTS_DIR}を使用してビルド製品にアクセスできます(常にXcodeがビルド結果を作成するディレクトリです) 。
結果:実際には、Xcodeはビルドの最後にDMGを生成できます。リリースの準備ができているDMG。このようにリリースDMGを非常に簡単に作成できるだけでなく、コマンドラインからxcodebuildを使用して(必要に応じて自動化されたナイトリービルドなど)、自動化されたプロセスで(必要に応じてヘッドレスサーバーで)実際に作成できます。
テンプレートの初期レイアウトに関しては、FileStormはそのための優れたツールです。それは商用ですが、非常に強力で使いやすいです。通常のバージョンは20ドル未満なので、非常に手頃な価格です。たぶん、FileStormを自動化してDMGを作成できます(例:AppleScriptを使用)。これを試したことがないかもしれませんが、完璧なテンプレートDMGが見つかったら、リリースごとに更新するのは本当に簡単です。
この回答を提供することにより、この質問を最新のものにします。
appdmg
シンプルなjson仕様からdmgファイルを作成する、シンプルで使いやすいオープンソースのコマンドラインプログラムです。公式Webサイトのreadmeをご覧ください。
https://github.com/LinusU/node-appdmg
簡単な例:
appdmgをインストールする
npm install -g appdmg
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" }
]
}
プログラムを実行する
appdmg spec.json test.dmg
(免責事項。私はappdmgの作成者です)
このトピックに関心のある方のために、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
私のアプリDropDMGは、背景画像、アイコンレイアウト、カスタムボリュームアイコン、およびソフトウェアライセンス契約を含むディスクイメージを簡単に作成する方法です。「dropdmg」コマンドラインツールまたはAppleScriptを介してビルドシステムから制御できます。必要に応じて、画像とライセンスのRTFファイルをバージョン管理システムに保存できます。
-私は、プロセスを自動化するために、この偉大なMACアプリ見つけhttp://www.araelium.com/dmgcanvas/を お使いのMacのアプリのためにDMGインストーラを作成している場合は、外観を持っている必要があります
見栄えの良いDMGを作成するには、よく書かれたオープンソースをいくつか使用するだけです。
カスタムボリュームアイコンを設定したい場合は、以下のコマンドを使用してください
/*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
私はようやくこれを自分のプロジェクト(たまたま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 /ディレクトリにあることを確認してください!
コマンドラインアプローチを使用して、パッケージ化とdmgの作成を「プログラムでスクリプトで」行う必要もあります。私がこれまでに見つけた最良の答えは、Adiumプロジェクトのリリース構築フレームワークからです(R1を参照)。OSX WindowsServer GUIの相互作用を回避できるようにするカスタムスクリプト(AdiumApplescriptRunner)があります。「osascript applescript.scpt」アプローチでは、ビルダーとしてログインし、コマンドラインvt100セッションからdmg作成を実行する必要があります。
OSXパッケージ管理システムは、このタスクを簡単かつ体系的に実行できる他のUnixenに比べてそれほど高度ではありません。
これを行うための新しい(フレンドリーな)コマンドラインユーティリティを作成しました。Finder / AppleScriptや(非推奨の)Alias Manager APIのいずれにも依存せず、設定と使用が簡単です。
とにかく、興味がある人は誰でもPyPiで見つけることができます。ドキュメントはRead The Docsから入手できます。
これらの答えは非常に複雑で、時代は変わりました。以下は10.9で問題なく動作しますが、権限は正しく、見栄えがします。
#!/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
#!/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
他に何かする必要がある場合、これらの最も簡単なことは、DMCを作成する前にSRC_DIRの一時的なコピーを作成し、それに変更を適用することです。