最近流行りのyarnをインストールしたらハマった話

技術ネタ
この記事は約7分で読めます。

こんばんわ、hisayukiです。
最近node界隈ではnpmの代わりにyarnが来ているとのこと。

こちらのQiitaとか見てもらうとメリットがまとまってるので参考までに

npmから乗り換えてわかったYarnの4つのメリット - Qiita
この記事は加筆・修正して「npmから乗り換えてわかったYarnの4つのメリット - ICS MEDIA」に引っ越しました。3万PV、280いいねとフロントエンド界隈でご好評いただいた内容です。ぜひ…

node界隈には疎いんですが、流行ってるしそんなにデメリットもなさそうなので突っ込みました(;´∀`)
特別使いやすくなった感はないですが、インストールは早くなったみたいです。
そんなに体感わからんですが・・・・www

そんなyarnを入れてハマった所を書いてきます。

スポンサーリンク

結論

nodeを複数バージョン使ってる場合に考慮しなければならないことです。

yarn以外でnodeは使ってないよーって方には無関係かもですが、結構少ないんじゃないかなと思います。
あと、今は使ってないけど今後使うときにおそらくハマります。

環境

OSはMacです。
nodeの管理はnodebrewで行っていて、nodebrewもyarnもhomebrewでインストールしました。

ほかの環境で起きるかはわかりませんが、今回はおそらくhomebrewでインストールしたから起きた問題です。

起きた現象

$ sh build.sh 

> @ gulp /Users/hisayuki/vscode/**********
> gulp "serve:dist"

fs.js:27
const { Math, Object, Reflect } = primordials;
                                  ^

ReferenceError: primordials is not defined
    at fs.js:27:35
    at req_ (/Users/hisayuki/vscode/**********/node_modules/natives/index.js:143:24)
    at Object.req [as require] (/Users/hisayuki/vscode/**********/node_modules/natives/index.js:55:10)
    at Object.<anonymous> (/Users/hisayuki/vscode/**********/node_modules/vinyl-fs/node_modules/graceful-fs/fs.js:1:37)
    at Module._compile (internal/modules/cjs/loader.js:759:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10)
    at Module.load (internal/modules/cjs/loader.js:628:32)
    at Function.Module._load (internal/modules/cjs/loader.js:555:12)
    at Module.require (internal/modules/cjs/loader.js:666:19)
    at require (internal/modules/cjs/helpers.js:16:16)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ gulp: `gulp "serve:dist"`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the @ gulp script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/hisayuki/.npm/_logs/2019-05-09T11_01_14_579Z-debug.log

gulpが動かなくなりました😅
まぁ。。。2年前に作ったHTMLのbuild環境なのでお察しを。。。

もともと動いてたので、他の人の環境で試したら動いた。
違いを見たら自分の環境はnodeがv12.1.0に上がってた・・・w

いつ入れたっけ・・・ってなりましたが、まぁnodebrewで管理してるので切り替えるだけ
なのでnodebrewで管理してるバージョンを確認してみた。

$nodebrew ls
v8.0.0
v8.1.0
v10.9.0
v11.14.0

current: v10.9.0

あれ、v12.1.0居ないやん・・・

しかも、currentはv10.9.0になってるし。
なんかおかしいと思いつつ、このあたりからハマり始める・・・

切り替わってないだけかもと思い、一旦v11.14.0に切り替える。

$ nodebrew use v11.14.0
use v11.14.0
$ node -v
v12.1.0

変わらねぇ・・・・

原因

どうやらv12.1.0nodebrewでインストールしたものではない事がわかる・・・
一旦環境をキレイにしようと思いnodeを削除することに。

$ brew uninstall node
Error: Refusing to uninstall /usr/local/Cellar/node/12.1.0
because it is required by yarn, which is currently installed.
You can override this and force removal with:
  brew uninstall --ignore-dependencies node

because it is required by yarn, which is currently installed.

お前かw

調べていった結果ここにたどり着いた

brew install yarn --without-node してもnodeがインストールされる。 - Qiita
## 追記(2019/2/19)@ys-0-sy さんからコメントいただきました。yarn公式のインストレーションガイドによると,node.jsをインストールした状態で$brew instal…

どうやらyarnをhomebrewでインストールのした際にnodeをインストールしてしまうみたい。
その際にnodeのPATHをyarnが使うnodeのPATHにしてしまうので、nodebrew側のnodeが使われなくなってしまう模様。

なのでnodebrewで管理しつつyarnを入れたい場合は、yarnのインストール時にnodeの依存関係を無視させないと行けない。

対策

まずはyarnのアンインストール

$ brew uninstall yarn

次にnodeのアンインストール

$ brew uninstall node

アンインストール後にPATHが変更されているので.bash_profileの再読み込み。

$ source ~/.bash_profile 

これをやらないとnodeのPATHは消えてても、nodebrewのPATHに見る先を変えてくれない。
この状態でnodeのバージョンを確認する。

$ node -v
v11.14.0

先程切り替えたv11.14.0に変わってます🌟

最後にyarnhomebrewで入れ直し。
この際にオプションに–ignore-dependenciesをつけることで、依存関係のあるPackageを無視してインストールできる。

$ brew install yarn --ignore-dependencies

これでyarnとnodebrewの共存が可能になった❗

$ yarn -v
1.15.2
$ which node
/Users/hisayuki/.nodebrew/current/bin/node

まとめ

yarnインストールの際には現状仕様しているnodeのバージョンに気をつけましょう❗
もし、古いnodeバージョンを利用する場合は依存関係を外してyarnをインストールしましょう❗

あとは今回の場合ならbuild環境だけdockerにするとかでもいいですねw

コメント

  1. すみません、2021年ですが、もしよろしければ教えてください。
    $ source ~/.bash_profile
    の部分ですが、zsh の環境ではどう書けば良いのでしょうか?
    私はほぼプログラム初心者でXcodeを使っているのですが、FirebaseのCloud Functionをいじっている時に
    Node.jsのバージョンの問題に突き当たりまして、hisayukiさんの書いておられるように、
    YarnとNode.js両方をremoveしたいと思っています。
    もしわかったら教えていただけると助かります。

  2. コメントありがとうございます!
    ちょっと前の話なので、全てにお答えできるかわからないですが・・・

    >zsh の環境ではどう書けば良いのでしょうか?

    sourceコマンドについては、zshでも同じようにsourceで行けると思います。
    profileをどうすればよいかということでしたら、~/.zshrcに書くことになると思います。

    > YarnとNode.js両方をremoveしたいと思っています。

    こちらについては環境がどのような状況なのかですが・・・
    OSはMacでnodeやYarnのインストールはHomebrewから行ったということであれば、
    ~/.zshrcに同じ現象が起こってるのではないかなと思います。
    なので、yarnのアンインストール、nodeのアンインストール後にyarnを–ignore-dependenciesでインストールすれば出来ると思います!

  3. hisayuki さん

    お忙しいところ、とても丁寧なご返信ありがとうございます。
    おっしゃる通り試したところ、zshでも同様にsourceでいけました。

    yarnは今は必要ないので、アンイストールしたままにしておきますが、
    必要になった時には、–ignore-dependenciesでインストールしたいとおもます。

    zshの情報が少なかったので、本当に助かりました。
    こんな初心者の質問に大切なお時間割いていただき、ありがとうございました!!