yarn installでExtracting tar content of undefined failed
状況
ローカルは何の問題もありません。CircleCIとexpoのビルドで下記のエラーが出て実行できません。
yarn install v1.22.19
[1/4] Resolving packages...
[2/4] Fetching packages...
[1/4] Resolving packages...
[2/4] Fetching packages...
error https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz: Extracting tar content of undefined failed, the file appears to be corrupt: "EEXIST: file already exists, mkdir '/home/circleci/.cache/yarn/v6/npm-jsdom-16.7.0-918ae71965424b197c819f8183a754e18977b710-integrity/node_modules/jsdom/lib/jsdom/living'"
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
info There appears to be trouble with your network connection. Retrying...
Exited with code exit status 1
CircleCI received exit code 1
参考に貼ったのはjsdomですが、ここがjsdomとは限りません。ここはたまに変わります。URLを叩くとダウンロードも解凍もできるので、このファイルは問題ではありません。
解決方法
yarn installの時に--network-concurrency 1
を渡してやれば解決します。
yarn install --network-concurrency 1
CircleCI
これは特に問題ないですね。.circleci/config.yml
のyarn install
の後にオプションを書き足してやればOKです。
expo build
expoのbuildは最近推奨のeas build
を使っています。
eas build
はpackage.jsonのscriptsにコマンドを書いてやると実行するフックがあります。
"scripts": {
"start": "expo start",
"eas-build-pre-install": "yarn install --network-concurrency 1"
}
pre-installでnetwork-concurrency 1
でインストールしてやれば通るようです。
解説
ポイントは何かのサービス越しでのみエラーが起きている、という状況ですね。この時はこの問題の可能性が高いです。
厄介だったのは、ローカルでは別の原因でこのエラーが発生するようです。エラー文で検索すると下記のISSUEが引っ掛かります。ローカルでこのエラーが起きる場合はこの辺が原因の可能性ありです。
- package.jsonの
scripts
にあるprepare
を削除する。 - yarn.lockを削除してやり直す
最終的に下記のサイトが決めてになりました。ありがたや。
ここではHeroku build
で起きてるようですね。やっぱり外部サービス内でyarn installをした時に発生してます。サービスの方で、ネットワークリソースを食い潰さないようにアクセスを制限してるのかもしれないですね。だとしたら、エラーをもっとわかりやすくしてほしいものです。
もう一つ厄介だったのは、このエラーが特定のパッケージを追加した以降で始めたことですね。具体的にはeslint
を導入してからこのエラーば起きるようになりました。eslint
(eslintのtypescriptのパーサーかも)外せばエラーがなくなるんですよね。その辺のパッケージで多重ダウンロードをするように設定されてるとか、依存関係が多いと勝手に多重ダウンロードするとかですかね?今一はっきりしませんが。
どちらにしても不親切な状況なのは間違い無いかも。
最後に
実は、もう1ヶ月くらい前からCircleCIがコケていて、軽く足掻いてみたけど解決せず一旦保留にしていたところeas build
も同じエラーが出たので死ぬ気で探しました😀
一時期はeslintの導入を諦めようか(外せば通るので)と思いましたが見つかってよかったです。
ただ、eas build
ですがiosは通って実機で確認できたのですが、andoirdがその先のGradle build
で別のエラーでコケています。もしかしたらここで解説したやり方に問題があるのかもしれませんが、もしそうなら、記事編集します。
↑これは全く別の要因でした。この件は関係なかったのでこの方法で問題なさそうです。
Discussion