💧

aqua update による Registry と Package のアップデート

2023/10/16に公開

CLI ツールを YAML でバージョン管理できるツール aqua を開発しています。

先日 zenn で aqua に関する本も書いたのでそちらも御覧ください。無料です。

https://zenn.dev/shunsuke_suzuki/books/aqua-handbook

本記事では aqua v2.14.0 で追加されたコマンド aqua update を紹介します。
リリースノートドキュメントに書いてあるのと同じ内容です。

aqua では YAML を用いてツールのバージョン管理を行うため、定期的にツールのアップデートを行う必要があります。
従来より aqua は Renovate の Preset を提供しており Renovate でツールの update を行うことを推奨しています。

https://aquaproj.github.io/docs/guides/renovate

そのためこれまで update コマンドは実装されてきませんでしたが、 update コマンドが欲しくなるユースケースが幾つか存在します。

  1. 大人の事情で Renovate が使えない
  2. Git で管理されていない aqua.yaml を更新したい
  3. 手元で ツールのバージョンを切り替えたい
  4. etc

そこで update コマンドを実装することにしました。

基本的な使い方

次のような aqua.yaml を用意します。わざと registry と package を古くしています。

aqua.yaml
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

こうなります。

aqua.yaml
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 を探索します。

https://aquaproj.github.io/docs/reference/config/#configuration-file-path

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 でバージョンが指定されている場合のみ更新されます。

aqua.yaml
packages:
  - name: cli/cli@v2.0.0 # 更新される
  - name: gohugoio/hugo
    version: v0.118.0 # 更新されない

なので update コマンドの対象から特定の package を除外したい場合、 version フィールドを使えば良いです。

まぁ version フィールドが指定されている package を更新したい場合も当然あるので、いずれなんらかのオプションを追加するかもしれません。

commit hash は更新されない

バージョンとして commit hash が指定されている場合、バージョンは更新されません。

aqua.yaml
packages:
  - name: google/pprof@d04f2422c8a17569c14e84da0fae252d9529826b # 更新されない

まぁ commit hash を更新したい場合も当然あるので、いずれなんらかのオプションを追加するかもしれません。

さいごに

以上、 update コマンドの紹介でした。
update コマンドは結構前から要望が来ていたので遅くはなりましたが対応できてよかったです。
ただ Renovate を使って更新ができているとあまり update コマンドの必要性は感じないかもしれません。
それでも update コマンドを使ってローカルでバージョンを切り替えられるのは便利なのではないかと思います。

https://aquaproj.github.io/docs/guides/update-command/

Discussion