LoginSignup
10
6

More than 1 year has passed since last update.

Homebrewに自作コマンドを登録して使えるようにする【Go編】

Last updated at Posted at 2019-04-13

Goの勉強も兼ねて自作コマンドを作ろうと思った。
その前に作ったコマンドを公開して誰でもインストールできるようにしたかったので、その備忘録。

前提条件

下記の環境が整っていることとする。

  • homebrew (v2.1.0)
  • go (v1.12.3)
  • githubのアカウント

大まかな流れ

  1. Goで実行ファイルを作成する
  2. Githubにソース管理用のリポジトリを作る
  3. リリース作業をする
  4. Githubにインストール用のリポジトリを作る
  5. Formulaファイルを作成する
  6. brew tap / brew installでコマンドをインストールする
  7. コマンド実行

やっていき

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ボタンは今は右サイドバーにあるかも)

hello 2019-04-13 14-17-51.png

タグバージョンやタイトルなどの情報は、一旦適当に入れておく。
大事なのは下図の赤枠の部分で、ここをクリックして先程作った実行ファイルを登録する。

homebrew-hello 2019-04-13 14-24-42.png

終わったら「Publish release」をクリックする。
リリース情報が表示されるので、実行ファイル部分のURLを控えておく(後で使う)。

hello 2019-04-13 14-37-00.png

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とは

10
6
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
10
6