🍎

【備忘録】Unix実行ファイルをアプリケーション(.appファイル)化

2024/01/02に公開

したいこと

Unix実行ファイルをアプリケーション(.appファイル)化して、ターミナルを開かなくても実行できるようにしたいです。
Swift製でないアプリをXcodeを用いずにアプリケーション化できるのかを調べました。

今回は特に、go buildで作成した以下の記事のアプリのバイナリをアプリケーション化しようと思います。

https://zenn.dev/hamao/articles/f0efd80c46db3d

以下では、名称などもこのアプリにあわせるので、適宜自分のアプリの名前に変えてください。
決まった名前にしなければならないものには注釈をつけています。

.appファイルとは

次の記事にあるように、appファイルとは、「ある約束事に基づいたディレクトリ構造をもつディレクトリ」です。

https://qiita.com/yamaq/items/8af0ede09b1ba2f8c26e

/Applicationディレクトリの中の好きなアプリケーションを右クリックして、内容を表示を押すことで、アプリケーションのディレクトリ構造が確認できます。基本的に同じようなディレクトリ構成になっていることがわかります。
具体的には、最低限以下のディレクトリ構造を持てばよいです。

$ /Applications/goids.app:$ tree .
.
└── Contents
    ├── Info.plist
    ├── MacOS
    │   └── goids
    └── Resources

goidsは今回アプリケーション化したい、Unix実行ファイルです。

この記事もご参照ください。

http://www.maruko2.com/mw/MacOSXでシェルスクリプトを.app形式のアプリケーションにするmkapp.app

ディレクトリを作成

まず、アプリケーションのためのディレクトリを作成してください。好きな場所で作成して問題ないです。
アプリ名.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をご確認ください。

https://developer.apple.com/documentation/technologies

アイコンを設定

基本的には、今まで手順でアプリケーション化はできています。
しかし、そのままでは、デフォルトのアイコンが設定されるので、すこし不細工です。せっかくなのでアイコンも設定しておきましょう。

icnsファイルを用意する

.icnsファイルはMacで使用されるアイコンを複数のサイズでまとめたディレクトリです。
詳しくは以下の記事をご参照ください。

https://wakabamac.hatenablog.com/entry/2017/04/02/034254

.iconsetディレクトリは頑張って作るしかないです。convertコマンドを使用するとコマンドラインで画像のサイズを変更できるのでおすすめです。
自分は次のようなコードを書いて、多少の手間を省きました。

pythonファイル
resize.py
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が必要なのかもしれません。

参考記事

参考記事をまとめておきます。

https://qiita.com/yamaq/items/8af0ede09b1ba2f8c26e

http://www.maruko2.com/mw/MacOSXでシェルスクリプトを.app形式のアプリケーションにするmkapp.app

https://wakabamac.hatenablog.com/entry/2017/04/02/034254

https://developer.apple.com/documentation/technologies

https://www.networkworld.com/article/972296/resizing-images-on-the-linux-command-line.html

Discussion