🏗️

yarn installでExtracting tar content of undefined failed

2022/08/02に公開

状況

ローカルは何の問題もありません。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.ymlyarn installの後にオプションを書き足してやればOKです。

expo build

expoのbuildは最近推奨のeas buildを使っています。

https://docs.expo.dev/build-reference/how-tos/

eas buildはpackage.jsonのscriptsにコマンドを書いてやると実行するフックがあります。

"scripts": {
    "start": "expo start",
    "eas-build-pre-install": "yarn install --network-concurrency 1"
}

pre-installでnetwork-concurrency 1でインストールしてやれば通るようです。

解説

ポイントは何かのサービス越しでのみエラーが起きている、という状況ですね。この時はこの問題の可能性が高いです。

厄介だったのは、ローカルでは別の原因でこのエラーが発生するようです。エラー文で検索すると下記のISSUEが引っ掛かります。ローカルでこのエラーが起きる場合はこの辺が原因の可能性ありです。

https://github.com/yarnpkg/yarn/issues/7212#issuecomment-493720324
https://github.com/yarnpkg/yarn/issues/7212#issuecomment-973278885

  • package.jsonのscriptsにあるprepareを削除する。
  • yarn.lockを削除してやり直す

最終的に下記のサイトが決めてになりました。ありがたや。
https://stackoverflow.com/questions/70401380/heroku-build-error-extracting-tar-content-of-undefined-failed

ここではHeroku buildで起きてるようですね。やっぱり外部サービス内でyarn installをした時に発生してます。サービスの方で、ネットワークリソースを食い潰さないようにアクセスを制限してるのかもしれないですね。だとしたら、エラーをもっとわかりやすくしてほしいものです。

もう一つ厄介だったのは、このエラーが特定のパッケージを追加した以降で始めたことですね。具体的にはeslintを導入してからこのエラーば起きるようになりました。eslint(eslintのtypescriptのパーサーかも)外せばエラーがなくなるんですよね。その辺のパッケージで多重ダウンロードをするように設定されてるとか、依存関係が多いと勝手に多重ダウンロードするとかですかね?今一はっきりしませんが。

どちらにしても不親切な状況なのは間違い無いかも。

最後に

実は、もう1ヶ月くらい前からCircleCIがコケていて、軽く足掻いてみたけど解決せず一旦保留にしていたところeas buildも同じエラーが出たので死ぬ気で探しました😀

一時期はeslintの導入を諦めようか(外せば通るので)と思いましたが見つかってよかったです。

ただ、eas buildですがiosは通って実機で確認できたのですが、andoirdがその先のGradle buildで別のエラーでコケています。もしかしたらここで解説したやり方に問題があるのかもしれませんが、もしそうなら、記事編集します。

↑これは全く別の要因でした。この件は関係なかったのでこの方法で問題なさそうです。

Discussion