あまつぶ

7.7【ディスクイメージ作成の自動化】

 久しぶりにソフトウェアをリリース。IconParty 1.20b13。今回の大きな変更は、Mach-O版のリリースだ。見た目にはサムネイルアイコンがついたくらいしか変わらないけど、英語版のリソースも組み込んであったり、いろいろ細かいところもいじってみている。
 ドキュメントに書き忘れたけど(汗)、今回のバージョンから、インターネット経由でバージョンアップのチェックができる機能を試験的に追加してみた(Carbon版のみ)。「ヘルプ」メニューから「アップデートチェック」を選ぶと、インターネットにアクセスして新しいバージョンがあるかどうかを確認してくれる。もしあれば、変更内容をダイアログに表示して、必要ならブラウザを使ってダウンロードする、という仕組みだ。需要があるかどうかはわからないけど、まずは試験的にってことで。まあ、この機能が役に立つのは次のバージョンが出るときだから、しばらく先になるのだろうけど。

 ところで、今回のCarbon版は、前にリリースしたWebColorXと同じようにディスクイメージファイルをtar、gzipで圧縮した形で公開したのだけど、これを作るのは結構面倒だったりする。うまい方法を知らないだけかもしれないけど、私がやっている手順は、まず、DiskCopyで空のディスクイメージを作成してマウント、その中に必要なファイルをコピー、アンマウントしてからもう一度DiskCopyを開いて形式を変換(圧縮する)、最後にmake_tgz(Macintosh Programming 資料館)というユーティリティを使って圧縮という流れ。慣れればそれほどたいしたことはないのかもしれないけど、やっぱりめんどくさい。いつも同じことをやるだけなのだから、なんとか自動化できないものだろうか。また、DiskCopyでの変換にかなり時間がかかるのもいらいらする。
 と、そんなことを考えていたとき、iJect(Objective Development)のソースファイルの中に「makebindist.sh」と「mkimage.sh」いうファイルを発見。中を開いてみると、どうも、ビルド、必要なファイルのコピー、ディスクイメージの作成を自動的に行っているらしい。これをまねて、作成したディスクイメージにファイルをコピー、ディスクイメージの変換、圧縮までを行うものを作っておけばかなり楽ができそうだ。
 そう思ったら早速やってみる。まずは、必要なファイルを1か所に集めるところから。IconPartyの場合、アプリケーションとドキュメントをコピーするだけだから話は簡単だ。

 mkbindist.sh
#!/bin/sh

rm -rf BinaryDist

pbxbuild

mkdir BinaryDist
cp -R build/IconParty.app BinaryDist
cp -R "Documents/" BinaryDist

./mkimage.sh IconParty

こんな感じかな。なにをしているかというと、1行目はおまじないみたいなものだから気にしないことにして(いいのか(笑))、2行目(rm -rf BinaryDist)は「BinaryDist」フォルダの削除(-rの指定でサブフォルダも含めて削除、-fの指定で確認せずに削除)、3行目(pbxbuild)、同じフォルダ内にあるProjectBuilderのプロジェクトをビルド、4行目(mkdir BinaryDist)でフォルダを作って、5行目と6行目でファイル・フォルダをコピー(-Rの指定でサブフォルダも含めてコピー)。最後に、mkimage.shを「IconParty」というパラメータをつけて呼んでいる。
 注意しないといけないのは、改行コードをLFにしておくこと。CRになっていると正常に動作しない。

 さて、今度はディスクイメージの作成だ。なぜ2つのファイルにわけているかというと、おそらく、汎用性を高めるためだ。ディスクイメージを作る方は、いつも「BinaryDist」フォルダに入っているものをコピーするだけでいいのだら、いつでもほとんど同じ内容のまま使えるのだ。ということで、こちらも作ってみた。

 mkimage.sh
#!/bin/sh

volumeName="$1"
if [ -z "$volumeName" ]; then
volumeName=IconParty
fi
image="$volumeName".dmg
image2="$volumeName"2.dmg
archive="$volumeName".tgz

hdiutil create -megabytes 5 "$image" -layout NONE
disk=`hdid -nomount "$image"`
disk=`echo $disk`
sudo newfs_hfs -v "$volumeName" "$disk"
sudo hdiutil eject "$disk"

hdid "$image"

cp -R BinaryDist/ /Volumes/"$volumeName"

sudo hdiutil eject "$disk"

hdiutil convert "$image" -format UDZO -o "$image2"

mv "$image2" "$image"

tar -czf "$archive" "$image"

することが多いのでちょっと長いが、だいたいこんな感じ。まず、与えられたパラメータを「$1」で得て、ファイルに付ける名前を指定する(image、image2、archive)。そして、「hdiutil create」でディスクイメージファイルを作成して、「hdid」でマウント(まだフォーマットされていないので-nomountオプションでマウントしない)。さらに、newfs_hfsでマウントしたディスクをフォーマットする(-vでボリューム名を指定)。フォーマット後、アンマウントする。
 フォーマットできたら、今度は普通にマウントする(hdid)。そして、BinaryDistフォルダからファイルをコピーする(このコピー先の指定がいまいちな気もするが、同じボリューム名が存在しなければokってことで……)。コピーが終わったら、もう一度アンマウントする(ここのディスクの指定も上と同じようにもう一度すべきなんだろうけど)。
 あとは、ディスクイメージを変換する(hdiutil convert)。「UDZO」というフォーマットが、圧縮されたフォーマットのようだ。変換のときは、変換先を指定しなければいけないので、-oオプションで指定する。そして、変換する前のディスクイメージはもういらないので、変換したもので置き換える(mv)。最後に、tar -czfで作成したイメージファイルを圧縮知れば完了だ。

 そうだ。実行する方法について何も書いていなかった。プロジェクトファイルを置いているフォルダに、上記の2つのファイルを置いておく。そして、Terminalを立ち上げてそのフォルダをカレントフォルダにする。そして、「./mkbindist.sh」と入力するだけ(もちろん、改行する)。中で「sudo」を実行しているので、管理者(root)のパスワードを要求されるから「Password」と表示されたらパスワードを入力する。たったそれだけで、あとは放っておくだけ。ディスクイメージの変換は、DiskCopyでするよりもかなり速くて非常に快適だ。次のバージョンではこれを使うことにしよう。
 一つだけ気をつけないといけないこと。cpでファイルのコピーを行うと、リソースフォークの内容やファイルタイプ等の情報がすべて欠落してしまう。このため、必要なファイルの中にリソースを持ったものがある場合は注意が必要だ。ProjectBulderで普通にビルドしたものや、TextEditで作成したリッチテキストフォーマットの文書、HTMLやGIF、JPEGなどの画像については問題ないと思うが、私がはまったのはインターネットロケーションファイルだった。このファイルはリソースフォークにアドレスなどの情報を保存しているので、cpでコピーすると壊れてしまう。現状では、マウントまでを自動で行い、Finderでファイルをコピーしてから、圧縮するという流れにするしかない。これはなんとも面倒だ。なにかいい方法が見つかれば、また報告したいと思う。(※ dittoコマンドを使うと、リソースフォークまで含めてコピーできる。詳しくは02.7.13を参照)

 長くなってしまったので今回はこのへんで。次回は、Mozilla 1.0のビルド、あるいはGENE95という英和辞書を入れてみた話かもしれない。
June 24, 2002 ↑ 2002 index → July 13, 2002

あまつぶ >> あまつぶ >> July 7, 2002