環境構築していたある日のこと、突然yarnコマンドが使用できなくなり、直すのにハマりました。。
$ yarn
yarn install v1.21.1
error An unexpected error occurred: "/Users/ユーザ名/package.json: Unexpected end of JSON input".
info If you think this is a bug, please open a bug report with the information provided in "/Users/miyuki_shoji/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
/Users/ユーザ名/package.jsonのファイルが指摘されているのですが、この実行環境は別のディレクトリでここのjsonファイルを指摘されるはずないので不思議。
Contents
package.jsonを削除すれば治った
結論からいうとこれでした。
世界のお友達がキャッシュをクリアするといいよーとか教えてくれたの参考にしたり、yarnを何度もアンインストールしたり、nodeのバージョン変えたり・・・。
それはもういろんなことしましたが解決せず。
参考にした文献たち
- yarn initでエラーが出た場合の対処方法
- Yarn install periodically fails with error “Unexpected end of JSON input”
- Installation Problem: .yarn-metadata.json: Unexpected end of JSON input #660
yarnの実行環境は/Users/ユーザ名/ディレクトリ/ディレクトリ/くらいの階層だったので、なんでここのjsonファイル?って思ってあまり目がいかなかったんですね。
それで指摘されていた問題のpackage.jsonを見てみると中身が空っぽで、同階層にあるpackage-lock.jsonはびっしり書いてある。
昔ハマって調べた記憶では確か、package.jsonから生成されるpackage-lock.jsonは内容が一致していないとインストールでエラーが出たはず・・・。
問題のpackage.jsonと同階層にあるpackage-lock.json、そしてnode_modulesディレクトリを削除してyarnを実行すると無事動きました!!
そういえば環境構築時にnode.jsを再インストールとかしていたので、それで壊れてしまったのかもしれない・・
とはいえなぜその階層のpackage.jsonが読みにいかれたのかは今でもなぞ。
試したこと
結論を先に述べましたが、いろいろ試行錯誤した内容も残しておきますw
誰かの参考になれば!
npmとyarnのキャッシュをクリアして再実行
npmやyarnのインストール時に失敗するときは実行履歴みたいなのがたまに悪さをしている可能性があるとのことなのでお掃除する。
$ yarn cache clean --force
npmでyarnをインストールしていたのでnpmも一応。
$ npm cache clean --force
nodeのバージョンを下げてyarnの再インストール
うまくいかないときはバージョンのせいもよくあるのでnodeのバージョンを下げてnpmからyarnの再インストールを。
ここで!私は以前node.jsを公式サイトからインストールする方法しか知らず、インストーラからnode.jsを入れていたのですが、nodenvというnodeのバージョン管理マネージャを教えてもらってこちらから操作しました。
phpでいうところのphpbrewみたいなやつですね。
nodenv自体はbrewでインストールしました。
$ brew -v
// Homebrew 2.2.1
$ brew install nodenv
$ export PATH="$HOME/.nodenv/bin:$PATH"
$ eval "$(nodenv init -)"
$ source ~/.bash_profile
$ nodenv -v
// nodenv 1.3.1
nodenvを使用してnodeのバージョンを下げてyarnのインストールをし直すも無念。
$ node -v
$ nodenv local 11.14.0
$ node- v
yarnをnpm経由ではなくbrew経由で入れてみる
brewでyarnを入れると直ったという記事があり(参考記事消えました><)、brew経由で入れ直しました。
$ npm uninstall -g yarn
$ yarn -v
// yarnのバージョンが表示されていたらキャッシュを消すために次のコマンドを実行
$ source ~/.bash_profile
$ brew install yarn
$ yarn -v
インストーラから入れた古いnode.jsを消していなかったので削除する
yarnのコマンドがbrew経由で実行されているかを確認してみると、どうも削除したはずのnpm経由っぽい。。
nodenvを導入したので以前インストーラから入れたnode.jsは不要。アンインストールする。
$ which node
/usr/local/bin/node
$ source ~/.bash_profile
rmコマンドで消してもいいけど、オプション忘れたのでかっこ悪いけど/usr/local/bin/nodeを直接ゴミ箱ぽーいで。笑
最後に
なんだか色々やったけど結局のところpackage.jsonが悪かったなんて、エラー文にヒントがあるってほんとそのとおりで反省・・・笑