はじめに
タイトルをキャッチーにしたのは人集めです。ご容赦ください。あまりシングルバイナリの話はしていません。調べ物のスタートに使ってください。
- Rubyでツールを配布するときにはGemにするのが一般的である。
- 単純なツールであればCrystalで書いてバイナリにすることもできる。
Crystalで静的にリンクしたバイナリを作成する
公式では、
crystal build a.cr --static
とすればいいことにされているが、実際には動作しないことが多い。
そこで、muslのライブラリを使っている公式のDockerイメージを使用するとLinux用のバイナリを出力できる。
たとえばこんな感じ。
docker run --rm -it \
-v $(pwd):/workspace \
-w /workspace \
crystallang/crystal:latest-alpine \
crystal build a.cr --static --release
Shardsのライブラリなどを利用していて、C言語のライブラリに依存していることもあるだろう。その場合は下のようなコマンドを使ってツールをインストールしたりして頑張る。
docker exec alpine apk add cmake build-base readline-dev readline-static ncurses-dev ncurses-static ncurses-libs
Crystalのコンパイラの中には、--cross-compile
や --mcpu
などのオプションもあるが、LLVMに依存しているだけだと思うから、あまり信用しすぎない方がいいと思う。
Macでは静的にリンクしたバイナリの出力は諦めて homebrew-tap を使った方が幸せになれると思う。
Windowsも単に crystal build --static
すればよく、RubyではWindows向けの実行ファイルを作るのはかなりの制限があるのでかなり便利である。ただし、Cのライブラリを導入するのは煩雑というか、まだ未完成。
もう少し詳しくは↓