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

时间:2017-11-08 14:29:09

标签: javascript node.js npm yarnpkg lerna

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

不幸的是lernayarn的工作空间,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",
  ...

有没有人实现这个目标?这将非常方便。

请注意,lernayarn的工作区仅在您将本地软件包发布到npm注册表时才有用。但在我的情况下,将本地包example-lib-subpackage发布到npm注册表是没有意义的。

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

  

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

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

2 个答案:

答案 0 :(得分:5)

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

prepublish

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

PouchDb采用了一种模糊的类似方法,详细介绍了herehere

答案 1 :(得分:3)

我当时认为你可以使用构建工具来维护多个package.json并将它们编译成真实的 - 但你要在整个过程中与平台作战。您必须拥有自己的CLI进行安装,这将是一团糟。

你说:

  

请注意,lernayarn的工作区仅在您确定无效的情况下才有帮助   将本地包发布到npm注册表。但就我而言   将本地包example-lib-subpackage发布到npm注册表   没有意义。

我不认为你会找到一个非常有意义的解决方案(如果你正在尝试用npm做完全非标准的事情的路线),我很好奇为什么你是排除将example-lib-subpackage分解为自己的回购 - 这似乎是一个明显的解决方案。