Homebrew-fileへwhalerew, VSCodeの拡張機能の管理を追加しました。
Homebrew-file
HomebrewのパッケージリストをBrewfileを使って管理するツール。
Homebrewのメンテナーが作っているbundleというBrewfileファイルに書き出すツールがありますが、 Homebrew-fileにはGitHubとかと連携してBrewfileの履歴を管理したり他の環境と共有しやすくするための 機能だったり、Brewfileを自動的にアップデートする機能だったり Brewfile自体の管理を行うための機能があるのが特徴です。
whalerew, VSCodeの拡張機能の管理を追加
Requestがあったのでwhalerew, VSCodeの拡張機能の管理を追加しました。
bundleの方で対応しているよ、とのことだったので。
whalebrewで管理するimageやVSCodeの拡張機能が導入されている場合、
brew file init
で
1 2 3 4 5 6 |
|
のような形でBrewfileに書き出されます。
また、Brewfileにこれらの情報が書かれている状態でbrew file install
を実行した際には
それぞれイメージや拡張機能がインストールされますが、
whalebrew
コマンドがなかったり、VSCodeがインストールされていない場合は
それらのインストールも行います
(brew install whalebrew
/brew install vscode
)。
ただし、whalebrewはイメージをインストールするにあたってdocker環境が用意されていることが前提になるので、 dockerが動いてないと
1 2 3 |
|
のようなwaningが出て終わります。
dockerに関しては、brew install docker
でインストールしてもそこから実行する必要がありますし、
caskの方にもあったり、インストールするにも色々あるところなのでこれに関しては手動でやってもらうことを前提としておきます。
whalebrew に関しては自分自身 このIssueで初めて知ったものなんですが、 dockerイメージをインストールしてそこに入ってるコマンドを直接使えるようにするツールです。
環境依存があるようなコマンドだとDockerイメージを使って実行することで環境を気にせず実行できるようになるので便利そうです。
HomebrewでPython製のコマンドラインツールを配布する際に仮想環境を自動で構築してその環境として実行できるようにすることが出来ますが、 これはちょっとインストールに時間がかかるのが難点です。
普段からdockerを使ってる人であれば、 whalebrewを使うことでそれようのimageを作っておけば比較的容易にインストール出来るようになるかな、とも。
逆に普段dockerを動かしてない人にとってはハードル高いかもしれませんが。
その他のアップデート
ついでに他のアップデートについても。
brew info関連
細かいアップデートはたくさんありますが、大きな所でbrew info
とかで取っていた
パッケージリストや依存関係などの情報取得する方法を大きく変えました。
昨年Homebrewが4.0.0にアップデートされたときにAPI経由のインストールがデフォルトに変わり、これに関連していくつか変更を行っています。
とくにこの際brew info --eval-all --json=v2
ですべてのパッケージの情報を取得しようとしても
API経由でインストールするhomebrew-core, homebrew-caskに関する情報がそれらを直接tapしてない限り取得できなかったので
API関連のcacheディレクトリにあるファイルから直接情報を取得したりしていました。
おそらくバグかな、と思うのですが、今はそれらの情報も取得できるようになっているようです。
さらに、このbrew info --eval-all --json=v2
ですべての情報を取得していた最大の理由は
各tapに含まれるパッケージのリストを作るためでした。
以前はファイルがすべてシステムにあったのでformula/caskのフィアルリストを直接見に行くことで取得していましたが、
上に書いたように現在はhomebrew-core, homebrew-caskはtapされずにそれらのformula/caskがローカルにないので
なんらかのbrew
コマンドでなんとか取得する必要があったためです。
ただ、これに関しても現在はbrew tap-info --json --installed
というコマンドで、
homebrew-core, homebrew-caskを含むすべてのtapに関してそのtapに含まれるformula/caskのリストを取得できるようになっているので
それを使うように変更しています。
brew info --eval-all --json=v2
に関してはbrew file casklist
でmacOSにおけるアプリのチェックをするときだけに使うようになっています。
これによってbrew file init
が大分速くなりました。
自分の~200 formulae, ~30 casksが入っている環境で
brew info
を使った古いversion (v9.1.4): ~30秒brew tap-info
を使った古いversion (v9.2.0): ~6秒
といった感じで1/5に。
特にbrew-wrapを使っている場合、
brew install <formula>
をするたびにbrew file init
相当のことが行われるため
結構時間がかかることがあるので、これで大分良くなってのではないかと思います。
brew info
におけるno URL formulaの問題
ちょっとbrew fileのアップデートの話からはずれますが、
brew info --eval-all --json=v2
(--json=v1
も)で別に1つ問題があります。
インストールしたtap内のformulaeにURLがない場合にエラーになり、問題のないformulaeに関しても情報が取得できなくなります。
1つわかってるformulaは hashicorp/tap/vagrant です。
このtapを入れていなければ問題ないわけですが、このtapの中には
hashicorp/tap/terraform
などがあり、これらを使うためにtapしてある場合、vagrantをインストールしていなくても
--eval-all
では全てのformulaeの情報を取得しようとするためエラーになります。
さらには、このterraformですが、もともとはhomebrew-coreの中に入っていました。 ですが、TerraformがライセンスをBUSLに変更したため 1、homebrew-coreにあるformulaからはインストールできないようにされました。
hashicorp: deprecate and add caveat by iMichka · Pull Request #139538 · Homebrew/homebrew-core
別にterraformのライセンスが変わってもHomeberwでインストールするものとしては問題ないような気もしますが なんかだめみたいです。
まだformula自体は残っていますが、現在インストールしようとすると、
1
|
|
というwarninが出ます。
また、同じくhashicorpのpackerとかだと
1
|
|
と、すでに今年の9月からインストールできなくなっています。
そんなわけでhashicorp/tapを使ってterraformなどをインストールする人が出てきているようで、 このURLなし問題が出てきたようです。
この問題はすでにIssueに上がってますが、結構前から解決に至っていません。
Formulae require at least a URL · Issue #258 · hashicorp/homebrew-tap
問題としては、Linuxかつintel CPU用のもののみ提供されているため、 formulaの中でその場合のみツールのURLを提供するようになっていて、 結果的にそれ以外の環境だとURLのないformulaになってしまいます。
また、とりあえず他の環境でもインストールは出来てしまうようにする、という提案はあるのですが、 このtapの中のformulaはtemplateを元に自動で作っているため、 そちらを直さないといけないということで変更が進んでいません。
vagrant: fix for errors on macOS by EricFromCanada · Pull Request #252 · hashicorp/homebrew-tap
じゃあHomebrew側でこういうの回避するようにしてくれればよいわけですが、
We don't support errors with third-party taps here.
と、なんか切り捨てられてます。
Homebrewのこの方は結構きついなあ、と思うことが度々ありますが、 これも本質的なのはURLを書かないFormula側ではなくて 環境依存でインストールするものを変えられるFormulaの設計の中、 対応のない環境だと結果的にURLがない状態になってしまう、ということが問題なので その部分はHomebrew側の問題です。
まあこの辺はIssueに出しても相当上手く相談しないと切り捨てられるので、 いい感じにPRを作るなりしてなんとかしてもらう必要がありそうです。
brew-file的にはbrew file casklist
をする際にこの問題にぶつかりますが、
現在はbrew info --eval-all --json=v2
で失敗した際には
caskだけのリストを一旦作ってからbrew info --cask {cask list} --json=v2
のような形で情報を取得し、
formula部分に関しても同様にやりますが、もしvagrantのようなformulaがある場合は
失敗したらそれを除いて、といった形で繰り返して情報を取得するようにしています。
とりあえずはこれで最低限brew-file的には動作出来ますが、 余裕があればまたHomebrewの方見てみたいと思います。
古い名前、aliasへの対応
formulaの名前が変わった際にエラー起こることがあったみたいで、 一旦古い名前でインストールしたformulaを削除して再インストールしてもらえれば解決するものだと思ってますが、 これらに関してもbrew-fileの中で古い名前も確認してリストを調整するような処理を追加しています。
この辺のIssue長くなってしまって元の人に確認してもらってないまま止まってしまっていますが、 多分今は大丈夫なはず。
問題があれば教えて下さい。
brew tap
時にHOMEBREW_NO_AUTO_UPDATEを設定する必要なし
その昔、brew tap
をする際にbrew update
が自動で走るので
単にlist表示するだけのときは
止めたい(brew list
などでは走らない)という類のPRを出しました。
disable oputput of brew tap at initialize by rcmdnk · Pull Request #1439 · Homebrew/brew
が、何故か拒否されました。 messyらしい。
ちょっとmessyになってしまうのは
当時、tap
には--list
という引数があってbrew tap
と引数なしかbrew tap --list
とするとリスト表示し、
brew tap rcmdnk/file
のようにtapを渡すとそれをtapする、といった使い方になってたので、
この--list
の時を避けるためにちょっとmessyになってしまっていました。
その後、reconsider in futureとは言ってますが。
で、仕方なくHOMEBREW_NO_AUTO_UPDATE
を中で設定して実行するようにしていたのですが、
いつの間にか--list
という引数がなくなっていて、そのためか、
以下のようなPRが出ててmergeされてました。
tap: skip auto-update if called with no args by scpeters · Pull Request #5766 · Homebrew/brew
--list
がない分ちょっとシンプルにはなってますが、ほぼ上と同じ変更なわけですが、
nice work
ということで。
このIssueで話あってからのことなのでということかもしれませんが、 上のPRがも忘れされれてlinkもつけられてないので知る由もなく。
なんだかな、という感じです。
他にも似たようなことがあって、HomebrewにPR出すのは難しいなあ、と。
Read the Docsのテーマ変更
Read the Docsに公開しているドキュメントのテーマを変更しました。
Welcome to homebrew-file’s documentation! — Homebrew-file documentation
以前はdefault
を使ってましたが、新しくalabaster
というテーマを使っています。
というのもRead the docsでのビルド時にdefault
を指定するとエラーになるようになっていたので。
現在はsphinx_rtd_theme
とすると以前と同じように出来るみたいですが
2
せっかくなので変えてみました。
alabaster
は
HTML theming
でも最初に紹介されているテーマで、
そういえば最近見るドキュメントはこれが多いな、と言う感じのものでした。