asdf や mise で Unable to parse versions というエラーが出た場合の対処

## はじめに

2025/1/8 に嵌ったエラーの備忘録です

## エラーの内容

`.tool-versions` ファイルに `aws-sam-cli 1.132.0` と書かれている状態で以下のコマンドを実行しました

```sh
mise install
```

すると、以下のエラーが発生しました

```
mise ERROR [~/some-path/.tool-versions] aws-sam-cli@1.132.0: error running list-all: exited with code 1                          
asdf-pyapp: [ERROR] Unable to parse versions for 'aws-sam-cli'
mise ERROR error resolving versions
mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information
```

## エラー原因

エラーメッセージに従い、 `--verbose` をつけて実行してみます

```sh
mise install --verbose
```

実行結果

```
DEBUG ARGS: /opt/homebrew/bin/mise install --verbose
DEBUG EnvResults
DEBUG config: ~/some-path/.tool-versions
DEBUG $ /Users/somebody/.local/share/mise/plugins/aws-sam-cli/bin/list-all 
DEBUG ToolRequest.is_installed: error running list-all: exited with code 1
asdf-pyapp: [ERROR] Unable to parse versions for 'aws-sam-cli'
DEBUG install_some_versions: aws-sam-cli@1.132.0
DEBUG $ /Users/somebody/.local/share/mise/plugins/aws-sam-cli/bin/list-all 
Error: 
   0: error running list-all: exited with code 1
      asdf-pyapp: [ERROR] Unable to parse versions for 'aws-sam-cli'

Location:
   src/plugins/asdf_plugin.rs:120

Version:
   2024.12.19 macos-arm64 (2024-12-23)

Backtrace omitted. Run with RUST_BACKTRACE=1 environment variable to display it.
Run with RUST_BACKTRACE=full to include source snippets.
mise ERROR [~/some-path/.tool-versions] aws-sam-cli@1.132.0: error running list-all: exited with code 1                          
asdf-pyapp: [ERROR] Unable to parse versions for 'aws-sam-cli'
mise ERROR error resolving versions
mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information
```

`~/.local/share/mise/plugins/aws-sam-cli/bin/list-all` でエラーが起こっていることが分かります

:::note info
asdf install でも同じエラーが発生します
:::

内容を確認すると、以下のようになっています

```sh
#!/usr/bin/env bash

set -euo pipefail

current_script_path=${BASH_SOURCE[0]}
plugin_dir=$(dirname "$(dirname "$current_script_path")")
toolname=$(basename "$plugin_dir")

# shellcheck source=../lib/utils.bash
source "${plugin_dir}/lib/utils.bash"

get_package_versions "${toolname}" | sort_versions | xargs echo
```

`../lib/utils.bash` を参照しているので、 `~/.local/share/mise/plugins/aws-sam-cli/lib/utils.bash` を確認します

すると、以下のような行が存在します

```sh
  version_output_raw=$("${ASDF_PYAPP_RESOLVED_PYTHON_PATH}" -m pip install ${pip_install_args[@]+"${pip_install_args[@]}"} "${package}==" 2>&1) || true
```

つまり、 `python -m pip install aws-sam-cli==` というコマンドが内部的に実行されていることが分かります

ではこれを実行してみましょう

```sh
python -m pip install aws-sam-cli==
```

実行結果

```
ERROR: Invalid requirement: 'aws-sam-cli==': Expected end or semicolon (after name and no valid version specifier)
    aws-sam-cli==
               ^
```

これがエラーの原因です

pip を使って aws-sam-cli のバージョンを取得しようとしていますが、これがエラーになっています

実は、以前は `pip install aws-sam-cli==` というコマンドでインストール可能なバージョンの一覧が取得できていました

しかし、 pip 24.1 以降ではこのコマンドが使えなくなってしまいました

https://pip.pypa.io/en/stable/news/#b1-2024-05-06

> Remove support for legacy versions and dependency specifiers.
>
> Packages with non standard-compliant versions or dependency specifiers are now ignored by the resolver. Already installed packages with non standard-compliant versions or dependency specifiers must be uninstalled before upgrading them. (#12063)

pip の新しいバージョンでは以下のコマンドでインストール可能なバージョンの一覧が取得できます

```sh
pip index versions <パッケージ名>
```

実はエラーを出している asdf-pyapp に Pull Request も出されていますが、残念ながら放置状態です

https://github.com/amrox/asdf-pyapp/pull/34

aws-sam-cli や awscli など、 pip でインストールするタイプのツールは asdf-pyapp を使用しています

https://github.com/amrox/asdf-pyapp?tab=readme-ov-file#compatible-python-applications

これらのツールについては同様のエラーが発生すると思われるので、以下の対処を行う必要があります（Pull Request がマージされるまでは）

## 対処方法

もちろん、 pip のバージョンを 23 以前に落とすという方法でも対処可能ですが、推奨はできません

別の方法で対応します

### mise

まず今使っている `aws-sam-cli` プラグインをアンインストールします

```sh
mise plugin remove aws-sam-cli
```

`~/.config/mise/config.toml` に以下の行を追加します

```toml
[alias]
aws-sam-cli = "https://github.com/RyoWakabayashi/asdf-pyapp"
```

本来であれば `aws-sam-cli` のプラグインには `https://github.com/amrox/asdf-pyapp.git` が使用されますが、これを `https://github.com/RyoWakabayashi/asdf-pyapp` （フォークしたリポジトリー）に設定します

この状態で改めてプラグインをインストールします

```sh
mise plugin add aws-sam-cli
```

これでエラーが発生しなくなります

### asdf

まず今使っている `aws-sam-cli` プラグインをアンインストールします

```sh
asdf plugin remove aws-sam-cli
```

`https://github.com/kenichikat/asdf-pyapp.git` （Pull Request を出している人のフォーク）を指定してプラグインを再インストールします

```sh
asdf plugin add aws-sam-cli https://github.com/RyoWakabayashi/asdf-pyapp
```

これでエラーが起こらなくなります

## まとめ

pip のバージョンアップでこのような影響があるとは

とりあえずはプラグインのリポジトリー指定で回避できますが、どうにか Pull Request をマージしてもらえないものか