Crystal言語でコマンドラインツールを作りたいと考えている。
Crystal言語の使い方は人それぞれだが、Githubのトレンドを見ると、Webアプリケーションを作っている人が多い。Crsytal言語がRuby言語と深い繋がりを持っているためだろうか。RustはCargoのように便利なビルド兼パッケージマネージャーを用意しているが、Crystalにはない。Makefile を使うのが一般的である。
ソースからビルド。これはツールの配布の観点からみると制約が大きい。Crystal言語ユーザー以外にツールを配布することが難しくなる。Crystal言語は、PythonやPerlとは違い、予めインストールされていることが全く期待できない。Crystal言語のツールを使うためにCrystal言語をインストール。これはつらい。だからビルドしたバイナリを直接配布したい。
単純な方法として、deb
での配布を試みる。
- Github Actionsを使う
- v0.0.0 など、リリース用のタグがプッシュされたときに発火する
- deb は Checkinstll という古典的なツールでお手軽作成
- リリースページにファイルを自動でアップロードする
name: build
on:
push:
tags:
- "v*.*.*"
jobs:
release:
name: Release
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ 'ubuntu-20.04' ]
steps:
- uses: actions/checkout@v2
- uses: crystal-lang/install-crystal@v1
- run: sudo apt -qy install libhts-dev checkinstall
- run: shards install --pkgname=bam-filter --version
- run: make
- run: sudo checkinstall --pkgname=bam-filter
--pkgversion=$(echo ${{ github.ref }} | sed -e "s#refs/tags/v##g")
--maintainer=2xijok@gmail.com
--requires=libhts-dev,libevent-dev,libgc-dev,libc6-dev
--nodoc -y
- uses: softprops/action-gh-release@v1
with:
files: "bam-filter*.deb"
普段ならいろいろリポジトリを見てお手本を探すのだが、Crystal言語のリポジトリは少ないので自分で書いてみた。
-
--pkgversion=$(echo ${{ github.ref }} | sed -e "s#refs/tags/v##g")
は、タグからバージョンナンバーを抽出している。 -
--maintainer=2xijok@gmail.com
みたいなのも、ちゃんと設定しておいた方が良い。 -
--requires=libhts-dev,libevent-dev,libgc-dev,libc6-dev
依存に関しては、Dockerで素のUbuntuとかに試しにインストールしてみて、足りなかったらldd
を見ながら追加するという感じにした。ちなみに、puts 0
をビルドしてldd
すると、次のようになる。
linux-vdso.so.1 (0x00007ffc683a7000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f181a706000)
libevent-2.1.so.7 => /lib/x86_64-linux-gnu/libevent-2.1.so.7 (0x00007f181a6b0000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f181a696000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f181a46e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f181a91f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f181a469000)
- 要するに、libgc, libgc, libc6 は、いつも確実に追加が必要になるやつだと思う。多分。
この記事は以上です。
決して完備された例だとは思わないけれども、誰かが記事を書いておかないと、知見が集まらないと思うので公開します。もっとこうすればいいんじゃない?と思った人はコメント欄で教えてください。プルリクエストも歓迎します。