如何防止安装 Node.js(package.json)的“devDependencies” NPM 模块?

850

我在我的 package.json 文件中有以下内容(缩短版):

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

我在Mac 10.6.8上使用NPM版本1.1.1。

当我从项目根目录运行以下命令时,它会同时安装dependenciesdevDependencies

npm install

我原本认为这个命令会安装 devDependencies

npm install --dev

如何使npm install仅安装dependencies(因此生产环境只获取这些模块),而像npm install --dev这样的命令则同时安装dependenciesdevDependencies


1
根据文档,你是对的,--dev 安装 devdeps,否则只安装 deps。http://npmjs.org/doc/json.html。我至少知道这适用于命名的 packages。 - mna
2
如果您在2015年遇到了这个问题,--save-dev开关正好可以像本问题中所要求的那样解决问题。 - Anand
2
这个回答 https://dev59.com/VmMk5IYBdhLWcg3w5B3y#22004559 很好地解释了dependenciesdevDependencies之间的区别以及它们各自使用的情况。 - quasoft
16个回答

5
我在docker node:current-slim(运行npm 7.0.9)中遇到了问题,npm install似乎无视了--production--only=prod--only=production。我找到了两个解决方法:
  1. 使用ci代替 (RUN npm ci --only=production),需要一个最新的package-lock.json文件
  2. 在运行npm install之前,使用如下命令粗暴地编辑package.json:

RUN node -e 'const fs = require("fs"); const pkg = JSON.parse(fs.readFileSync("./package.json", "utf-8")); delete pkg.devDependencies; fs.writeFileSync("./package.json", JSON.stringify(pkg), "utf-8");'

这样不会修改你的工作目录下的package.json文件,只会修改复制到docker容器内的那个。 当然,这不应该是必需的,但如果像我一样有需要,这就是你的hack。


4

我发现,在尝试为包含node插件的软件包安装开发人员依赖项时,即使你只想安装devDependencies,也无法避免在运行npm install --dev时构建插件。因此,我必须绕过npm:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

或者,更好的方式(而且更加简洁)是:
node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install

4

需要添加到选定答案:目前,在包目录(包含package.json)中运行npm install将安装devDependencies,而npm install -g则不会安装它们。


10
是的,-g选项不会安装devDependencies,但它会将软件包全局安装,这通常不是预期的结果。 - Bardi Harborow

3

使用 npm install packageName --save 命令可以将包添加到 dependencies 中,如果想要添加到 npm install packageName --save-dev 命令中,则添加到 devDependencies

npm install packageName --save-dev 命令应该用于添加开发环境所需的包,比如 TDD 包(Chai、mocha 等)。这些包只用于开发而不是生产。


OP并没有遇到在package.json中保存依赖问题,但一旦这些依赖已经被保存,那么如何强制 npm 只安装一种特定类型的依赖。当我阅读你在这里的答案时,我并没有学到任何有助于解决OP提出的问题的东西。 - Louis

1

npm install --production 是安装生产环境所需的Node.js模块的正确方式。有关更多详细信息,请查阅文档。


-1
现在有一个问题,如果你使用npm 5+并且有package-lock.json文件,你必须在使用npm install --production之前将其删除。

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