Node.jsのアップデートをするとnpmのグローバルモジュールが消える
タイトルのことで困っていた。
僕はNode.jsのパッケージマネージャにnodebrewを使っているのだけど、先日使おうと思ったノードモジュールが動かなかったのでNodeのバージョンかもしれないと思ってv8.4.0からv9.5.0に変えた。それでその時に気付いたけどタイトル通りv9.5.0にするとnpmの-g
で入れていたモジュールがシェルから使えない、ということに気付いた。nodebrew use v8.4.0
してv8.4.0に切り替えるとまた使えるようになる。
そういうものっぽい
これは世界ではデファクトスタンダードっぽいパッケージマネージャnvmのissueだけど、ここを見ていたらどうやらそういうものらしい。異なるnpmとnodeでは互換性が担保されないので単一のグローバルモジュールを異なるnode間で共有するのはムリが生じるからやりたくないということらしい。
自分はてっきりnpmの-g
インストールはnodeと分離されて共通なものなのだという認識でいたからこれを問題だと考えてしまっていただけだった。
移行コマンドがある
nodebrewの場合は公式リポジトリのdocsのAll commandsのなかに密かに1行だけ書かれていて、上のnmvのissue読まなかったら経緯がわからないのでなんのコマンドなのかさっぱりわからないと思う。
$ nodebrew migrate-package <version>
<version>
のとこは移行元のバージョン番号を入れる(v8.4.0
という形式で)
ちなみにnvmにも同様のコマンドは上のissueでもあるように用意されている。
$ nvm install node --reinstall-packages-from=node
シンボリックリンク??
それで、nodebrewで$ nodebrew migrate-package <version>
したところ、なんとv8.4.0のグローバルモジュールにシンボリックリンクを貼っているっぽい。
/Users/username/.nodebrew/node/v8.4.0/lib/node_modules #にあるグローバルモジュールへ /Users/username/.nodebrew/node/v9.5.0/lib/node_modules #にシンボリックリンク設置している
まあ当たり前に問題なく動いているのだけど、これだと以前のnodeのバージョンを消せないではないか!ということになっていてうーむ、と思っている。無限に増え続けるnode.jsは嫌なので困った。今のところはまあいいのだけど……。
nvmの--reinstall-packages
でどういう処理になるのかはわからない。nvmは使っていないので。
Travis CIでデプロイ処理でprovider: scriptするとき、複数の処理がうまくいかない
デプロイ処理でprovider: script
しているときに複数のスクリプト処理をしたいがコケる
deploy: provider: script skip_cleanup: true script: - yarn run build - yarn run test - yarn run deploy on: branch: master tags: true
なぜ?
Issue情報
なるほど
deploy: provider: script skip_cleanup: true script: yarn run build && yarn run test && yarn run deploy # アンパサンドで書く on: branch: master tags: true
アンパサンド連結でこう書く。
script: - foo - bar - baz
なぜ他の欄のscript:
の書き方では通るこの書き方で通らないのか!!となるけど、まあprovider: script
がまだ現時点(2018-02-11)も実験的な機能実装扱いだからそういうものなんやで〜、ということになる。
いつか改善されて欲しい!