【備忘録】Unix実行ファイルをアプリケーション(.appファイル)化
したいこと
Unix実行ファイルをアプリケーション(.appファイル)化して、ターミナルを開かなくても実行できるようにしたいです。
Swift製でないアプリをXcodeを用いずにアプリケーション化できるのかを調べました。
今回は特に、go build
で作成した以下の記事のアプリのバイナリをアプリケーション化しようと思います。
以下では、名称などもこのアプリにあわせるので、適宜自分のアプリの名前に変えてください。
決まった名前にしなければならないものには注釈をつけています。
.appファイルとは
次の記事にあるように、appファイルとは、「ある約束事に基づいたディレクトリ構造をもつディレクトリ」です。
/Application
ディレクトリの中の好きなアプリケーションを右クリックして、内容を表示を押すことで、アプリケーションのディレクトリ構造が確認できます。基本的に同じようなディレクトリ構成になっていることがわかります。
具体的には、最低限以下のディレクトリ構造を持てばよいです。
$ /Applications/goids.app:$ tree .
.
└── Contents
├── Info.plist
├── MacOS
│ └── goids
└── Resources
goids
は今回アプリケーション化したい、Unix実行ファイルです。
この記事もご参照ください。
ディレクトリを作成
まず、アプリケーションのためのディレクトリを作成してください。好きな場所で作成して問題ないです。
アプリ名.appとしてください。
その中に、Contentsディレクトリを作成し、
- Info.plistファイル
- MacOSディレクトリ
- Resourcesディレクトリ
を追加してください。
最終的には以下のようになります。
.
└── Contents
├── Info.plist
├── MacOS
│ └── goids
└── Resources
MacOS
ここにアプリケーション化したいUnix実行ファイルを設置してください。
今回は、goids
を設置しています。
Info.plist
Info.plistはXMLフォーマットのテキストで、アプリケーションの設定を記述していきます。
最低限の記述は次のとおりです。
CFBundleExecutable
の値をUnix実行ファイルの名前を記述してください。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>goids</string>
</dict>
</plist>
アプリケーションをクリックすると、ここで設定されたファイルが実行されるようです。今回はUnix実行ファイルですが、shellスクリプトなどでも可能です。
その他の設定項目は、documentをご確認ください。
アイコンを設定
基本的には、今まで手順でアプリケーション化はできています。
しかし、そのままでは、デフォルトのアイコンが設定されるので、すこし不細工です。せっかくなのでアイコンも設定しておきましょう。
icnsファイルを用意する
.icnsファイルはMacで使用されるアイコンを複数のサイズでまとめたディレクトリです。
詳しくは以下の記事をご参照ください。
.iconsetディレクトリは頑張って作るしかないです。convert
コマンドを使用するとコマンドラインで画像のサイズを変更できるのでおすすめです。
自分は次のようなコードを書いて、多少の手間を省きました。
pythonファイル
import os
if __name__ == "__main__":
commands = [
"convert -resize 1024x1024! -density 144 goid.png goids.iconset/icon_512x512@2x.png",
"convert -resize 512x512! -density 72 goid.png goids.iconset/icon_512x512.png",
"convert -resize 512x512! -density 144 goid.png goids.iconset/icon_256x256@2x.png",
"convert -resize 256x256! -density 72 goid.png goids.iconset/icon_256x256.png",
"convert -resize 256x256! -density 144 goid.png goids.iconset/icon_128x128@2x.png",
"convert -resize 128x128! -density 72 goid.png goids.iconset/icon_128x128.png",
"convert -resize 64x64! -density 144 goid.png goids.iconset/icon_32x32@2x.png",
"convert -resize 32x32! -density 72 goid.png goids.iconset/icon_32x32.png",
"convert -resize 32x32! -density 144 goid.png goids.iconset/icon_16x16@2x.png",
"convert -resize 16x16! -density 72 goid.png goids.iconset/icon_16x16.png",
]
for command in commands:
os.system(command)
Resourcesに設置
Resourcesディレクトリに先ほど作成した.icnsファイルを設置してください。
おそらく名前は自由ですが、他のアプリケーションに倣ってAppIcon.icnsとしました。
Info.plistに追記
アイコンの情報をInfo.plistに追加します。
それぞれの値は、先ほど追加した.icnsファイルの名前に揃えてください。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
+ <key>CFBundleIconFile</key>
+ <string>AppIcon</string>
+ <key>CFBundleIconName</key>
+ <string>AppIcon</string>
<key>CFBundleExecutable</key>
<string>goids-ebiten</string>
</dict>
</plist>
これでアイコンが表示されたと思います。
まとめ
案外簡単にアプリケーション化することができました。
今のままだと、実行した際にDockにアイコンが表示され続けるので、メニューバーに追加したいのですが、方法が分からなかったです。SwiftやXCodeが必要なのかもしれません。
参考記事
参考記事をまとめておきます。
Discussion