跳转到内容

在 Pier 中使用 yarn 2 / 3 / 4

Yarn berry(yarn 2、3 和 4)在 2019 年用 .yarnrc.yml 取代了 .npmrc。仓库配置迁移到了这里,并且有一个与 yarn 1 的 always-auth=true 等效的特殊之处:

npmAlwaysAuth: true 是必需的。 没有它,yarn 4 只会在 npm publish 时发送 bearer——而 npm install 时不发送。根本原因与 yarn 1 相同,只是配置文件不同。

在项目根目录创建 .yarnrc.yml

npmRegistryServer: "https://YOUR-PIER-HOST/registry/npm/"
npmAuthToken: "pier_npm_…"
npmAlwaysAuth: true
nodeLinker: node-modules

nodeLinker: node-modules 会退出 yarn berry 默认的 plug’n’play,回退到熟悉的 node_modules 布局——除非你的工具链明确支持 PnP,否则推荐使用此选项。

package.json 需要固定 packageManager,以便 corepack 选取正确的二进制文件:

{
"name": "my-app",
"version": "0.1.0",
"packageManager": "[email protected]"
}
Terminal window
corepack enable
yarn install
yarn add left-pad
yarn add @your-org/internal-lib

Corepack 会从 package.json 读取 packageManager,并运行指定的确切 yarn 版本,首次使用时会自动下载。

Terminal window
yarn npm publish --access public # 作用域内的公共包
yarn npm publish # 私有包

注意 npm 命名空间:berry 的 CLI 子命令位于 yarn npm <subcommand> 之下(publish、login、whoami、info、tag),以便与 yarn 自身的命令区分开来。

Terminal window
yarn npm login --scope=@your-org
# 提示输入用户名 + 密码 + 邮箱 + OTP

或者跳过交互式登录,直接在 .yarnrc.yml 中填写 npmAuthToken——效果相同。令牌来自 Pier 面板中的 Packages → Manage tokens

Terminal window
yarn npm tag add @your-org/[email protected] beta
yarn npm tag list @your-org/lib
yarn npm tag remove @your-org/lib beta
yarn berry状态说明
2.4.3已在 pier-tests 矩阵中测试
3.8.7已在 pier-tests 矩阵中测试
4.5.1已在 pier-tests 矩阵中测试

这三个 berry 主版本共享相同的 .yarnrc.yml 结构——通过 package.json 中的 packageManager 固定你想要的版本,剩下的交给 corepack 处理。

  • YN0041: Invalid authentication (as an anonymous user)——缺少 npmAlwaysAuth: true
  • YN0027: <pkg> can't be resolved to a satisfying range——仓库无法访问(URL 拼写错误),或上游代理已关闭且该包不是私有的。
  • Corepack is about to download …——首次使用固定版本运行时会下载二进制文件。可以放心确认;或者预先设置 COREPACK_ENABLE_AUTO_PIN=0 corepack prepare [email protected] --activate

如果你希望某个作用域走 Pier,而其他所有内容走 npmjs.org,且不想在 Pier 上启用上游代理,可以为该作用域单独指定仓库:

npmScopes:
your-org:
npmRegistryServer: "https://YOUR-PIER-HOST/registry/npm/"
npmAuthToken: "pier_npm_…"
npmAlwaysAuth: true

大多数团队只是启用代理,让所有内容都通过 Pier 路由——但这种方式也可行。