Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8926

nodebrewからnodenv(on anyenv)に切り替える(2020年1月版)+ありがちなトラブル

$
0
0

動機

nodebrewにて手動でプロジェクト毎にnodeのバージョンを切り替えるのが面倒になったので、.node-versionファイルで自動切り替えできるnodenvで管理しようと思いました。
ひと悶着あり、同じことが起こってる人の役にたつかもしれないので、全体の流れも記録しておくことにしました。その都度、遭遇するかもしれないトラブルシューティングも下のほうに記載しておきましたので、躓いたら見てみてください。

最初の状態

環境

  • Mac
  • ターミナル
  • zsh

nodeのバージョンなど

10系と12系のプロジェクトがあるので、都度切り替えている感じです。

$ node -v

v10.16.3
$ which node

/usr/local/bin/nodebrew

その他にインストールされていたnodeのバージョン

$ nodebrew ls  

v9.11.2
v10.16.3
v12.10.0
v12.12.0

npmのバージョンなど

$ npm -v

6.13.0
$ which npm

/Users/user-name/.nodebrew/current/bin/npm

nodebrewを消す

nodebrewがインストールされている状態だとバッティングの可能性があるようなので、思い切って削除します。
-rfつけてる rmは慎重に。

$ rm -rf ~/.nodebrew

ばっさり

.bash_profileで通しているパスを削除しておく必要があるらしい。

$ vi ~/.bash_profile

↓のようなのを消しておきましょう

export PATH=/Users/user-name/.nodebrew/current/bin:$PATH

確認する。これでエラーが返ってきたらばっちりのはず…

$ node -v

/usr/local/bin/node

おっと…?

とりあえずanyenv -> nodenvをインストールしてみる

Homebrewで可能でした

$ brew install anyenv

からの。
初期化?

$ anyenv init

# Load anyenv automatically by adding
# the following to ~/.zshrc:

eval "$(anyenv init -)"

.zshrcファイルに記述が必要らしいので。

$ vi ~/.zshrc

まだファイルがなかった場合は下記の1行だけを置いておく形に。

eval "$(anyenv init -)"

viじゃなくても大丈夫だし、環境によっては .bashrcとかに記述の必要があるかも。

どこかに書かれていたけど、以下も必要なのかな?

$ anyenv install --init

とりあえず都度シェルをきれいに。

$ exec $SHELL -l 

本題の nodenvのインストール。 anyenv経由でできるらしい。

$ anyenv install nodenv

(前略)
Install nodenv succeeded!
Please reload your profile (exec $SHELL -l) or open a new session.

おけ。指示通りターミナルを初期化して、今の状態を確認してみる。

$ exec $SHELL -l
$ nodenv versions

* system => v12.12.0 (set by /Users/user-name/.anyenv/envs/nodenv/version)

おぉ?まだ nodenvでnodeをインストールしてないけど…まぁええんか?

以前の状態に合わせるために古いnodeもインストール

$ nodenv install 10.16.3

nodenv versions        
* system => v12.12.0 (set by /Users/user-name/.anyenv/envs/nodenv/version)
  10.16.3

ちゃんと入ったっぽい。

マシンを3年も使っていると色々と溜め込んだものがありまして

手動で切り替えてみよう

$ nodenv global 10.16.3

(略)

$ node -v     

v12.12.0

あかん。なんでや?

どこのnodeを使っているか場所を確認。

$ which node

/Users/user-name/.nodebrew/current/bin/node

ゾンビnode発見。
もういないはずの、 nodebrewの文字が…

確認。

$ nodebrew

zsh: command not found: nodebrew

やはりゾンビ。
さよならだ。(正直謎…)

$ rm -rf /Users/user-name/.nodebrew

気を取り直して

$ node -v

v13.2.0

HAHAHA、冗談はやめてくれYO

$ which node

/usr/local/bin/node

地縛霊発見。

sudo rm -rf /usr/local/bin/node

お祓い完了。

node -v

zsh: command not found: node

ほぅ…

(少しやけくそ目に)

$ anyenv install nodenv

$ nodenv versions

* 10.16.3 (set by /Users/user-name/.anyenv/envs/nodenv/version)

$ node -v

zsh: command not found: node

おこ。




あ。もしや。

$ exec $SHELL -l
$ node -v

v10.16.3

いえーす。

いつから(ry

$ npm -v

6.13.1

$ which npm

/usr/local/bin/npm

お前もか

$ brew uninstall --ignore-dependencies npm

Uninstalling /usr/local/Cellar/node/13.2.0... (4,654 files, 58.8MB)
node 12.12.0 is still installed.
Run `brew uninstall --force node` to remove all versions.

$ node -v
v12.12.0

$ npm -v
6.13.1

$ which npm
/usr/local/bin/npm

お祓いがきかないぃ(まぁアンインストールされるバージョンも変なの出てるんですけどね…)
おこ。そろそろ慣れてきたけど。

$ which npm

/usr/local/bin/npm

$ rm -rf /usr/local/bin/npm
$ npm -v                   
6.11.3

$ which npm

/Users/user-name/.anyenv/envs/nodenv/shims/npm

(ファンファーレが頭の中で鳴り響く)

特定のバージョンのnpmが欲しかったので。

$ npm install -g npm@6.13.0

こうしておいて、手動でのnodeバージョンを切り替えてnpmもついてくるかテスト

$ nodenv global 12.12.0
$ node -v
v12.12.0

$ npm -v
6.13.0

$ nodenv global 10.16.3
$ node -v
v10.16.3

$ npm -v
6.9.0

できた

やっと本題の、 .node-versionでのローカルの管理

npmにしろnodeを用いる際にnode自体のバージョンによってエラーなどの原因になることがしばしばあります。nodebrewでの管理でプロジェクトごとにこの辺りの事情が異なる場合、プロジェクトをはしごする際に手動でのnodeの切り替えが必要になったりします。
nodenvはコマンドを実行するディレクトリに .node-versionファイルがあるとそのファイル内で指定されているバージョンのnodeを用いて各種コマンドを実行してくれるので、切り替えを意識することがなくなります。

といってもファイルを自分で書く必要はない

$ cd /path/to/project/root
$ nodenv local 12.12.0

これでそのディレクトリに .node-versionファイルを生成してくれ、次回以降このディレクトリ内での作業時には自動的にnodeのバージョンが切り替わります。

.gitignore_globalでignoreしておく

プロジェクトで固定、かつ、チームメンバーが nodenvを使っている前提であれば、プロジェクトのルートに .node-versionファイルをコミットしておいて、共有しておくのはとてもいいソリューションだと思いますが、諸々の事情でコミットできない場合もあると思います。そういう場合には、そのマシン全体でgitignoreできる .gitignore_globalを使うのもひとつの手です。

$ cd ~
$ vi .gitignore_global

ただし、その後、他のプロジェクトで .node-versionを使うとなった際にgitに入ってこなくなるので注意が必要です。

おかしい時のチェック

とりあえずバージョンは逐一確認してみる

node -v

インストールされている場所も確認しておく

which node

例えば、↓こういうのが表示されるのはMacのデフォルトのnodeを使っている状態なので、 nodebrewにしろ nodenvにしろが動作している前提だとしたら、間違っている可能性が高いです。

/usr/local/bin/node

こういう場合、nodenvなどのセットアップが適切にできればそちらが使われますし、最悪この元の場所にインストールすることもできますから、消しちゃって大丈夫です。

コマンドがみつからない系

* : command no found

とりあえず、下記でターミナルを再読み込みしてみたり、なんなら再起動してみましょう。割とそれで解決することが多いはず。

exec $SHELL -l

それでもダメな場合は所謂「パスが通っていない」可能性もあるので、インストール時に表示されていた内容を見直してみたり、再インストールする必要があるかもしれません。
install complete的なメッセージが出ていても、もうひと手順あることが意外とあります。

まとめ

やはり先にnodeを全部消すのがよいです。変に保険をかけずnode -vでなにも出なくなるようにするのを優先した方が早かったと思います。(もしかするとnpm -vも。)


Viewing all articles
Browse latest Browse all 8926

Trending Articles