rcmdnk's blog

ベートーヴェン:交響曲第9番「合唱」

Homebrwe-file を色々アップデートしたのことに関して。

Homebrew-file

Homebrewでインストールしたパッケージ等をBrewfileを使って管理するためのツール。

Homebrewが4.0.0にアップデートされて色々と変わった部分などもあるので それに対応するためのアップデートなどをしました。

また、ちょっと前から スクリプトを複数に分けて書き直すようなこともしていて色々確認していたので 細かいアップデートは出してなかったんですがHomebrewのアップデートもあったので とりあえず大丈夫だと思うところまでやって新しいバージョンを出しました。

機能的な面での主な更新点

Brewfileに書けるコマンドとしてcask_argsの追加

Brewfileに

1
cask_args --appdir=~/Applications --require_sha

と書いておくと、すべてのCaskのインストール時にこのオプションが使われるようになります。

もし-F bundleを指定して使っている場合は

1
cask_args --appdir:~/Applications, --require_sha: true

のように homebrew-bundleの形で書いてください。

XDG_CONFIG_HOMEをconfigディレクトリのデフォルトに

${XDG_CONFIG_HOME}の値が定められている場合、 ${XDG_CONFIG_HOME}/brewfile/BrewfileがデフォルトのBrewfileの位置になります。

これまでは~/.config/brewfile/Brewfileでした。 基本的には${XDG_CONFIG_HOME}を定義してある場合でも~/.configの場合がほとんどなので 大きな影響はないかと思います。

それより前には~/.brewfile/だったりもしました。

互換性のため、あたらくデフォルトとして決まったディレクトリにBrewfileがない場合には 以前のデフォルトディレクトリを見に行ってそこにあればそちらを使うようにしています。

–verboseで設定できる値を0/1/2からdebug/info/warning/error/critical

基本的に出力をすべてprintからloggerを使うように変更しました。

これにともなって--verboseで使えるオプションも文字で指定するようにしています。

一応数字の場合でも0/1/2ならそれぞれdebug/info/errorに変換するようにはしています。

これは主にHOMEBREW_BREWFILE_VERBOSEという環境変数を数字で指定している場合に対する互換性を保つための処理だったりはします。

brew tapでタップをチェックする際にHOMEBREW_NO_AUTO_UPDATE=1を指定しなくてもOK

このアップデートを知らなかった。

tap: skip auto-update if called with no args by scpeters · Pull Request #5766 · Homebrew/brew

これも数年前ですが、更に数年前にPR出してrejectされてたもの。。。

disable oputput of brew tap at initialize by rcmdnk · Pull Request #1439 · Homebrew/brew

アップデートの内容はほぼほぼ同じ(一部オプションが消えてその処理が要らなくなったのでその部分を除いて簡略化したのが新しいPR) なので参照くらい入れてほしかった(そうしてくれたら気づけたので)。

api, cache変数の追加

環境変数HOMEBREW_NO_INSTALL_FROM_APIをチェックしてAPIを使っているかをチェックするように。

APIを使っている場合、homebrew-coreとhomebrew-caskをtapせずにAPI経由でformula/caskの情報だけを取ってくるようになるので 以前のようにtapのあるディレクトリを見に行ってformula/caskを確認することができなくなりました。

一方で$(brew –cache)/apiのディレクトリにjsonファイルなどで情報が保存されています。

brew info --eval-all --json=v2などにより全formulae/casksの情報が取得できるはずですが、 現状APIモードだとこれだとhomebrew-core/caskの情報が含まれていません。

APIを無効化しているとtapにある情報を読んでこれらも含んで示してくれます。

ここに出てくる情報はapiディレクトリの下にあるjsonファイルにある情報と同じなので、 homebrew-core/caskに関してはAPI有効のときにはこれらのファイルを見に行って情報を追加するような作業をしています。

この辺のAPI関連の情報の取り回しはまだ色々やりきれてない部分があるみたいで、 ちょこちょこ変わっています。

一個PR出したりしましたがちょうどそのちょっと前にその内容を含めた変更のPRが別に出ていた、ということもありました(ちょっと色々な変更の一部として作られてたのでタイトルとかで確認しきれなかった。。。)。

4.0.2まではformula.jsonという名前だったのが現在はformula.jws.jsonというファイルが使われるようになっていて、 中身が直接すべてがparse出来るjsonの形からparseしたあとに文字列をもう一段階jsonとしてparseする必要がある形式になっています。

この辺、まだちょっと変わるかもしれないので何かうまく動かなくなってるのに気づいたら教えてください。

homebrew-core/homebrew-caskのBrewfileでの取り扱い

これらのtapはAPIモードだとtapとして存在しない状態(brew tapでも表示されない)状態になりますが、 これらはあるものとしてBrewfileには残すようにしています。

書いてあってもAPIが有効であればbrew file installなどでもtapは行いません。

AppStoreからインストールしたアプリのリストアップをmasからmdfindを使った方法に

masを使ったアプリの検索がすべてをうまく検索できないような状態があったので macOSネイティブなmdfindを使った方法に変更しました。

mas does not show all apps · Issue #145 · rcmdnk/homebrew-file

これは以下の問題に関連してるかと思うのですが、下のIssudeだとfixしているとのことでまた別の問題かもしれません。

Microsoft Office apps not appearing in search results · Issue #220 · mas-cli/mas

恐らく masはAppStoreのアカウント情報を使って見ているため、 複数のアカウントを使ってアプリをインストールしたりする場合に起こっているものかもしれません。

以前、mdfindの方法だときちんと検索しきれなくて Appの中のContents/_MASReceipt/receiptというファイルがあるものを見つけるとより確実に見つけられる、 という状態があったのですが、現状使える環境で試した限りでは mdfindで全部見つけられたのでmdfindを使う方法にしています。

mdfindであれば特に最初にディレクトリを指定せずともOS全体から勝手に探してきてくれる、という利点もあるので。

これに関してもリストアップされないものとかあれば教えてください。

brew file casklistでAppStoreからインストールしたけどHomebrewでも入れられるものを表示するように

brew file casklistはmacOSにインストールされているアプリを一通り調べるコマンドで、 CaskでインストールされたものはBrewfileに従った方式で書き出され、 AppStoreからインストールされたものも同様にappstoreコマンドで書き出されます。

このときにAppStoreのアプリでCaskが存在するものについてはコメントでそのCaskの名前も書き出すようにしました。

1
2
3
4
5
6
7
8
9
# Apps installed from AppStore
appstore 409183694 Keynote (12.2.1) # /Applications/Keynote.app
appstore 409203825 Numbers (12.2.1) # /Applications/Numbers.app
appstore 409201541 Pages (12.2.1) # /Applications/Pages.app
appstore 497799835 Xcode (14.2) # /Applications/Xcode.app
appstore 408981434 iMovie (10.3.5) # /Applications/iMovie.app

# Apps installed from AppStore, but casks are available.
appstore 425424353 The Unarchiver (4.3.5) # the-unarchiver, /Applications/The Unarchiver.app

こんな感じ。

HOMEBREW_BREWFILE_FETCH_HEADオプションの追加

これまで、brew file updatebrew updateを実施する際、brew update --fetch-HEADオプションを追加していました。

ただ、このupdateは結構時間がかかるのと、Homebrew自体が--HEADも含めオプション的なものを使わない方向に進んでいることもあるので このようなチェックはオプション扱いに移しました。

もしこのチェックをbrew file updateの際に行いたい場合には.bashrcなどで

1
export HOMEBREW_BREWFILE_FETCH_HEAD=1

を設定してください。

3## aliasを残すように

Brwefile書いたformulaがalias([email protected]に対するpythonなど)の場合にはそのaliasのまま残すようにしました。 brew file brew install python(もしくはbrew-wrap使ってbrew install python)などでも同様。

これまでは[email protected]などに変更されてましたが、 例えばpython[email protected]になってもその最新のを入れたいからpythonとして書いていた、という場合にちゃんとそれを続けられるようにするための変更です。

単に以前はaliasを取る手段が面倒だったのが簡単に取れるようになっていたので、という点もあります。 (brew infoから。)

3## brew file updateなどの際にBrewfileの出力を表示させないように(v9.0.3)

brew-wrapを使ってbrew install <package>とした場合なども毎回 Brewfileの更新状態を表示してましたが、今更ながら邪魔かな、と思い始めたので表示をやめて デバッグモードのみで表示させるようにしました。

以前と同じような出力にしたい場合は

1
$ brew file --verbose debug init

のように--verbose debugを使うか、環境変数で

1
export HOMEBREW_BREWFILE_VERBOSE=0

を設定してください。

Pythonのバージョン>=3.8.1,<3.12に対応

Homebrew-file 8.XまではPython 3.9に対応していましたが、 今回色々とアップデートしていて3.10の機能も入れたりしていました。

ただ、HomebrewでこれだけのためにPython入れるのもあれなのと、 [email protected]とかを依存先として入れてしまうとPATH下($(brew –prefix)/bin)には自動的には入らない問題とかもあるので 基本的には現状のmacOSのPythonで動かせるようにしたいな、と。

ついでにLinux環境も考えてできるだけ古いもの、ということで3.8.1になってますが、 3.8.1はflake8などのlinter系の対応状況による制限だったりします。 まあこのくらいまでで良いか、と。

Linuxだと3.6や3.7しか入ってない場合もあるかもしれませんが、 その場合にはbrew install python3して最新のPython3をインストールしてつかてください。

brew-fileのformulaでは以前は

1
depends_on "python"

としていましたがこれは削除しました。

古いバージョンに戻すにあたって変更した主な点は以下のような点

  • Structural Pattern Matching (match-case文, >=3.10)をif-elseに
  • from __future__ import annotationsの追加(3.9以下でannotationsに関する機能を使うため)
  • str.removesuffixstr.removeprefix (>=3.9)をstr.replaceで代用

その他開発面での主な更新点

  • Poetryを使ったパッケージ管理
    • src以下に分割した形でコードを書く
    • Pythonパッケージとしてbrew-fileというコマンドを使える形にもする
      • パッケージとしては基本的に外部ライブラリには依存しないように(dev環境でpytestとかは入れる)
  • Homebrewで配布するスクリプトはcombine.shでsingle scriptにしたものを$(brew –prefix)/binに配置するように
  • testsで色々テストを追加
  • pre-commitを使ってコードチェック(black, flake8, isort, mypy, etc…)
  • ログ出力をすべてprintからloggerに
  • sys.exitをraise Exeptionに変更してmainの中で処理するように

まとめ

HomebrewがAPIがデフォルトになったことで色々と大きな変更もありましたが、 とりあえず以前と同じような使用感には出来ているかと思います。

その他の部分で多少快適になったかな、とも。

Homebrewの変更もまだまだ細かい所で入りそうでHomebrew-fileへの影響もあるかと思いますし 色々見落としてる部分もあるかもしれないのでもし何かあれば GitHubのIssueなりTwitterなりここのコメントなりで教えていただけるとありがたいです。

Sponsored Links
Sponsored Links

« Pythonで複数のファイルからなるスクリプトを1つのスクリプトにまとめる ブログ10周年 »

}