はじめに
Webアプリケーションの作成にCrystalを使っている人が多い。しかし、Crystal言語は、コマンドラインツールを作成するのに向いていると思う。ここではCrystalで作成したツールをどのようにして配布しているか、現時点でのやり方を書いてみた。
これが最良の方法という気は全くなくて、あくまで自分の現時点でのやり方を紹介するものです。(GUIツールは想定していない)
前提となる知識
バイナリファイルの配布
Crystalではバイナリファイルを直接配布する。
現状ではパッケージマネージャーはない
したがって cargo install
gem install
pip install
のような方法でコマンドラインツールをインストールすることはできない。
"依存マネージャー" として、shard
が普及しているが、複雑なことはできない。複雑なことは Makefile
を使うという暗黙の了解がある。
Crystalはコミュニティが小さいため、エコシステムの整備が進まない。現在のコアチームはパッケージマネージャーに否定的で、その理由の一つは、Crystalのコンパイルが非常に遅いことがある。
おすすめの方法
2024-04-21 時点の記事です。最新情報をチェックしてください。
- ツールはGitHub Releaseで配布する。
- GitHub Release は、GitHub Actionsで作成する。
-
git tag v0.1.2
のように gitでタグをつけると自動で発火するようにしておく。
on:
push:
tags:
- "v*"
Linuxの場合
公式のDockerイメージ(alpine)を使って、静的にリンクする。
GitHub Actionsだとこんな感じ。
- name: Run Linux Build
if: matrix.os == 'ubuntu'
run: |
mkdir -p bin
chmod 755 bin
docker run -d --name alpine -v $(pwd):/workspace -w /workspace crystallang/crystal:latest-alpine tail -f /dev/null
docker exec alpine shards install --without-development --release --static
docker exec alpine shards build --release --static
docker exec alpine chmod +x bin/deepl
docker exec alpine gzip bin/deepl
docker exec alpine mv bin/deepl.gz bin/deepl-linux.tar.gz
なお、静的リンクされたバイナリではなく動的リンクされたバイナリを配布したい場合は、checkinstall
などを利用して deb パッケージを作成するという方法もある。この場合は、APTのパッケージなどに依存できるがLinuxのさまざまなディストリビューションやバージョンに対応するのは簡単ではない。
Macの場合
- Macは静的リンクをサポートしておらず、バイナリファイルを配布するのは難しい。
- かわりに
homebrew tap
を使ってユーザー自身にコンパイルしてもらう。 - GitHub上に
homebrew-brew
というリポジトリを作成する。そこに自作ツールのForlumaを配置しておく。 - 下は自分がやってる例。
Windowsの場合
- CrystalのWindows対応は現在も進行中であり、C言語の共有ライブラリを呼び出したり配布したりするベストプラクティスは定まっていない。
- プロジェクトがCrystalのみで書かれてる場合は
shards build --release --static
のように--static
オプションをつけると単一のバイナリが出力さる。-
--static
をつけないと、bin
ディレクトリに実行形式のファイルに加えて*.dll
が出力される。
-
- dll を一緒に配布したいときは、結局 Inno Setup や NSIS などのインストーラー作成ツールを使用するのがいいのではないだろうか。
- 余談だが、GitHub Actionsなどで生成したバイナリはウイルス対策ソフトなどでマルウェアと誤認識される可能性がかなりある。
GitHub Releaseへのアップロード
上のGitHub Actionsを使うのが簡単である。
- name: Upload Release Asset
uses: softprops/action-gh-release@v2
with:
files: |
bin/deepl-linux.tar.gz
bin/deepl-macos.tar.gz
bin/deepl-windows.zip
LICENSE.txt
このActionを利用するときには、Workflowのパーミッションの設定が必要である。
この記事は以上です。