【发布时间】:2018-04-21 07:00:36
【问题描述】:
我维护了一个发布在 npm 注册表上的 JavaScript 库,它有很多依赖项。很难跟踪代码的哪些部分取决于哪些外部包。
不幸的是,lerna、yarn 的工作区、npm link 或 npm 的本地路径依赖关系声明都没有帮助。 (我在例子之后解释了原因。)
我希望能够通过将一些依赖项提取到新的“子包”中来分解package.json 中声明的dependencies 列表。
所以,不要有下面的依赖列表
// ~/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",
...
有人做到了吗?会超级方便的。
请注意,lerna 和 yarn 的工作区功能仅在您可以将本地包发布到 npm 注册表时才有帮助。但在我的情况下,将本地包 example-lib-subpackage 发布到 npm 注册表没有意义。
另外,npm link 和 npm 的本地路径依赖功能仅适用于未发布但 example-lib 需要在 npm 注册表中的包。
将包发布到公共注册表时,不应使用本地路径 [...]。
【问题讨论】:
-
你为什么不用
devDependencies?这看起来基本上就像您正在尝试做的事情。 -
@PatrickRoberts 因为这些不是 devDependencies,它们应该在用户安装软件包时安装。
-
如果这些是构建代码 dst 所需的包,那么它们是
devDependencies。否则,您尝试执行的操作(如npm故意阻止的那样)将被视为反模式。 -
@PatrickRoberts 好的,我知道你来自哪里。
dependencies列出了诸如 babel 和 webpack 之类的构建库,因为buidnserve本身就是一个构建库。因此buildnserve用户会将buildnserve添加到devDependencies。这就是我们想要的;在开发代码时,由库的用户决定该库是“真正的”依赖项还是仅仅是一个依赖项。 -
啊,谢谢你提到这一点。这可能应该在您的问题中提到,因为这与您应该如何处理您的依赖组织有关。也许您可以发布一个 github 存储库并将您的构建代码链接到该存储库,而无需在 npm 上独立发布它?据我所知,除了通过以某种方式公开您想要细分的代码之外,没有真正的方法可以绕过本地链接。
标签: javascript node.js npm yarnpkg lerna