micromamba を使ってみたメモ

先日バージョン1.0.0がリリースされた`micromamba`([mamba](https://github.com/mamba-org/mamba/releases))を使ってみたのでそのメモ

## [`micromamba`の概要](https://mamba.readthedocs.io/en/latest/installation.html#micromamba)

`micromamba`は一言でいうとC++で書かれたconda互換バイナリです。
`micromamba`は単一のバイナリなので`conda`どころかPythonすら必要ありません。

`conda`環境を最小限の容量で入れようとするとおよそ50MB、`mamba`まで入れると合わせて70MB程度ですが、`micromamba`のバイナリは8MBとちょっとだけ、まさにmicroです。結局いくつものパッケージを入れるので容量は使う気がしますが...
しかし、仮想環境を立てる機能はもちろん健在で、Pythonとそのパッケージ群も利用することはもちろん、`conda-forge`などで提供されているLLVM-ClangやGo言語、Rust、Ruby、juliaupなどを独立または共存させてインストールできるようになるマルチ仮想環境構築ツールになっています。

## `micromamba`のインストール

先ほど書いた通り`micromamba`は単一のバイナリなので、インストールというよりは環境変数の設定やshellへのhookの設定をすることになります。

### [自動インストール](https://mamba.readthedocs.io/en/latest/installation.html#automatic-installation)

MacならばHomebrewでインストールできます。

```zsh
brew install --cask micromamba
```

そのほか自動インストール用のスクリプトも用意されていて、`micro.mamba.pm/install.sh`からダウンロードできます。
`curl`を使って、

```bash: Linuxの場合
curl micro.mamba.pm/install.sh | bash
```

```zsh: Macの場合
curl micro.mamba.pm/install.sh | zsh
```

のようにパイプで渡してもOKです。

### [手動インストール](https://mamba.readthedocs.io/en/latest/installation.html#manual-installation)

残念ながらWindowsでは自動インストールが用意されていないため手動でインストールする必要があります。（LinuxとMacの手動インストールもほぼ同様なので割愛します）

まずはバイナリをダウンロードします。
https://micro.mamba.pm/api/micromamba/win-64/latest または [conda-forge](https://anaconda.org/conda-forge/micromamba/files)からどうぞ
ダウンロードしたファイル(micromamba-x.x.x-x.tar.bz2)を **2回** 解凍すると`lisence`と`Library`の2つのディレクトリが入っています。（7zipなどを使ってください）
`Library\bin\micromamba.exe`をそのまま使ってもよいし適当な場所に移動してもOK。

次に`micromamba`のルートディレクトリを設定します。`conda`や`mamba`でいうところの(base)になるディレクトリです。
環境変数名：`MAMBA_ROOT_PREFIX`
環境変数値：`任意のディレクトリ` ( 例えば ~/micromamba や C:\umamba など )
システムの環境変数に入れても構いませんし、この後`micromamba shell init`するshellへ一時的な環境変数として入れるだけでも大丈夫です。

最後に`micromamba shell init`を実行したら次回shell起動時に`micromamba`にhookされた状態になります。
`micromamba shell init --shell=cmd.exe`と指定すればコマンドプロンプトのhook用スクリプトが用意されてAutoRunレジストリが新規作成されます。
`micromamba shell init --shell=powershell`と指定すればPowershellのhook用スクリプトが用意され、`~\WindowsPowershell\profile.ps1`が新規作成されます。

hook用スクリプトは`%MAMBA_ROOT_PREFIX%\condabin`の中に作成されます。

### アンインストール

何らかの事情で`micromamba`の自動hookを解除したい場合は`micromamba shell deinit`を実行します。
`micromamba shell deinit --shell=cmd.exe`と指定すればコマンドプロンプトのhook用スクリプトとAutoRunレジストリキーが削除されます。
`micromamba shell init --shell=powershell`と指定すればPowershellのhook用スクリプトと`~\WindowsPowershell\profile.ps1`が削除されます。
個人的な設定を行っている場合は注意が必要かもしれません。

`micromamba shell deinit`を行っても`micromamba`で作成した仮想環境やパッケージのキャッシュは消えないので、手動で削除するか`micromamba env remove -n ENV_NAME`や`micromamba clean --all`をあらかじめ実行しておいてください。

## 仮想環境の作成

あとは`conda`の使い方と同じです。
`micromamba create -n blank_env`とすれば何もインストールされない(blank_env)環境ができます。
インストールした直後はchannelsの設定をしていないためパッケージの検索ができません。
`~\.mambarc`を作成して任意のchannelを追加するか、

```bashrc:~\\.mambarc
channels:
    - conda-forge
```

`micromamba config append channels conda-forge`のようにコマンドで追加してください。
`micromamba config append`で設定を行うと`~\.condarc`が編集されます。

`micromamba create -n llvm_c clangdev`のように指定すると(llvm_c)環境の作成と同時にclangdevとその依存パッケージをインストールします。

`micromamba create -n ruby ruby -c conda-forge`のようにchannelを指定したり、
`micromamba create -n rust_lang rust=1.60.*`のようにversionやハッシュを指定することもできます。

あとは`conda` ( `mamba` ) とほぼ同様に使えます。

## Python 環境を構築したときVSCodeが見つけてくれない

`conda` でPythonをインストールすると[Python拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-python.python)が入っているVSCodeは自動でインタープリンタを見つけてくれるのですが、 `micromamba` でPythonをインストールしてもVSCodeが自動で見つけてくれません。
Python拡張機能の設定ではcondaPathを設定することができるのですがここに `micromamba` (micromamba.exe, micromamba.bat)を指定しても見つけてくれません。

`conda` のバージョン4.4以上でしか機能しないので `micromamba` の現バージョン1.0.0は弾かれてしまっているようです。

<details><summary>その他気になるところ</summary><div>

`conda` と `micromamba` で `--version` 引数に対する出力形式が違うのも問題になるかも？

```bash
$ conda --version
conda 22.9.0

$ micromamba --version
1.0.0
```

`micromamba env list` だとアスキーアートでロゴが入るため `-q` オプションをつける必要がありそう。

```bash
$ conda env list
# conda environments:
#
base                  *  ~\conda
py1                      ~\conda\envs\py1
py2                      ~\conda\envs\py2

$ micromamba env list

                                           __
          __  ______ ___  ____ _____ ___  / /_  ____ _
         / / / / __ `__ \/ __ `/ __ `__ \/ __ \/ __ `/
        / /_/ / / / / / / /_/ / / / / / / /_/ / /_/ /
       / .___/_/ /_/ /_/\__,_/_/ /_/ /_/_.___/\__,_/
      /_/

  Name   Active  Path
-------------------------------------------
  base           ~\micromamba
  py1            ~\micromamba\envs\py1
  py2            ~\micromamba\envs\py2

$ micromamba -q env list
  Name   Active  Path
-------------------------------------------
  base           ~\micromamba
  conda          ~\micromamba\envs\conda
  py1            ~\micromamba\envs\py1
  py2            ~\micromamba\envs\py2
```

</div></details>

LinuxまたはMacのPyCharmであれば `conda` のパスに `micromambaを置いた場所/micromamba -q` のように指定することで `conda` とおよそ同様に使えるようになります。

## その他のメモ

* Powershell用のhookスクリプトは署名されないのでhookできない場合は実行ポリシーを変更してください。
* Windowsで `micromamba` を使うときは CMD や PowerShell よりも Git Bash とかを使った方が無難そう（`micromamba shell init` すると `~/.bash_profile` にhookスクリプトが追加される）
* `micromamba env create` が使えない（他にも指定子が異なったりすべてのオプションには対応していなかったりする）

VSCode向けに[Micromamba](https://marketplace.visualstudio.com/items?itemName=corker.vscode-micromamba)拡張機能が作られていたりするのでそのうちVSCode上で仮想環境の作成切替、開発環境の構築まで完結する日が来るのかも？