我维护一个在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": "*"
}
}
我想将一些依赖项提取到一个新的本地包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注册表的软件包。
将包发布到公共注册表时,不应使用本地路径。
答案 0 :(得分:5)
由于package.json
只是一个JS对象,因此您可以在发布到NPM之前对其进行扩展。
在prepublish
:
example-lib-subpackage
依赖example-lib
依赖项与声明的依赖项
example-lib-subpackage
package.json
答案 1 :(得分:3)
我当时认为你可以使用构建工具来维护多个package.json
并将它们编译成真实的 - 但你要在整个过程中与平台作战。您必须拥有自己的CLI进行安装,这将是一团糟。
你说:
请注意,
lerna
和yarn
的工作区仅在您确定无效的情况下才有帮助 将本地包发布到npm注册表。但就我而言 将本地包example-lib-subpackage
发布到npm注册表 没有意义。
我不认为你会找到一个非常有意义的解决方案(如果你正在尝试用npm做完全非标准的事情的路线),我很好奇为什么你是排除将example-lib-subpackage
分解为自己的回购 - 这似乎是一个明显的解决方案。