aqua update による Registry と Package のアップデート
CLI ツールを YAML でバージョン管理できるツール aqua を開発しています。
先日 zenn で aqua に関する本も書いたのでそちらも御覧ください。無料です。
本記事では aqua v2.14.0 で追加されたコマンド aqua update
を紹介します。
リリースノートやドキュメントに書いてあるのと同じ内容です。
aqua では YAML を用いてツールのバージョン管理を行うため、定期的にツールのアップデートを行う必要があります。
従来より aqua は Renovate の Preset を提供しており Renovate でツールの update を行うことを推奨しています。
そのためこれまで update コマンドは実装されてきませんでしたが、 update コマンドが欲しくなるユースケースが幾つか存在します。
- 大人の事情で Renovate が使えない
- Git で管理されていない aqua.yaml を更新したい
- 手元で ツールのバージョンを切り替えたい
- etc
そこで update コマンドを実装することにしました。
基本的な使い方
次のような aqua.yaml を用意します。わざと registry と package を古くしています。
registries:
# hello
- type: standard
ref: v3.0.0 # yoo
packages:
- name: suzuki-shunsuke/tfcmt@v3.0.0
- name: cli/cli@v2.30.0
何も引数を指定せずに aqua update
を実行すると全ての registry と package が最新に update されます。
$ aqua update
INFO[0001] updating a package aqua_version=2.14.0 env=darwin/arm64 new_version=v4.7.1 old_version=v3.0.0 package_name=suzuki-shunsuke/tfcmt program=aqua
INFO[0001] updating a package aqua_version=2.14.0 env=darwin/arm64 new_version=v2.36.0 old_version=v2.30.0 package_name=cli/cli program=aqua
INFO[0002] updating a registry aqua_version=2.14.0 env=darwin/arm64 new_version=v4.67.0 old_version=v3.0.0 program=aqua registry_name=standard
こうなります。
registries:
# hello
- type: standard
ref: v4.67.0 # yoo
packages:
- name: suzuki-shunsuke/tfcmt@v4.7.1
- name: cli/cli@v2.36.0
YAML 中のコメントは保持され、インデントもそのままです(空行が消えてしまったりするなど若干問題があったりしますが、ほぼ問題にはならないでしょう)。
import されているファイルの package も再帰的に更新されます。
ちなみに update には up
というエイリアスも設定されています。
$ aqua up
update コマンドはあくまで aqua.yaml を更新するだけなので package をインストールしたりはしません。
更新対象の aqua.yaml
aqua はカレントディレクトリからルートディレクトリに遡って aqua.yaml を探索します。
update コマンドでは基本的に一つだけ aqua.yaml を更新します。
対象のファイルを一つ見つけたらファイルの探索を終了します。
例えば次のようなディレクトリ構成で aqua update
を実行した場合、 /workspace/foo/aqua.yaml
が更新され /workspace/aqua.yaml
は更新されません。
/workspace/
aqua.yaml
foo/ # カレントディレクトリ
aqua.yaml
これは install コマンドとは若干異なる挙動ですが、余計なファイルの変更をしないようにこういう仕様になっています。
なので /workspace/aqua.yaml
を更新したい場合、カレントディレクトリを変更するか -c
オプションで /workspace/aqua.yaml
を指定してあげる必要があります。
aqua -c ../aqua.yaml up
ただ、これだと global config を更新するのが若干面倒なので、いずれ global config だけを更新するオプションとかを追加するかもしれません。
Registry だけを更新する
Registry だけを更新したい場合、 --only-registry
(-r
) option を指定します。
aqua up -r
package だけを更新する
package だけを更新したい場合、 --only-package
(-p
) option を指定します。
aqua up -p
Update するコマンドを指定する
Update したいコマンドを引数として渡すと、そのコマンドを含む package だけを更新できます。
e.g. suzuki-shunsuke/tfcmt と cli/cli だけを更新する
aqua up tfcmt gh
Fuzzy Finder で package を選択する
Fuzzy Finder で package を選択したい場合、 -i
option を指定します。
aqua up -i
Fuzzy Finder では Tab キーで package を複数選択できます。
Fuzzy Finder で version を選択する
Fuzzy Finder で version を選択したい場合、 -s
option を指定します。
全ての package のバージョンを Fuzzy Finder で選択するのは面倒なので、 -s
option を使う場合は package を指定することを想定しています。
# Fuzzy Finder で package と version を選択
aqua up -i -s
# GitHub CLI のバージョンを Fuzzy Finder で選択して切り替える
aqua up -s gh
特に 2 つ目の特定のツールのバージョンを切り替えるのは便利なのではないかと思います。
ローカルでバージョンを一時的に変更したい場合、従来はインストール可能なバージョンを調べてエディタで aqua.yaml を修正していましたが、それが update コマンドで完結するようになります。
version
フィールドが指定されている package は無視される
version
フィールドが指定されている package は更新されません。 name
でバージョンが指定されている場合のみ更新されます。
packages:
- name: cli/cli@v2.0.0 # 更新される
- name: gohugoio/hugo
version: v0.118.0 # 更新されない
なので update コマンドの対象から特定の package を除外したい場合、 version
フィールドを使えば良いです。
まぁ version
フィールドが指定されている package を更新したい場合も当然あるので、いずれなんらかのオプションを追加するかもしれません。
commit hash は更新されない
バージョンとして commit hash が指定されている場合、バージョンは更新されません。
packages:
- name: google/pprof@d04f2422c8a17569c14e84da0fae252d9529826b # 更新されない
まぁ commit hash を更新したい場合も当然あるので、いずれなんらかのオプションを追加するかもしれません。
さいごに
以上、 update コマンドの紹介でした。
update コマンドは結構前から要望が来ていたので遅くはなりましたが対応できてよかったです。
ただ Renovate を使って更新ができているとあまり update コマンドの必要性は感じないかもしれません。
それでも update コマンドを使ってローカルでバージョンを切り替えられるのは便利なのではないかと思います。
Discussion