[Mac] OS Xでプログラムの美しい.dmgイメージを作成する

Habrの名誉ある住民への挨拶!



今日は、私のプログラムのインストーラーをユーザーに美しく表示する方法を説明します。 確かに、AppStoreのプログラムだけでなく、Adiumなどの美しい.dmgディスクイメージを使用している人は誰でもいます。 このような画像は、いわば、対話型インストーラーであり、明確なヒントが与えられます。ここにアイコンをドラッグします。 すべてが非常に明確でシンプルです。



もちろん、経験豊富なMac OSプレーヤーの場合、zipアーカイブで十分ですが、誰もがそれが美しく便利であることを気に入っています。 読者の皆さん、今日は、私たちの(まあ、または他の誰かの)プログラム用にこのような美しいディスクイメージを作成することに注意してください。



もちろん、これはすべて手動で行うことができますが、これはMethod™ではないため、このプロセスを自動化するシェルスクリプトを記述します。 自動化は、ビルドサーバーのコミッションの場合にも役立ちます。このサーバーは、ソースからプログラムをコンパイルするだけでなく、配布用のディスクイメージも作成します。



そのようなスクリプトがどのように機能するを知る必要はなく、 ツールのみが必要な場合-最後に、すぐに使用できる非常に普遍的なスクリプトへのリンクがあります。



アクションプランの概要:





重要! TotalFinder (または同様のもの)がインストールされている場合、スクリプト(より正確には、AppleScriptを含む部分)は適切に動作せず、これは予測できない結果を招く可能性があります! 真剣に。



さて、すべてのカウントで順番に。 記事の最後にある完成したスクリプトへのリンク。



まず、何をパックし、最後にどのイメージ名を取得するかを決定する必要があります。 これを行うには、次のようなスクリプトを作成します。



TMP_DIR="./tmp" APP_BUNDLE_NAME="MyGreatApplication.app" APP_VERSION=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${APP_BUNDLE_NAME}/Contents/Info.plist"` APP_BUILD_VERSION=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${APP_BUNDLE_NAME}/Contents/Info.plist"` DMG_NAME_BASE=${APP_BUNDLE_NAME%.*} DMG_NAME_SUFFIX=" ${APP_VERSION}.${APP_BUILD_VERSION}" DMG_NAME="${DMG_NAME_BASE}${DMG_NAME_SUFFIX}.dmg" VOL_NAME=${APP_BUNDLE_NAME%.*}
      
      





ここでは、パッケージ化するバンドルの名前を設定し、PlistBuddyユーティリティを使用してそこからプログラムのバージョンとビルドを読み取り、将来のディスクイメージのファイル名のサフィックスとして設定します。 マウントするとき、イメージの名前を単に拡張子のないバンドルの名前として指定します。



一時ディスクイメージを作成するには、hdiutilプログラムを使用し、次のパラメーターで呼び出します。



 hdiutil create -ov -srcfolder ${TMP_DIR} -format UDRW -volname "${VOL_NAME}" "${DMG_NAME_TMP}"
      
      





ここで、パラメーターTMP_DIR



VOL_NAME



、およびDMG_NAME_TMP



は、それぞれ一時ディレクトリー、イメージの名前(マウント時に表示されます)、および一時.dmgファイルの名前です。 -format UDRW



は、イメージのタイプを示し-format UDRW



:読み取りおよび書き込み用のUDIFイメージ。 マウントされたイメージの外観をカスタマイズするには、ディスクに書き込む機能が必要です。 -ovパラメーターは、最後に削除しなかった場合、イメージを上書きするようユーティリティに指示します。



次に、結果のイメージをマウントします(そして将来の使用のためにデバイス名を保存します):



 device=$(hdiutil attach -readwrite -noverify -noautoopen ${DMG_NAME_TMP} | egrep '^/dev/' | sed 1q | awk '{print $1}')
      
      





ここではすべてが非常に簡単です:読み取りおよび書き込み権限をアタッチし、ファインダーウィンドウを自動的に開かずに、egrep、sedを使用してタイプ名/dev/disk2



を取得し、awdiutilの出力を解析します。



次に、背景画像とアイコンを画像にコピーします。これは、たとえば、バンドルのリソースにあります(もちろん、他のどこからでも取得できます)。



 BG_FOLDER="/Volumes/${VOL_NAME}/.background" mkdir "${BG_FOLDER}" cp "${APP_BUNDLE_NAME}/Contents/Resources/${BG_IMG_NAME}" "${BG_FOLDER}/" ICON_FOLDER="/Volumes/${VOL_NAME}" cp "${APP_BUNDLE_NAME}/Contents/Resources/${VOL_ICON_NAME}" "${ICON_FOLDER}/.VolumeIcon.icns"
      
      





次に、マウントされたイメージをカスタマイズする必要があります。これは、Finderを使用して手動で行うことができますが、もっと巧妙に行います。FinderがAppleScriptを使用してすべてを自動的に行うようにします。 このようなスクリプトをシェルから呼び出すには、 osascriptユーティリティがあります。このユーティリティは、このようなワークピースを入力に送信します。



 APPLESCRIPT=" tell application \"Finder\" tell disk \"${VOL_NAME}\" open -- Setting view options 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 {${WINDOW_LEFT}, ${WINDOW_TOP}, ${WINDOW_RIGHT}, ${WINDOW_BOTTOM}} set theViewOptions to the icon view options of container window set arrangement of theViewOptions to not arranged set icon size of theViewOptions to 72 -- Settings background set background picture of theViewOptions to file \".background:${BG_IMG_NAME}\" -- Adding symlink to /Applications make new alias file at container window to POSIX file \"/Applications\" with properties {name:\"Applications\"} -- Reopening close open -- Rearranging set the position of item \"Applications\" to {${APPS_X}, ${APPS_Y}} set the position of item \"${APP_BUNDLE_NAME}\" to {${BUNDLE_X}, ${BUNDLE_Y}} -- Updating and sleeping for 5 secs update without registering applications delay 5 end tell end tell " echo "$APPLESCRIPT" | osascript
      
      





もちろん、 VOL_NAME



などの代わりに、シェルスクリプトは事前に準備された行を置き換えます。 このAppleScriptは、マウントされたドライブを開き、必要な表示オプションを設定するようにフェーダーに指示します。アドレスとステータスバーを削除し、「アイコン」の外観を設定し、ウィンドウサイズ、アイコンサイズを設定します。 これらのパラメーターはすべて.DS_Storeファイルに保存されます。 次に、前にコピーした背景画像を設定します。 次に、/アプリケーションのシンボリックリンク(AS用語で別名)を作成し、変更を適用するためにウィンドウを再度開きます。 次に、信頼性のために、プログラムアイコンと作成されたシンボリックリンクの位置を設定し、5秒更新してスリープします。



SetFileユーティリティを使用して、画像のアイコンを設定します。



 SetFile -c icnC "${ICON_FOLDER}/.VolumeIcon.icns" SetFile -a C "${ICON_FOLDER}"
      
      





次に、ディスクイメージに必要な権限を設定し、同期(信頼性のために2回)およびイメージを抽出します。



 chmod -Rf go-w /Volumes/"${VOL_NAME}" sync sync hdiutil detach ${device}
      
      





これで、最終的なディスクイメージを作成できます。



 hdiutil convert "${DMG_NAME_TMP}" -format UDZO -imagekey zlib-level=9 -o "${DMG_NAME}"
      
      





ここでは、hdiutilを使用して、一時イメージを圧縮レベル9(最高)のUDZO形式(UDIF圧縮)に変換します。 そして、出力では、魅力的な外観を持つ配布用のディスクイメージを取得します!



完全なスクリプトはgithubリポジトリに含まれています。 スクリプトのフルバージョンには、多くの入力パラメーター(解析によりサイズが大幅に増加する)があり、ハードコードはまったくありません(既定のパラメーターを除く)。 さて、投稿の冒頭の写真は、次のスクリプトの呼び出しによって取得されます。



 $ make_dmg.sh -V -b habr_logo_big.png -i habr_icon.icns -s "800:500" -c 535:345:253:345 "Hello Habr.app" Enabling version info in resulting dmg Setting background to habr_logo_big.png Setting icon to habr_icon.icns Setting window size to 800:500 Setting coordinates to 535:345:253:345 Bundle name set to Hello Habr.app Defaulting dmg volume name to Hello Habr *** Copying Hello Habr.app to the temporary dir... done! *** Creating temporary dmg disk image......... created: /Users/silvansky/Projects/habr_demo_dmg/Hello Habr_tmp.dmg *** Mounting temporary image... done! (device /dev/disk1) *** Sleeping for 5 seconds... done! *** Setting style for temporary dmg image... * Copying background image... done! * Copying volume icon... done! * Setting volume icon... done! * Executing applescript for further customization... done! *** Converting tempoprary dmg image in compressed readonly final image... * Changing mode and syncing... chmod: /Volumes/Hello Habr/.Trashes: Permission denied * Detaching /dev/disk1... "disk1" unmounted. "disk1" ejected. * Converting...    …  Driver Descriptor Map (DDM : 0)… (CRC32 $AF5ACFAD: Driver Descriptor Map (DDM : 0))  Apple (Apple_partition_map : 1)… (CRC32 $92261EDC: Apple (Apple_partition_map : 1))  disk image (Apple_HFS : 2)… ................................................................................................................................................................................... (CRC32 $F59F12B2: disk image (Apple_HFS : 2))  (Apple_Free : 3)… .................................................................................................................................................................................... (CRC32 $00000000: (Apple_Free : 3))  … .................................................................................................................................................................................... : 804.502ms  : 4132028 , : CRC32 $AFE83FC5  : 13243, 10041  : 6.1 M/ : 39.1 % created: /Users/silvansky/Projects/habr_demo_dmg/Hello Habr 1.0.1.dmg done! *** Removing temporary image... done! *** Cleaning up temp folder... done! *** Everything done. DMG disk image is ready for distribution.
      
      





さて、今ではあなたはそのような目的のためにあなた自身のスクリプトを書くか、非常に普遍的なものを使うことができます。 成功したプロジェクト!



All Articles