既存の xxenv を anyenv に移行する時は install し直したほうが良い
Tags: anyenv, pyenv, rbenv
Published: 2020-03-26 00:46:42

python、ruby、go、node、haskell ... と複数の言語で開発しています。
各言語ごとに xxenv をインストールしていたのですが、さすがに home 直下も汚くなるし、統合的に管理したほうが何かと便利だと思って anyenv を入れようと思って嵌った。

# 結論

先に結論から。
既存の .xxenv を .anyenv/env/xxenv に mv しても上手く行きません！
anyenv に移行する人は、安直せずに anyenv で改めて各言語・ライブラリをインストールし直しましょう。

# どうして上手くいかないのか

移行時の環境はこんな状態。
anyenv にはまだ何も入れていません。

```
$  ls -la | grep env
drwxrwxrwx 1 m-yoshimo m-yoshimo   4096  4月 24 21:51 .anyenv
drwxrwxrwx 1 m-yoshimo m-yoshimo   4096  4月 17 15:05 .pyenv
drwxrwxrwx 1 m-yoshimo m-yoshimo   4096  6月 18  2018 .rbenv
$ anyenv versions
$
```

試しに pyenv を移行しようと思いました。
さほどライブラリをインストールしているわけではないですが、python2 系と python3 系の両方を利用していたので、言語をインストールし直すのは面倒と思って、安直に mv したわけです。

```
$ pyenv versions
  system
  2.7.16
* 3.7.3 (set by /home/m-yoshimo/.python-version)
$ mv .pyenv .anyenv/envs/pyenv
```

すると、anyenv と python は見事に認識してくれました！

```
$ anyenv versions
pyenv:
  system
  2.7.16
* 3.7.3 (set by /home/m-yoshimo/.python-version)
$ which python
/home/m-yoshimo/.anyenv/envs/pyenv/shims/python
$ python --version
Python 3.7.3
```

しかし、これはぬか喜びでした。
pip を動かそうとすると。。。

```
$ pip list
/home/m-yoshimo/.anyenv/envs/pyenv/pyenv.d/exec/pip-rehash/pip: /home/m-yoshimo/.anyenv/envs/pyenv/versions/3.7.3/bin/pip: /home/m-yoshimo/.pyenv/versions/3.7.3/bin/python3.7: 誤ったインタプリタです: そのようなファイルやディレクトリはありません
$ pyenv rehash
$ pip list
/home/m-yoshimo/.anyenv/envs/pyenv/pyenv.d/exec/pip-rehash/pip: /home/m-yoshimo/.anyenv/envs/pyenv/versions/3.7.3/bin/pip: /home/m-yoshimo/.pyenv/versions/3.7.3/bin/python3.7: 誤ったインタプリタです: そのようなファイルやディレクトリはありません
```

rehash しても init しなおしても勿論ダメ。
どうも、直接ハードコードされているので、これを解消しないとダメな模様

```
$ grep -rn '\.pyenv' .anyenv/envs/pyenv/versions/ | head -n 10
.anyenv/envs/pyenv/versions/2.7.16/bin/2to3:1:#!/home/m-yoshimo/.pyenv/versions/2.7.16/bin/python2.7
.anyenv/envs/pyenv/versions/2.7.16/bin/aws:1:#!/home/m-yoshimo/.pyenv/versions/2.7.16/bin/python2.7
.anyenv/envs/pyenv/versions/2.7.16/bin/aws_completer:1:#!/home/m-yoshimo/.pyenv/versions/2.7.16/bin/python2.7
.anyenv/envs/pyenv/versions/2.7.16/bin/easy_install:1:#!/home/m-yoshimo/.pyenv/versions/2.7.16/bin/python2.7
.anyenv/envs/pyenv/versions/2.7.16/bin/easy_install-2.7:1:#!/home/m-yoshimo/.pyenv/versions/2.7.16/bin/python2.7
.anyenv/envs/pyenv/versions/2.7.16/bin/futurize:1:#!/home/m-yoshimo/.pyenv/versions/2.7.16/bin/python2.7
.anyenv/envs/pyenv/versions/2.7.16/bin/idle:1:#!/home/m-yoshimo/.pyenv/versions/2.7.16/bin/python2.7
.anyenv/envs/pyenv/versions/2.7.16/bin/jp.py:1:#!/home/m-yoshimo/.pyenv/versions/2.7.16/bin/python2.7
.anyenv/envs/pyenv/versions/2.7.16/bin/pasteurize:1:#!/home/m-yoshimo/.pyenv/versions/2.7.16/bin/python2.7
.anyenv/envs/pyenv/versions/2.7.16/bin/pip:1:#!/home/m-yoshimo/.pyenv/versions/2.7.16/bin/python2.7
...
```

python ファイルにハードコードされているということは。。。

```
$ grep -rn '\.pyenv' .anyenv/envs/pyenv/versions/2.7.16/lib/ | head -n 10
バイナリファイル .anyenv/envs/pyenv/versions/2.7.16/lib/libpython2.7.a に一致しました
.anyenv/envs/pyenv/versions/2.7.16/lib/pkgconfig/python-2.7.pc:1:prefix=/home/m-yoshimo/.pyenv/versions/2.7.16
.anyenv/envs/pyenv/versions/2.7.16/lib/pkgconfig/python-2.7.pc:3:libdir=/home/m-yoshimo/.pyenv/versions/2.7.16/lib
バイナリファイル .anyenv/envs/pyenv/versions/2.7.16/lib/python2.7/BaseHTTPServer.pyc に一致しました
バイナリファイル .anyenv/envs/pyenv/versions/2.7.16/lib/python2.7/BaseHTTPServer.pyo に一致しました
バイナリファイル .anyenv/envs/pyenv/versions/2.7.16/lib/python2.7/Bastion.pyc に一致しました
バイナリファイル .anyenv/envs/pyenv/versions/2.7.16/lib/python2.7/Bastion.pyo に一致しました
バイナリファイル .anyenv/envs/pyenv/versions/2.7.16/lib/python2.7/CGIHTTPServer.pyc に一致しました
バイナリファイル .anyenv/envs/pyenv/versions/2.7.16/lib/python2.7/CGIHTTPServer.pyo に一致しました
バイナリファイル .anyenv/envs/pyenv/versions/2.7.16/lib/python2.7/ConfigParser.pyc に一致しました
...
```

もちろんコンパイル済みの方にもハードコードされているわけです。

上記に見えるのは一部でしかなく、これらをすべて sed で置換するのも大変面倒なので、それするくらいなら各言語のバージョンとライブラリをインストールし直したほうが安全かつ楽ということでした。

試しに rbenv も mv でやってみましたが、同様の状況になったので諦めました。

おしまい