rcmdnk's blog

Homebrew

Homebrew-file への機能追加でBrewfileへの変更があった際にGitHubへのレポジトリへpushしたり なんらかアクションを起こせる様な仕組みを作りました。

Homebrew-file

HomebrewのパッケージリストをBrewfileを使って管理するツール。

Homebrew自体にも公式にbundleというBrewfileファイルに書き出す機能がありますが、 Homebrew-fileにはGitHubとかと連携してBrewfileの履歴を管理したり他の環境と共有しやすくするための 機能だったり、Brewfileを自動的にアップデートする機能があったりします。

brew-wrap

追加の機能はbrew fileコマンド本体ではなく brewコマンドのラッパーの brew-wrap の中に追加しました。

brew-wrap.bashrc.zshrc、もしくはconfig.fishなんかの中で設定ファイルを読み込むと brewコマンドをラップして brew installなどを行った際にbrew fileを使ってBrewfileを自動でアップデートしてくれるようになります。

Brewfileのバージョン管理

brew-wrapを使うとBrewfileに対してinstall時にパッケージの追加やremove時に削除などは行います。

一方でHomebrew-fileにはGitHubのレポジトリなどと結びつけて バージョン管理する機能もあります。

Manage Brewfile with Git

Brewfileに変更があった後、

$ brew file update

とすればGitHub上の変更を取り入れて、追加パッケージがあれば追加し、 また、ローカルに新たなパッケージが追加されていたりBrewfileがアップデートされていれば 新たなBrewfileをGitのレポジトリ内でcommitしてGitHubにpushします。 (GitのリモートサーバーはGitHubでなくてもOK。)

ただ、現状この作業は自分で行う必要があって、私自身はcronジョブを使って1日1回、

30 12 * * * brew file update

みたいな設定でbrew file updateを行っています。 (上の設定だと毎日12:30に実行されます。)

_post_brewfile_update

この様な変更管理をBrewfile変更後に毎回行いたい、といったIssueをもらいました。

Feature request: provide hook into “Initialize Brewfile” process · Issue #121 · rcmdnk/homebrew-file

Git関連の作業ならupdateの様なことを中でできる設定にしても良いかな、と思ったのですが、 このIssueだと別な管理をしていて、別途コマンドを使いたい、という感じだったので brew-wrapの方を使って簡単にコマンドを追加できるようにしてみました。

.bashrcの中などで、brew-fileを読み込んだ後、_post_brewfile_update()という関数を実装すると、 brewコマンド実行時、Brewfileに何らかの変更があった際、 その関数が実行されます。

.bashrc
1
2
3
4
5
6
7
if [ -f $(brew --prefix)/etc/brew-wrap ];then
  source $(brew --prefix)/etc/brew-wrap

  _post_brewfile_update () {
    echo "Brewfile was updated!"
  }
fi

こんな感じの関数を実装して、

$ brew install python

とすると、もしpythonが新たにインストールされてBrewfileがアップデートされると

Brewfile was updated!

と表示されます。 すでにインストールされてる場合にはBrewfileに変更がないので関数は実行されません。

GitHubと連携していて常にリモートレポジトリと同期したい場合には

.bashrc
1
2
3
4
5
6
7
if [ -f $(brew --prefix)/etc/brew-wrap ];then
  source $(brew --prefix)/etc/brew-wrap

  _post_brewfile_update () {
    brew file update
  }
fi

とかしておけばよいかと思います。

Sponsored Links
Sponsored Links

« マンションのテレビの信号が強すぎるためアッテネータが必要だった PythonのFlake8で~/.config/flake8が4.0から無効化されている »