发布npm包时排除开发依赖项

9

我正在将一个包发布到npm上,这个包基本上只是一个简单的模块,可以让用户进行Ajax调用,并可以通过几种方式配置。

我已经了解到,在本地测试安装是一个好主意,所以我试过了。我通过“npm pack”命令打包了该软件包,进入另一个目录,然后尝试通过“npm install path-to-file-that-was-just-created.tgz”安装软件包。 到目前为止一切都正常,我有一个node_modules文件夹,其中包含了我捆绑的代码。

然而,它还安装了我在实际模块的package.json中列出的所有devDependencies,即使只需要捆绑文件而没有定义其他依赖项。 我尝试更新npm-shrinkwrap.json,并检查每个依赖项是否将dev属性标记为true。

实际目标是让用户安装此模块,然后不需要安装任何依赖项,因为他们不需要babel或mocha来运行该模块。 如何将它们从包中排除? 谢谢!


我不熟悉 npm pack,但是如果您正常发布模块,当他们运行 npm install your-module-name 时,默认情况下不会安装 devDependencies,除非他们明确地进入 node_modules 并运行 npm install - Patrick Roberts
这可能是我本地安装并测试时发生的事情。我需要检查一下,谢谢! - user7729378
3个回答

13

https://docs.npmjs.com/cli/install

使用 --production 标志来避免安装开发依赖项

对于已发布的模块,您不需要做任何事情,当用户安装您的库时,只会安装非开发依赖项


3
我刚刚尝试了一下,但是它似乎奇怪地不起作用。它仍然安装了我所有的开发依赖项。我已经检查了package.json和npm-shrinkwrap.json文件,所有的依赖项都被标记为dev: true或列在devDependencies下面,但它们仍然被安装了。通过将shrinkwrap文件添加到npmignore中,我成功将它们排除在外,但我仍然认为它应该能够正常工作。 - user7729378
@marcus_deh,“dev包”也可能是您需要的其他软件包的依赖项。 - Derek Pollard
1
但是,当我只是分发捆绑的JS文件时,实际上不应该有任何额外的依赖关系,对吗?因为这就是我尝试做的事情。否则,我确定在设置惩罚包的方式上出了一些问题。 - user7729378
1
适用于node.js 6。 - JRichardsz

4
如果您想使您发布的模块没有依赖,但是在构建它时仍然需要一些依赖项,您可以在发布之前尝试使用此命令:
npx json -f package.json -I -e "delete this.devDependencies"

这种方法仅适用于CI/CD。

更新:事实证明,npm pkg delete devDependencies 可以在不需要任何其他依赖的情况下完成相同的操作。


这是正确的答案!我将这个功能(以及更多)提取到一个名为“lean-package”的包中。 https://www.npmjs.com/package/lean-package - sstur

2
在运行安装程序之后,您可以通过运行以下命令来修剪开发依赖项: npm prune --production 这将只保留生产依赖项。来自npm文档的说明:
如果指定了--production标志或将NODE_ENV环境变量设置为production,则此命令将删除devDependencies中指定的软件包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接