PythonとNode.jsをanyenvで管理してみよう
https://gyazo.com/7f111ccfcc585205f74864290786e943
はじめに
これまで Python を複数バージョンを使い分けるために pyenv を使っていました。そこに Jupyterlab を使うようになって、必然的に Node.js にも触れるようになり、これも自然と Node.js も複数バージョンを管理したいと思うようになって nodenv を使い始めました。インストール方法はそれぞれよく似てはいるのですが、別々に行う必要があるのは地味に面倒なので、anyenv を使って管理するようになりました。 この資料は、anyenv のインストールと設定についてまとめたものです。
2023/5/19 追記
asdfの方が高速で動作し、言語に加え、awscli や terraform などの様々なツールのランタイムバージョンをプロジェクト単位で管理できるので、こちらも検討してみてください。 2023/6/2 追記
asdf の方がさらに高速で動作します。asdf と互換性もあるので、こちらを推奨します。 anyenvについて
anyenv は rbenv スタイルの環境管理ソフトのシンプルなラッパーです。anyenv をインストールすれば、もう **env ごとに git clone したり、シェルプロファイルを変更したりする必要がなくなります。
インストール
anyenv のリポジトリをクローンします。
code:bash
シェルの設定をしておきます。設定ファイルは利用しているシェルによって異なります。
Bashでは ~/.bash_profile
Zsh では ~/.zprofile
設定ファイルは以下を追加しておきます。
code:bash
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
for D in /bin/ls $HOME/.anyenv/envs
do
export PATH="$HOME/.anyenv/envs/$D/shims:$PATH"
done
}
anyenv を初期化しておきます。
code: bash
$ anyenv install --init
anyenvのプラグインをインストール
anyenv-update
anyenv-updae をインストールしておくと簡単に anyenv をアップディトできるようになります。
code: bash
$ mkdir -p $(anyenv root)/plugins
$ git clone $URL $(anyenv root)/plugins/anyenv-update
アップディトするときは次のコマンドを実行するだけです。
code:bash
$ anyenv update
サポートしている *env の一覧
次のコマンドでサポートしている *env を一覧することができます。
code: bash
$ anyenv install -l
Renv
crenv
denv
erlenv
exenv
goenv
hsenv
jenv
jlenv
kubectlenv
luaenv
nodenv
phpenv
plenv
pyenv
rbenv
sbtenv
scalaenv
swiftenv
tfenv
pyenv をインストール
Python と Node.js を使うので pyenv と nodenv をインストールします。
code: bash
$ anyenv install pyenv
$ anyenv install nodenv
$ exec $SHELL -l
これで、pyenv と nodenv が使えるようになったので、Python と Node.js をインストールします。
code: bash
$ pyenv install miniconda3-4.7.12
$ pyenv install 3.10.4
$ pyenv install 3.9.12
`
pyenv versions でインストール済みのバージョンを一覧できます。
code: bash
pyenv versions
* system (set by /Users/goichiiisaka/.anyenv/envs/pyenv/version)
3.10.4
3.9.12
miniconda3-4.7.12
macOSの場合、system の Pythonは 2.7x系なので、次のように変更しておきます。
code: bash
$ pyenv global 3.10.4
nodenv をインストール
Node.js について、この資料の作成時点での最新版は 18.1.0、LTS版は 16.15.0 でしたので、これらをインストールします。
code: bash
$ nodenv install 16.15.0
$ nodenv install 18.1.0
nodenv versions でインストール済みのNode.js のバージョンを一覧できます。
code: bash
nodenv versions
* system (set by /Users/goichiiisaka/.anyenv/envs/nodenv/version)
16.15.0
18.1.0
nodenv glovalで 18.1.0 を指定します。
code: bash
$ nodenv local 18.1.0
anyenv versios` を使うと、すべてのインストール済みバージョンを一覧できます。
code: bash
$ anyenv versions
nodenv:
16.15.0
* 18.1.0 (set by /Users/goichiiisaka/.anyenv/envs/nodenv/version)
pyenv:
system
* 3.10.4 (set by /Users/goichiiisaka/.anyenv/envs/pyenv/version)
3.9.12
miniconda3-4.7.12
それぞれの*env のプラグインについて
anyenv でインストールした *env ではいくつかのプラグインは自動的にインストールされます。
code: bash
$ ls -1 $(pyenv root)/plugins
python-build
$ ls -1 $(nodenv root)/plugins
node-build
nodenv-vars
これらのうち、python-build と node-build は、それぞれ Python と Node.js をインストール/アンインストールするためのものです。
nodenv-vars
Nodeのプロセスを起動する前に、グローバルおよびプロジェクト固有の環境変数を設定するためのnodenvのプラグインです。プロジェクトのディレクトリに配置した .nodenv-vars ファイルに、1行に1変数ずつ、 VAR=value の形式で環境変数を定義することができます。
code: bash
STAGE=staging
PARAMS=red,green
このとき、変数にドル記号($)をつけることで参照することができます。上記の例で、すでに定義されている PARAMS に値を追加するような場合は、次のように記述することができます。
code: bash
PARAMS=$PARAMS:red,green
変数が未定義または空白のときだけ設定されるような、条件付きの変数割り当てを行うこともできます。
code: bash
TMPDIR?=/tmp/myproject
シェルの環境変数の定義と異なり、拡張やコマンド置換はできません。また、 VAR=value の形式でない行は無視されます。
全てのNode.jsだけに適用される環境変数を定義する場合は、 $(nodenv root)/vars に定義します。
node-build-update-defs
node-build-update-defs プラグインをインストールしておくと、インストール可能なNode.JSをアップディトすることができるようになります。
code: bash
$ git clone $URL "$(nodenv root)/plugins/node-build-update-defs"
nodenv-env
nodenv-env プラグインはNode.js に関連した環境変数だけ参照することができるようになります。
code: bash
$ git clone $URL "$(nodenv root)/plugins/nodenv-env"
nodenv-alias
nodenv-alias はインストールしたNode.js のバージョンに別名(エイリアス)をつけることができるようになります。
code: bash
$ git clone $URL $(nodenv root)/plugins/nodenv-aliases
pyenv-virtualenv
Python で仮想環境を使えるように pyenv-virtualenv をリポジトリからクローンしてインストールします。
code: bash
$ git clone $URL "$(anyenv root)/envs/pyenv/plugins/pyenv-virtualenv"
次のコマンドでバージョンが表示されればインストールはうまくいっています。
code: bash
$ pyenv virtualenv --version
pyenv-virtualenv 1.1.5 (virtualenv unknown)
利用例
ここから実際に Python の conda 環境を構築して、Jupyterlab を実行するための準備をしてみます。
はじめに利用する Python として conda を指定します。
code: bash
$ cd $HOME/Project/Python.Osaka/Tutorials # これは任意のディレクトリでOK
$ pyenv local miniconda3-4.7.12
conda の初期化をしておきます。
code: bash
$ conda init ${SHELL##*/}
$ exec $SHELL -l
この例では、汎用的に記述していますが、使用しているシェルを直接していしても問題ありません。 例: conda init zsh
conda環境を構築します。
code: bash
$ conda create -y -n EDA python==3.10 scipy numpy dataprep jupyterlab
この例では、conda 環境として EDA という名前で作成しています。
このconda 環境 を有効にする場合:
code: bash
$ ocnda activate EDA
現在のConda環境を無効にする場合:
code: bash
$ conda deactivate
Jupyterlab の設定を行います。
code: bash
$ jupyter lab --generate-config
これで、$HOME/.jupyter/jupyter_lab_config.py にデフォルトの設定が書き出されます。
ローカルマシンで使用する場合はこれで問題ありませんが、クラウドなどリモートのサーバーで実行する場合は、
次のスクリプトを実行して設定しておきます。
code: bash
PW=$( python -c 'from jupyter_server.auth import passwd; print(passwd())')
PORT=8123 # 任意
cat <<_EOF_ >> $HOME/.jupyter/jupyter_lab_config.py
c = get_config()
c.IPKernelApp.pylab = 'inline'
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = $PORT
c.NotebookApp.password = $PW
_EOF_
まとめ
anyenv を使うと使用する言語どとの *env を簡単に設定することができます。
参考