如何使用Yarn工作区将共享依赖项添加到Monorepo?

11
我正在使用Yarn的工作区功能来管理一个单体库。一些独立工作区在它们自己的package.json 中定义了它们自己的依赖,但是我也有一些共享依赖项(一些用于测试整个库,一些被所有工作区使用)。我该如何正确地声明这些依赖项?
如果我尝试将它们添加到根package.json中,Yarn会给出警告。但是,将相同的依赖项添加到所有n个工作区(有很多并且可能会增长)似乎很繁琐而且难以维护当升级依赖时。
那么,正确的做法是将共享依赖项(例如typescriptjestserverless)添加到每个单独的工作区中吗?
使用Yarn 1/经典版。
我还发现了Yarn Workspaces: How and where should I install my dependencies?,但它没有答案。 Yarn workspaces shared dependencies谈论使用对等依赖项,但用户遇到了麻烦。
1个回答

12

在经过半天的搜索和尝试后,我找到了多种管理共享依赖项的方法。

1. 使用 syncpack 同步依赖版本

https://github.com/JamieMason/syncpack/

由于 yarn workspaces 将共享依赖项,如果它们的版本相同(参见 https://classic.yarnpkg.com/lang/en/docs/workspaces/),我们只需保持依赖项版本同步即可实现依赖项共享,这正是 syncpack 所做的。

我发现这是让共享依赖项起作用的最小有害方式,而其他方法需要在一定程度上扭曲 package.json。

2. 使用 peer 依赖项

对于每个包,将共享依赖项设置为带有版本“*”的 peerDependencies,并将根工作区设置为实际依赖项。例如:

# ./package.json
{   
    ...
    "workspaces": ["packages/*"],
    "dependencies": [
        "some-lib": "^1.0.0",
    ]
}

# ./packages/pkg-a/package.json
{
    ...
    "peerDependencies": [
        "some-lib": "*",
    ]
}

在工作区根目录下运行yarn install

3. 共享脚本(需要yarn v2)

参见https://yarnpkg.com/getting-started/qa#how-to-share-scripts-between-workspaces

杂项

yarn提供workspace cli用于添加/删除包,请参见https://classic.yarnpkg.com/lang/en/docs/cli/workspace/

yarn workspace awesome-package add react react-dom --dev

yarn workspace web-project remove some-package

你能详细说明一下第二种方法吗?我在 https://dev59.com/ncD5oIgBc1ULPQZFQ6jC 遇到了类似的问题。 - D.B.K
嗨,有人尝试过方法2吗?我遇到了类似的问题,将共享依赖项在"peerDependencies"中提及并没有起作用。 - Nirmit Agarwal
感谢您的指出。对于我的情况来说,方法2是可行的,但并不能保证作为一种通用解决方案。我建议采用"方法1"。Yarn 1并不适用于单一代码库。 - WcW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接