10

我维护了一个发布在 npm 注册表上的 JavaScript 库,它有很多依赖项。很难跟踪代码的哪一部分取决于外部包。

不幸的是lerna, 、yarn的工作区、npm linknpm的本地路径依赖声明都没有帮助。(我在示例之后解释了原因。)

我希望能够通过将一些依赖项提取到新的“子包”中来分解dependencies声明的列表。package.json

因此,而不是具有以下依赖项列表

// ~/code/example-lib/package.json
{
  "name": "example-lib",
  "dependencies": {
    "lodash": "*",
    "request": "*",
    "chalk": "*",
    "bluebird": "*",
    "mz": "*",
    "moment": "*",
    "socket.io": "*",
    "socket.io-client": "*",
    "react": "*",
    "react-dom": "*"
  }
}

我想将一些依赖项提取到一个新的本地包example-lib-subpackage中。对于本地,我的意思是example-lib-subpackage它只能被example-lib.

example-lib-subpackage的依赖列表是;

// ~/code/example-lib/packages/example-lib-subpackage/package.json
{
  "name": "example-lib-subpackage",
  "dependencies": {
    "lodash": "*",
    "request": "*",
    "bluebird": "*",
    "moment": "*",
    "socket.io-client": "*",
    "react": "*",
    "react-dom": "*"
  }
}

example-lib的依赖列表将大大减少到;

// ~/code/example-lib/package.json
{
  "name": "example-lib",
  "dependencies": {
    "chalk": "*",
    "example-lib-subpackage": "./packages/example-lib-subpackage",
    "mz": "*",
    "socket.io": "*"
  }
}

注意example-lib现在如何依赖于本地包example-lib-subpackage

  ...
  "name": "example-lib",
  "dependencies": {
  ...
    "example-lib-subpackage": "./packages/example-lib-subpackage",
  ...

有没有人做到这一点?这将是超级方便。

请注意,lernaandyarn的工作区功能仅在您可以将本地包发布到 npm 注册表时才有帮助。但在我的情况下,将本地包发布example-lib-subpackage到 npm 注册表没有意义。

此外,npm linkandnpm的本地路径依赖功能仅适用于未发布但example-lib需要位于 npm 注册表上的包。

将包发布到公共注册表时,不应使用本地路径 [...]。

引用自https://docs.npmjs.com/files/package.json#local-paths

4

2 回答 2

5

由于package.json它只是一个 JS 对象,您可以在发布到 NPM 之前对其进行扩展。

prepublish

  • 更新包版本
  • 删除 package.json 本地example-lib-subpackage依赖
  • 使用声明的依赖项扩展example-lib依赖项 example-lib-subpackage
  • 可选择在更新后运行一些测试package.json
  • 发布
  • 还原原始依赖对象
  • 提交新版本

PouchDb遵循一种类似的方法,在此处此处进行了更详细的描述。

于 2017-11-26T22:29:16.150 回答
3

我在想你可以使用构建工具来维护多个package.jsons 并将它们编译成真正的 s - 但你会一直与平台作斗争。您必须拥有自己的 CLI 才能安装,这将是一团糟。

你说:

请注意,lernaandyarn的工作区功能仅在您可以将本地包发布到 npm 注册表时才有帮助。但在我的情况下,将本地包发布example-lib-subpackage到 npm 注册表没有意义。

我不认为你会找到一个完全有意义的解决方案(如果你正在尝试用 npm 做完全非标准的事情),我很好奇你为什么要排除突破example-lib-subpackage自己的可能性回购 - 这似乎是显而易见的解决方案。

于 2017-11-26T00:40:13.820 回答