1. ホーム
  2. マコス

[解決済み】コマンドラインツールでMac OS X用の見栄えの良いDMGを作成する方法は?

2022-04-06 22:36:36

質問

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

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

DMGの作成は"hdiutil"ですでにできているのですが、まだわかっていないのは、アイコンレイアウトの作成方法と背景ビットマップの指定方法です。

どのように解決するのですか?

いろいろ調べた結果、このような答えにたどり着きましたので、私自身の質問の答えとして、ここに参考までに載せておきます。

  1. システム環境設定>ユニバーサルアクセスで、"支援機器のアクセスを有効にする"がチェックされていることを確認してください。アップルスクリプトを動作させるために必要です。この変更後、再起動が必要になる場合があります(Mac OS X Server 10.4では、これ以外の方法では動作しません)。

  2. R/W DMGを作成します。結果が出るより大きくなければならない。この例では、bash変数 "size"にKb単位のサイズが格納され、bash変数 "source"のフォルダの中身が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. DMG内の".background"というフォルダに背景画像(PNG形式)を格納し、その名前を"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では、上記のアップルスクリプトは、アイコンの位置を正しく設定しません。回避策としては、アイコンを設定した後に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