かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

yarn v4 独自の GitHub package が 404 になってしまう問題にハマる

参加したプロジェクトが yarn の lock ファイルだったので久々に yarn install をしようとしたら GitHub package になっている独自ライブラリのインストールがエラーになってしまう問題にハマってしまったのメモ

状況

node.js npm のバージョン管理は Voltaを使用
Volta で node.js v18 系をインストールした際に付いてきた yarn (4.0.0-rc.50) をそのまま使用してる

プロジェクトに独自に作成された GitHub packages を使用
GitHub PAT (personal access tokens).npmrc に記述

.npmrc

@my-package:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${MY GITHUB PERSONAL ACCESS TOKEN}
always-auth=true
yarn install で独自パッケージが Package not found 404 になってしまう
$ yarn install
YN0000: · Yarn 4.0.0-rc.50
➤ YN0000: ┌ Resolution step
➤ YN0035: │ @my-package/some-package@npm:1.0.0: Package not found
➤ YN0035: │   Response Code: 404 (Not Found)
➤ YN0035: │   Request Method: GET
➤ YN0035: │   Request URL: https://registry.yarnpkg.com/@my_package%2fsome-package
➤ YN0000: └ Completed in 0s 854ms
➤ YN0000: · Failed with errors in 0s 857ms

@my_packagehttps://npm.pkg.github.com を見に行ってほしいが https://registry.yarnpkg.com から探そうとしているように見える

元のプロジェクトが yarn v1 系で v2 以降は設定の書き方が変更になっていたことが原因

yarn v2 以降では .npmrc.yarnrc ではなく .yarnrc.yml を使用する

Migrating from 1.x / npm

Breaking changes

Modern uses a different style of configuration files than Classic. While mostly invisible for the lockfile (because we convert them on the fly), it might cause issues if you rely on .npmrc or .yarnrc files.

  • Yarn Modern now uses .yarnrc.yml. Any other file is now ignored - this includes .npmrc.
  • As evidenced by the new file extension, the Yarnrc files are now to be written in YAML.
Migration steps
  1. Convert your .npmrc and .yarnrc files into .yarnrc.yml

cf. Step-by-step | Yarn

yarn v2 以降では .yarnrc.yml が使用され .npmrc があったとしても無視される。トノコト
使っていたのが yarn v4 だったので .npmrcGitHub packages や PAT の設定をしても無視されていたというのが原因だった

.yarnrc.ymlGitHub packages と PAT (personal access tokens) の設定する

.yarnrc.yml

nodeLinker: node-modules

npmScopes:
  'my-package':
    npmAlwaysAuth: true
    npmRegistryServer: 'https://npm.pkg.github.com/'
    npmPublishRegistry: 'https://npm.pkg.github.com/'
    npmAuthToken: ${MY GITHUB PERSONAL ACCESS TOKEN}

ポイントとしては @my-package/some-package を使っている場合 npmScopes@my-package ではなく @ 無しで my-package と記述すること
@ ありで @my-package とすると Package not found になってしまう

所感

npm で十分だと感じていたので久々に yarn を使ったら v2 以降で結構変わっていたみたいで、検索しても .yarnrc に設定を書く v1 系の方法ばかりがヒットしてハマってしまった。

個人的に yarn v1 系なら .npmrc で設定ができるが最新の npm の方がパフォーマンスが良いと思っているのでチーム開発ならバージョン差異が出やすい yarn より npm の方が良いんじゃないかなという気がしました。
チーム全員が Volta を使っているなら yarn, npm のバージョンも固定できるので新しく join した人が環境構築で躓くことも少なくなりそうだから良いんじゃないかなと思います。(ただ会社支給の PC なら良いけど、ツールの指定は結構宗教問題にもなりがちなので難しそうだし結局 npm にしておくほうが安牌なんじゃないかな〜)

I just had this problem for a couple of days and the solution is simple, DO NOT USE YARN when publishing.
cf. google cloud platform - How to fix 404 error when installing npm package from GCP artifact registry with yarn? - Stack Overflow

yarn 使わないのが解決策と書いてる Stackoverflow には笑ちゃった

我、環境設定のトラブル踏み抜きがち…
おわり


[参考]

※ 有料部分 最近読んでよかった本を書いているだけで特に何もありません。気になる方・投げ銭頂ける方はどうぞ!

この続きはcodocで購入