Goの勉強も兼ねて自作コマンドを作ろうと思った。
その前に作ったコマンドを公開して誰でもインストールできるようにしたかったので、その備忘録。
前提条件
下記の環境が整っていることとする。
- homebrew (v2.1.0)
- go (v1.12.3)
- githubのアカウント
大まかな流れ
- Goで実行ファイルを作成する
- Githubにソース管理用のリポジトリを作る
- リリース作業をする
- Githubにインストール用のリポジトリを作る
-
Formula
ファイルを作成する -
brew tap
/brew install
でコマンドをインストールする - コマンド実行
やっていき
Goで実行ファイルを作成する
とりあえず動けば何でも良いので、実行するとhello, world
と出力するhello
コマンドを作る。
プログラムは以下。
package main
import "fmt"
func main() {
fmt.Println("hello, world")
}
go build
でビルドして実行ファイルを作成する。
実行ファイル名は実行時に指定するコマンド名と同じにする。
go build -o hello
この時、後で使うのでsha256のハッシュ値を取得しておく。
shasum -a 256 hello
# 2dbc3742be9c77c4e3bb30c99790699b7d9c3cfa7895ecc9c1e1663f9507fddd ←こんなのが出力される
Githubにソース管理用のリポジトリを作る
Githubにリポジトリを作成し、先程作ったファイルをpushする。この時、実行ファイルはpushしなくてよい。
リポジトリ名は何でも良いが、ここではコマンド名と同じで一旦hello
とする。こんな感じで。
リリース作業をする
作った実行ファイルをリリースする作業をする。
下図のrelease
に行くと「Create a new release」というボタンがあるのでそれを押すとリリース情報の入力画面に行く。
(UIが変わって、release
ボタンは今は右サイドバーにあるかも)
タグバージョンやタイトルなどの情報は、一旦適当に入れておく。
大事なのは下図の赤枠の部分で、ここをクリックして先程作った実行ファイルを登録する。
終わったら「Publish release」をクリックする。
リリース情報が表示されるので、実行ファイル部分のURLを控えておく(後で使う)。
Githubにインストール用のリポジトリを作る
ソース管理とは別にHomebrewでインストールできるようにするリポジトリを作成する。
このリポジトリの命名ルールは決まっており、必ずhomebrew-${コマンド名}
とする。
今回だとhomebrew-hello
となる。こんな感じ。
Github上から適当に作成したら次に進む。
Formula
ファイルを作成する
一番厄介そうな部分。やりたきことは「これこれこういう形式でインストールしますよ」という手順を書いたFormula
ファイルを作成し、それを先程作ったインストール用リポジトリに登録すると、あとはHomebrew側がそれを見てよしなにインストール作業をしてくれるという仕組みになってるっぽい。
ということで先程作ったリポジトリにFormula
を置きたい。
リポジトリをクローンする必要があるが、実はこれはbrew tap
コマンドでできる。
brew tap
を実行すると/usr/local/Homebrew/Library/Taps/${Githubのアカウント名}
配下に先程のリポジトリがクローンされている。
そこにFormula
ファイルを配置する必要があるが、これもbrew create
コマンドで実行できる。
まとめると、下記のコマンドを打ってくれ。
brew tap katsumitakano/hello # アカウント名とコマンド名の部分は適宜読み替える
brew create --tap katsumitakano/hello
そうするとFormula
ファイルの雛形がエディタで開くので、必要な情報を入力する。
下記をコピペして、urlとsha256の値だけ読み替えてもらえれば動くはず。
class Hello < Formula
desc "コマンドの説明" # ←コマンドに関する説明を記述する
homepage "https://github.com/katsumitakano/hello" # ←何でも良いがGithubのリポジトリを書くことにする
url "https://github.com/katsumitakano/hello/releases/download/v0.0.1/hello" # ←コピーしておいた実行ファイルのURL
sha256 "2dbc3742be9c77c4e3bb30c99790699b7d9c3cfa7895ecc9c1e1663f9507fddd" # ←実行ファイルのsha256の値
def install
bin.install "hello" # ←実行ファイルを実行Pathに配置するよの意味
end
test do
system "true" # ←本来はここにテストを書くが今回は一旦無視
end
end
終わったらcommitしてpushし、リポジトリに反映させる。
brew tap
/ brew install
でコマンドをインストールする
一旦tapし直してリポジトリを最新化させる。その後installコマンドを打つことでコマンドが実行できるようになる。
本来ならbrew install ${コマンド名}
でインストールできるはずだが、今回作ったhelloコマンドはhomebrewの公式にすでに同じ名前のものが存在しているため、普通にやるとそちらがインストールされてしまう。
その場合はインストール時にどのコマンドをインストールするか直接指定する。
形式は${tap元}/${Formula名}
になっている。今回だとkatsumitakano/hello/hello
になる(感じ取ってくれ)。
brew untap katsumitakano/hello
brew tap katsumitakano/hello
brew install katsumitakano/hello/hello
コマンド実行
> hello
hello, world
動いた。
まとめ
今回はとりあえず動かすことが目的だったので、実行ファイルの置き方とか、Formulaファイルの書き方とか、あまり正しくはないかもしれない。
自分と周囲の人が気軽に使えるようにする場合の最小構成ということで。
リリース作業を自動化するgoreleaserというものがあるので、最終的にはそれを使うのが良さそう。
参考資料
Goで自作コマンドを作成し、homebrewで公開する
Homebrewで自作のプロジェクト(ライブラリ)を公開する
HomeBrewで自作ツールを配布する
brew tapでGolangの自作アプリケーションを公開する方法
goでcliのコマンドを作ってhomebrewで使えるようにしてみた
brew tapとは