DEV Community

m-yoshimo
m-yoshimo

Posted on

2 2

既存の xxenv を anyenv に移行する時は install し直したほうが良い

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 でやってみましたが、同様の状況になったので諦めました。

おしまい

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay