rcmdnk's blog

20241111_brewfile_200_200

Homebrew-fileへwhalerew, VSCodeの拡張機能の管理を追加しました。

Homebrew-file

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

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

whalerew, VSCodeの拡張機能の管理を追加

Requestがあったのでwhalerew, VSCodeの拡張機能の管理を追加しました。

vscode extensions · Issue #286

bundleの方で対応しているよ、とのことだったので。

whalebrewで管理するimageやVSCodeの拡張機能が導入されている場合、 brew file init

1
2
3
4
5
6
# Whalebrew images
whalebrew whalebrew/whalesay

# VSCode extensions
vscode eamodio.gitlens
vscode ms-python.debugpy

のような形でBrewfileに書き出されます。

また、Brewfileにこれらの情報が書かれている状態でbrew file installを実行した際には それぞれイメージや拡張機能がインストールされますが、 whalebrewコマンドがなかったり、VSCodeがインストールされていない場合は それらのインストールも行います (brew install whalebrew/brew install vscode)。

ただし、whalebrewはイメージをインストールするにあたってdocker環境が用意されていることが前提になるので、 dockerが動いてないと

1
2
3
Installing whalebrew/whalesay
[WARNING] Docker command is not available.
[WARNING] Please install whalebrew/whalesay by whalebrew after docker is ready.

のような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に。

Update brew info related functions (for brew file init, ect…) by rcmdnk · Pull Request #290 · rcmdnk/homebrew-file

特に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に関しても情報が取得できなくなります。

[ERROR] Failed at command: /opt/homebrew/bin/brew info –json=v1 –eval-all Error: formulae require at least a URL · Issue #282 · rcmdnk/homebrew-file

1つわかってるformulaは hashicorp/tap/vagrant です。

このtapを入れていなければ問題ないわけですが、このtapの中には hashicorp/tap/terraform などがあり、これらを使うためにtapしてある場合、vagrantをインストールしていなくても --eval-allでは全てのformulaeの情報を取得しようとするためエラーになります。

さらには、このterraformですが、もともとはhomebrew-coreの中に入っていました。 ですが、TerraformがライセンスをBUSLに変更したため 1homebrew-coreにあるformulaからはインストールできないようにされました。

hashicorp: deprecate and add caveat by iMichka · Pull Request #139538 · Homebrew/homebrew-core

別にterraformのライセンスが変わってもHomeberwでインストールするものとしては問題ないような気もしますが なんかだめみたいです。

まだformula自体は残っていますが、現在インストールしようとすると、

1
Warning: terraform has been deprecated because it changed its license to BUSL on the next release! It will be disabled on 2025-04-04.

というwarninが出ます。

また、同じくhashicorpのpackerとかだと

1
Error: packer has been disabled because it will change its license to BUSL on the next release! It was disabled on 2024-09-27.

と、すでに今年の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への対応

support for oldnames · Issue #265 · rcmdnk/homebrew-file

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ということで。

More responsive outdated & upgrade commands through scheduled tasks and caching · Issue #5743 · Homebrew/brew

この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 せっかくなので変えてみました。

alabasterHTML theming でも最初に紹介されているテーマで、 そういえば最近見るドキュメントはこれが多いな、と言う感じのものでした。

Sponsored Links
Sponsored Links

« Python開発環境でのblack, isort, flake8からruffへの移行 miseを使って仮想環境自動認識(主にPython, uv, プロンプト表示についても) »

}