goreleaserでHomebrewのFormulaを自動生成する


# 概要
golangで作ったバイナリをリリースする際はgoxなどで特に困っていなかったのですが、goreleaserについて調べたらHomebrewに対応していることに気づきました。
Formulaの作成はいつも面倒だな...と思っていたのですが、goreleaserを使ってTravis CIでリリースするようにしたら超楽になって頻繁にリリースしたい気持ちになったので、特に大した内容はないですが一応書いておきます。

# 参考URL
- https://goreleaser.com/#homebrew

# 設定
ドキュメントに書いてある通りなのですが、自分用のメモとして残しておきます。
goreleaser自体の使い方は色々なブログ等にも書いてあるので、ここでは説明は省略します。

まず自分で作った時の設定を書いておきます。

```.goreleaser.yml
brew:
  github:
    owner: knqyf263
    name: homebrew-pet
  commit_author:
    name: goreleaserbot
    email: goreleaser@carlosbecker.com
  description: "Simple command-line snippet manager"
  homepage: "https://github.com/knqyf263/pet"
  dependencies:
    - fzf
  install: |
    bin.install Dir['pet']
    zsh_completion.install "misc/completions/zsh/_pet"
  test: |
    system "#{bin}/pet"

```

## github
自分でhomebrew用のリポジトリを作成して、それをgithubのsectionで設定します。
自分の場合は `knqyf263/homebrew-pet` だったので、以下のようになります。

```.goreleaser.yml
github:
  owner: knqyf263
  name: homebrew-pet
```

## commit_author
次にcommit_authorはコミットされる時のauthorになります。
goreleaserbotにしておくと、以下のようにgoreleaserbotとしてコミットされます。
何でも良いと思いますが、自動コミットなことが分かるのでデフォルトのままgoreleaserbotにしました。

![Kobito.CLGIPW.png](https://qiita-image-store.s3.amazonaws.com/0/56222/bc707c48-fc25-a539-59f0-bb2a20ec697b.png "Kobito.CLGIPW.png")

## description
ここからは実際にFormula上に書かれる設定になります。
descriptionにはコマンドの説明を書きます。

```.goreleaser.yml
description: "Simple command-line snippet manager"
```

## homepage
homepageは何でも良いですが、特に専用のページがなければGitHubのページで良いと思います。

- https://github.com/Homebrew/brew/blob/master/docs/Formula-Cookbook.md#fill-in-the-homepage

```.goreleaser.yml
homepage: "https://github.com/knqyf263/pet"
```

## dependencies
これはHomebrewのFormulaで `depends_on` として設定される内容になります。
詳細は以下を見ると良いです。

- https://github.com/Homebrew/brew/blob/master/docs/Formula-Cookbook.md#specifying-other-formulae-as-dependencies
- http://www.rubydoc.info/github/Homebrew/brew/master/Formula#depends_on-class_method

Homebrew上での依存関係の記述になるので、HomebrewでのFormula名を書きます。

```.goreleaser.yml
dependencies:
  - fzf
```

上記のように書くと、Formulaで以下のようになります。

``` pet.rb
depends_on "fzf"
```

## install
これもFormulaのinstallメソッド内に記述される内容です。
書き方はドキュメントを見たり、他のFormulaを見ると良いと思います。

- https://github.com/Homebrew/brew/blob/master/docs/Formula-Cookbook.md#bininstall-foo
- http://www.rubydoc.info/github/Homebrew/brew/Formula#install-instance_method
- https://github.com/Homebrew/homebrew-core/tree/master/Formula

```.goreleaser.yml
install: |
  bin.install Dir['pet']
  zsh_completion.install "misc/completions/zsh/_pet"
```

このように書くと、そのままinstallメソッド内に記述されます。

```pet.rb
def install
  bin.install Dir['pet']
  zsh_completion.install "misc/completions/zsh/_pet"
end
```

## test
Formulaでのtest内に記述されます。
brewでインストール後に正しく動作しているかの確認に使われます。

https://github.com/Homebrew/brew/blob/master/docs/Formula-Cookbook.md#add-a-test-to-the-formula

```.goreleaser.yml
test: |
  system "#{bin}/pet"
```

今回はtapして使うためコマンド実行するだけの簡単なテストですが、本家に入れる場合は丁寧に書かないと駄目です。
結果は以下のようになります。

```pet.rb
test do
  system "#{bin}/pet"
end
```

## url, version, sha256
この辺りはgoreleaserが勝手に埋めてくれます。
大した手間じゃない割に一番面倒に感じていた部分なので、本当に助かります。

# 使ってみる
Travis CIの設定は公式ドキュメントにあるとおりです。
https://goreleaser.com/#continous_integration

tagをつけてpushすると勝手にFormulaが更新されます。

```shell-session
$ git push --tags
```

自動生成されたFormulaは以下です。
実際に試しても問題なく利用できました。
https://github.com/knqyf263/homebrew-pet/commit/99b254cfb64365fe461f9cd62bcd6e4b9bc3a96b

```
$ brew install knqyf263/pet/pet
```

# まとめ
HomebrewのFormula生成は自分にとっては非常に楽になりました。
手でやっても数分の作業ですが、精神的な負荷が高かったのでこういう些細な自動化は本当に助かります。
rpmやdebパッケージの生成もやってみたので、その辺りもいつか書けたら書きます。