是否可以通过创建新的(未发布的)"子"包来分解(已发布)包的依赖列表?

bri*_*out 10 javascript node.js npm lerna yarnpkg

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

不幸的是lerna,yarn工作空间,npm link或者npm本地路径依赖声明都没有帮助.(我解释了为什么在这个例子之后.)

我希望能够通过将一些依赖项提取到新的"子包"中来分解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": "*"
  }
}
Run Code Online (Sandbox Code Playgroud)

我想将一些依赖项提取到一个新的本地包中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": "*"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

// ~/code/example-lib/package.json
{
  "name": "example-lib",
  "dependencies": {
    "chalk": "*",
    "example-lib-subpackage": "./packages/example-lib-subpackage",
    "mz": "*",
    "socket.io": "*"
  }
}
Run Code Online (Sandbox Code Playgroud)

注意example-lib现在如何取决于本地包example-lib-subpackage;

  ...
  "name": "example-lib",
  "dependencies": {
  ...
    "example-lib-subpackage": "./packages/example-lib-subpackage",
  ...
Run Code Online (Sandbox Code Playgroud)

有没有人实现过这个?这将是非常方便的.

请注意,lernayarn,如果您没有问题发布本地套餐到NPM注册表的工作区功能只能帮助.但在我的情况下,将本地包发布example-lib-subpackage到npm注册表是没有意义的.

此外,npm link并且npm本地路径依赖性功能仅适用于未发布但example-lib需要在npm注册表上的包.

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

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

And*_*aro 5

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

prepublish:

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

PouchDb遵循一种模糊的类似方法,在这里这里详细描述.


Sam*_* H. 3

我在想你可以使用构建工具来维护多个package.jsons 并将它们编译为真实的 - 但你会一直与平台作斗争。你必须有自己的 CLI 来安装,这会很混乱。

你说:

请注意,仅当您可以将本地包发布到 npm 注册表时,lerna和的工作区功能才会有帮助。yarn但就我而言,将本地包发布example-lib-subpackage到 npm 注册表是没有意义的。

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