如何在本地测试 monorepo?

How to test a monorepo locally?

我有一个大项目,是一个由多个脚本和库组成的monorepo,它的结构如下:

package.json // "private":true
 \packages
    \comp1
       \package.json // an actual component
    \comp2
       \package.json // an actual component
    \comp3
       \package.json // an actual component

我用 yarn pack 做了一个 monorepo.tgz

然后我制作了一个测试应用程序,其 package.json 看起来像这样:

 "scripts": {
    // this is a script in one of the monorepo's components
    "start": "ui-build --bundle --watch -p 3000"
  }
  "dependencies": {
    "comp1": "../monorepo/monorepo.tgz",
    "comp2": "../monorepo/monorepo.tgz",
    "comp3": "../monorepo/monorepo.tgz",
  ...

但它不起作用,当我 运行 start 它抱怨 ui-build: command not found 时。 我如何在本地测试此 monorepo 以尽可能接近地模拟已发布的 npm 包?

经过一些研究,我发现 https://verdaccio.org/ 是无需部署到 npm 存储库即可测试库的最佳工具

使用 npm link(或 yarn link),您可以 'install' 来自本地开发环境的包。

为此,您首先 运行 npm link 在您要安装的包的目录中,所以在 \packages\comp1 中。然后在你的测试应用程序中,运行 npm link comp1。这将安装您的包。对您要安装的任何其他产品重复上述步骤。

更多信息: https://docs.npmjs.com/cli/v6/commands/npm-link https://classic.yarnpkg.com/en/docs/cli/link/

要直接导入文件而不使用 npm linkyarn link,您必须在路径前添加 file:。而且我相信您必须打包每个文件,但您可以直接 link 到路径而不打包它。如果您 link 直接访问本地包文件夹,请务必构建它。

以你的例子为例:

"comp1": "file:../monorepo/comp1.tgz",
"comp2": "file:../monorepo/comp2.tgz",
"comp3": "file:../monorepo/comp3.tgz",

"comp1": "file:../path/to/monorepo/packages/comp1",
"comp2": "file:../path/to/monorepo/packages/comp2",
"comp3": "file:../path/to/monorepo/packages/comp3",