2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Crystalで作成したツールを配布する方法

Last updated at Posted at 2024-04-21

はじめに

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のパーミッションの設定が必要である。

この記事は以上です。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?