実行ファイルにまとめる
hana packで、自分のプログラムをHanaがないコンピューターでも動く実行ファイル1つにまとめます。
自分が作ったプログラムを友達に渡すとき、普通は「まずHanaをインストールしてください」と言わなければなりません。hana packはそれをなくしてくれます。プログラムを実行ファイル1つにまとめるので、受け取った人はHanaなしで、ダブルクリックするか、ターミナルで名前を打つだけで実行できます。
まとめてみる
hana pack アプリ.knd
同じフォルダにアプリ.exe(Windows)またはアプリ(LinuxやMac)ができます。名前を決めるには-oを使います。
hana pack アプリ.knd -o マイアプリ
ハリのプログラム(.hr)も同じようにまとめられます。まとめる前にhana run --bc アプリ.kndで動かしてみると、まとめたあとと同じ方式(バイトコード)で確認できます。
中には何が入っているの?
まとめたファイルは、3つをつなげたものです。
- 小さなランタイム: プログラムを動かすのに必要なものだけを入れた
hana-runtime(約6MB)です。ソースを読むパーサーや言語サーバーは入っていません。 - プログラム: ソースをあらかじめコンパイルしたバイトコードです。持ってきたカナデ・ハリのファイルや、
hana addで取ってきたパッケージのコードもこのときに一緒に入ります。なので、受け取る人にソースファイルやhana.jsonは必要ありません。 - ネイティブライブラリ(あれば): パッケージがネイティブライブラリを使うなら、一緒に用意されます。
hana packを使うには、hana実行ファイルの隣にhana-runtimeが必要です。Hanaを自分でビルドしたなら、READMEの案内どおりにhana-runtimeも一緒に作っておいてください。
ネイティブライブラリはどこに置くの?
標準では、実行ファイルの隣のlibraries/フォルダです。まとめた実行ファイルとこのフォルダを一緒に渡す必要があります。
マイアプリ.exe
libraries/
└── http_server.dll
フォルダなしでファイル1つだけを渡したいなら、--embedを付けます。ライブラリが実行ファイルの中に圧縮されて入り、最初に実行するときにユーザーのキャッシュフォルダに1回だけ展開されます。
hana pack サーバー.knd --embed
ほかのOS向けに作る
--targetで、ほかのOSやCPU向けの実行ファイルを作れます。WindowsでLinux向けを作る、といった使い方です。
hana pack アプリ.knd --target linux-amd64
そのプラットフォーム向けのランタイムが必要です。hanaの隣にhana-runtime-linux-amd64という名前で置くか、--runtimeでパスを教えてください。ランタイムはHanaのソースから、GOOS=linux GOARCH=amd64 go build -o hana-runtime-linux-amd64 ./cmd/hana-runtimeのようにして作ります。
オプションのまとめ
| オプション | できること |
|---|---|
-o 名前 |
作る実行ファイルのパス。省略すると入力ファイルの名前を使います |
--embed |
ネイティブライブラリを実行ファイルの中に入れます |
--target プラットフォーム |
windows-amd64、linux-arm64のように、作るプラットフォーム |
--runtime ファイル |
ベースにするhana-runtimeファイル |
知っておくこと
- まとめたプログラムはバイトコードエンジンで動きます。バイトコードエンジンが対応していない機能(変数の名前を文字列から作って呼ぶ動的な呼び出し)は、まとめたプログラムでは使えません。
hana run --bcで事前に確認してください。 - プログラムが読むデータファイル(
【ファイル】で開くファイルなど)はまとめられません。実行するコンピューターに別に置いておく必要があります。 - コード署名が必要なら、まとめたあとで署名してください。実行ファイルの後ろに何かを付け足すと、署名が壊れます。