フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【新規ツール探し】asdf と比較しても使いやすいCLI のバージョン管理ツール「aqua」

  • 記事作成日:2022/12/13

情報

名前 URL
Github https://github.com/aquaproj/aqua
公式サイト https://aquaproj.github.io/
デモサイト https://asciinema.org/a/498262?autoplay=1
開発母体 suzuki-shunsuke 氏
version 1.25.0
言語 Go
価格 無料
ライセンス MIT

何ができるもの?

  • コマンドラインツールのバージョン管理
  • 利用バージョンを宣言的にファイルで管理できる
  • GitHub Actions での利用や、Renovate との連携も可能

利用シーン

  • リポジトリ、チームでバージョンを統一したい時

所感

asdf と比較してという形になりますが

  • asdf だと reshim をしないと使えなかったり癖がある
  • 新規 plugin の追加が楽そう
  • lazy install が便利
  • コマンドがシンプルなので asdf の plugin-add / install / global /local ... とかを考えなくていい

などの理由からとても使いやすいツールだなと感じました。

設定ファイルだけ見ると asdf の方が圧倒的にわかりやすいですが、asdf はどのリポジトリからダウンロードするのか?という情報が追記できないので、このファイルとは別に plugin-add するレジストリ情報を共有しないといけません。

❯ cat .tool-versions

golang 1.19.1
gcloud 408.0.0

❯ cat aqua.yaml

---
# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
# checksum:
#   # https://aquaproj.github.io/docs/reference/checksum/
#   enabled: true
#   require_checksum: true
registries:
  - type: standard
    ref: v3.103.0 # renovate: depName=aquaproj/aqua-registry
packages:
  - name: ziglang/zig@0.9.0

あと単純に気になったのは、なぜセキュリティ製品出してる aqua がやってるのかよくわからなかったですね???と思ったらなんの関係もなかった。

使い方

今回使ったファイル

インストール

❯ brew install aquaproj/aqua/aqua

❯ aqua

NAME:
   aqua - Version Manager of CLI. https://aquaproj.github.io/

USAGE:
   aqua [global options] command [command options] [arguments...]

VERSION:
   1.25.0 (9a544d686c6b7898596dd4a44cd04bd3a2782473)

COMMANDS:
   init                   Create a configuration file if it doesn't exist
   init-policy            Create a policy file if it doesn't exist
   install, i             Install tools
   update-aqua            Update aqua
   generate, g            Search packages in registries and output the configuration interactively
   which                  Output the absolute file path of the given command
   exec                   Execute tool
   list                   List packages in Registries
   generate-registry, gr  Generate a registry's package configuration
   completion             Output shell completion script for bash or zsh
   version                Show version
   cp                     Copy executable files in a directory
   update-checksum        Create or Update .aqua-checksums.json
   help, h                Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --log-level value         log level [$AQUA_LOG_LEVEL]
   --config value, -c value  configuration file path [$AQUA_CONFIG]
   --trace value             trace output file path
   --cpu-profile value       cpu profile output file path
   --help, -h                show help (default: false)
   --version, -v             print the version (default: false)
                                                                   

使ってみる

❯ aqua init

                                                                                                                                                                                            
❯ cat aqua.yaml

---
# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
# checksum:
#   # https://aquaproj.github.io/docs/reference/checksum/
#   enabled: true
#   require_checksum: true
registries:
- type: standard
  ref: v3.103.0 # renovate: depName=aquaproj/aqua-registry
packages:

aqua list で標準で対応している全てのツールが見える。

❯ aqua list

standard,jckuester/terradozer
standard,jreleaser/jreleaser/standalone
standard,tmccombs/hcl2json
standard,golang.org/x/tools/cmd/goimports
standard,kubevela/kubevela
standard,rancher/k3d
standard,haskell/cabal/cabal-install
standard,k1LoW/ndiag
standard,kastenhq/external-tools/k10tools
...

今回は zig というプログラミング言語を入れてみる。

❯ aqua g -i ziglang/zig

❯ aqua i

INFO[0000] download and unarchive the package            aqua_version=1.25.0 env=darwin/arm64 package_name=aqua-proxy package_version=v1.1.2 program=aqua registry=
INFO[0001] create a symbolic link                        aqua_version=1.25.0 command=aqua-proxy env=darwin/arm64 package_name=aqua-proxy package_version=v1.1.2 program=aqua registry=
INFO[0001] create a symbolic link                        aqua_version=1.25.0 command=zig env=darwin/arm64 program=aqua
INFO[0001] download and unarchive the package            aqua_version=1.25.0 env=darwin/arm64 package_name=ziglang/zig package_version=0.10.0 program=aqua registry=standard
aqua i  4.33s user 2.38s system 46% cpu 14.421 total

g (generate) -i をつけたので yaml ファイルも更新されていた。

❯ cat aqua.yaml

---
# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
# checksum:
#   # https://aquaproj.github.io/docs/reference/checksum/
#   enabled: true
#   require_checksum: true
registries:
- type: standard
  ref: v3.103.0 # renovate: depName=aquaproj/aqua-registry
packages:
- name: ziglang/zig@0.10.0

またインストール自体は aqua i で実施された。 しかし、そのままだとパスが通ってない。

❯ which zig

zig not found

公式に載っていたこのパスを追加する必要がある。

❯ export PATH="${AQUA_ROOT_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/aquaproj-aqua}/bin:$PATH"

❯ which zig

/Users/xxx/.local/share/aquaproj-aqua/bin/zig

❯ zig

info: Usage: zig [command] [options]

Commands:

  build            Build project from build.zig
  init-exe         Initialize a `zig build` application in the cwd
  init-lib         Initialize a `zig build` library in the cwd

  ast-check        Look for simple compile errors in any set of files
  build-exe        Create executable from source or object files
  build-lib        Create library from source or object files
  build-obj        Create object from source or object files
  fmt              Reformat Zig source into canonical form
  run              Create executable and run immediately
  test             Create and run a test build
  translate-c      Convert C code to Zig code

  ar               Use Zig as a drop-in archiver
  cc               Use Zig as a drop-in C compiler
  c++              Use Zig as a drop-in C++ compiler
  dlltool          Use Zig as a drop-in dlltool.exe
  lib              Use Zig as a drop-in lib.exe
  ranlib           Use Zig as a drop-in ranlib

  env              Print lib path, std path, cache directory, and version
  help             Print this help and exit
  libc             Display native libc paths file or validate one
  targets          List available compilation targets
  version          Print version number and exit
  zen              Print Zen of Zig and exit

General Options:

  -h, --help       Print command-specific usage

zig で Hello World してみる

❯ tree

.
├── aqua.yaml
├── build.zig
└── src
   └── main.zig

cat src/main.zig

const std = @import("std");

pub fn main() anyerror!void {
    std.debug.print("Hello, {s}!\n", .{"World"});
}
❯ zig run src/main.zig

Hello, World!
                                                                                                                                                                                            
❯ zig build

                                                                                                                                                                                            
❯ ./zig-out/bin/aqua

Hello, World!

ちゃんと aqua でいれても動きますね!

zig のバージョンを変えてみる

---
# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
# checksum:
#   # https://aquaproj.github.io/docs/reference/checksum/
#   enabled: true
#   require_checksum: true
registries:
  - type: standard
    ref: v3.103.0 # renovate: depName=aquaproj/aqua-registry
packages:
-  - name: ziglang/zig@0.10.0
+  - name: ziglang/zig@0.9.0

おー。zig を叩いたら aqua の lazy install が発動しましたね。 これは asdf に比べて便利です。

❯ zig version

INFO[0000] download and unarchive the package            aqua_version=1.25.0 env=darwin/arm64 exe_name=zig exe_path=/Users/xxx/.local/share/aquaproj-aqua/pkgs/http/ziglang.org/download/0.9.0/zig-macos-aarch64-0.9.0.tar.xz/zig-macos-aarch64-0.9.0/zig package=ziglang/zig package_name=ziglang/zig package_version=0.9.0 program=aqua registry=standard

0.9.0

どうやら zig は aqua-proxy に symlink されていて、処理をインターセプトしてるようですね。 これにより指定のバージョンがない場合はそれをダウンロードしたり、aqua.yaml によってバージョンを切り替えてるんですね。

❯ l /Users/xxx/.local/share/aquaproj-aqua/bin/zig

lrwxr-xr-x 10 xxx 13 12 10:20  /Users/xxx/.local/share/aquaproj-aqua/bin/zig -> aqua-proxy

ここに公式説明がありました。

asdf だと .tool-versions が変わると asdf install しなきゃとなるのですが、1ステップなくなるのはいいですね。

uninstall

削除コマンドはないとのことなので。男らしく rm してくださいとありました。

rm -R ~/.local/share/aquaproj-aqua/pkgs/http/ziglang.org/download/0.10.0/zig-macos-aarch64-0.10.0.tar.xz/

新しいコマンドの追加

このリポジトリに追加すればいいだけですね。楽ちんです。

- type: github_release
  repo_owner: profclems
  repo_name: glab
  asset: 'glab_{{trimV .Version}}_{{.OS}}_{{.Arch}}.{{.Format}}'
  link: https://glab.readthedocs.io/en/latest/
  description: An open-source GitLab command line tool bringing GitLab's cool features to your command line
  format: tar.gz
  format_overrides:
  - goos: windows
    format: zip
  replacements:
    darwin: macOS
    linux: Linux
    386: i386
    amd64: x86_64
    windows: Windows
  files:
  - name: glab
    src: bin/glab

asdf のプラグインを作ったことがありますが、fork して色々シェルを書かないといけないので面倒だったのでこれで済むのは手軽です。