RustのcliをHomebrewで公開する

この記事ではRust製のcliをbrew installできるようになるまでの手順について書きます。(CI上で実行できるようにしたいのですが、まずは手でやります) サンプルとして利用するのは、前回の記事で紹介した、MySQLにpingをうつだけのcli, mysqlpingerです。

build

$ cd path/to/mysqlpinger
$ cargo build --release
$ cd target/release
$ tar -czf mysqlpinger-0.3.0-x86_64-apple-darwin.tar.gz mysqlpinger
$ shasum -a 256 mysqlpinger-0.3.0-x86_64-apple-darwin.tar.gz
f253213e27eaec55a9c58029de92c84c4bd11f311f77d273e15053a21ba5684c  mysqlpinger-0.3.0-x86_64-apple-darwin.tar.gz

--releaseでbuildして、tarにします。file名は他のprojectにならって、<binname>-<version>-<target>.tar.gzとしました。 また、あとで利用するので、hash値を取得しておきます。

github release

f:id:yamaguchi7073xtt:20200206202444p:plain
github release

buildしたbinaryを公開するために、githubのreleaseを利用します。新しいreleaseを作成し、さきほど作成したtar fileをuploadします。 releaseが作成されると、Assetsにリンクが生成されます。

Homebrew Formulaの作成

homebrew-mysqlpinger という名前のrepositoryをgithub上に作成して、cloneしてきます。

$ cd homebrew-mysqlpinger
$ exa -T
.
└── Formula
   └── mysqlpinger.rb

$ bat Formula/mysqlpinger.rb -p
class Mysqlpinger < Formula
  desc "cli mysql utility written in Rust"
  homepage "https://github.com/ymgyt/mysqlpinger"
  url "https://github.com/ymgyt/mysqlpinger/releases/download/v0.3.0/mysqlpinger-0.3.0-x86_64-apple-darwin.tar.gz"
  sha256 "f253213e27eaec55a9c58029de92c84c4bd11f311f77d273e15053a21ba5684c"
  version "0.3.0"

  def install
    bin.install "mysqlpinger"
  end
end

上記のようにFormula/mysqlpinger.rbを作成して、classを定義します。 urlには、github releaseのasset fileのlinkを指定します。 sha256にはtar fileのhash値を指定します。 (class名をMySQLPingerのようにするとエラーになりました)

ここまでを作成して、pushします。

install

$ brew tap ymgyt/mysqlpinger
$ brew install mysqlpinger
$ mysqlpinger --version
mysqlpinger 0.3.0

無事、installすることができました。🎉 github releaseの作成、fileのupload, formula repositoryの更新までをコマンドでできたらこの作業をci上でおこなえそうです。 Rust製でよさそうなツールを探して、なければ作ってみようと思います。

参考にさせていただいたブログ

https://federicoterzi.com/blog/how-to-publish-your-rust-project-on-homebrew/