你如何阻止为Node.js(package.json)安装"devDependencies"NPM模块?

Lan*_*ard 548 node.js npm

我在我的package.json文件(缩短版本)中有这个:

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

当我从项目根目录运行以下命令时,它会安装dependencies devDependencies:

npm install
Run Code Online (Sandbox Code Playgroud)

我的印象是这个命令安装了devDependencies:

npm install --dev
Run Code Online (Sandbox Code Playgroud)

我如何才能使它npm install只安装dependencies(所以生产环境只获得那些模块),而像npm install --dev安装两者dependenciesdevDependencies

Roh*_*ngh 779

npm install命令将安装devDependencies沿着其他dependencies包的目录中运行时,在开发环境中(默认值).

使用npm install --only=prod(或--only=production) 安装dependencies,而devDependencies,不管NODE_ENV环境变量的值如何.

资料来源:npm docs

注意:在npm(2015-08-13)的v3.3.0之前,调用了该选项--production,即npm install --production.

  • 哦,我的上帝.我完全从我正在做的其他事情中得到了'NODE_ENV = production`,并且无法理解为什么`npm install`不会安装依赖项.谢谢你彻底的答复. (13认同)
  • 对于npm 3.3及以后版本:npm WARN install不推荐使用`--dev`选项.请改用"--only = dev". (10认同)
  • 根据当前的[文档](https://docs.npmjs.com/cli/install),它仍然只有`--product`:“使用`--product`标志(或者当设置了NODE_ENV环境变量时)到生产),npm 将不会安装 devDependency 中列出的模块。” (5认同)
  • https://www.npmjs.org/doc/cli/npm-install.html"默认情况下,npm install将安装列为依赖项的所有模块.使用--production标志,npm将不会安装devDependencies中列出的模块." (4认同)
  • Agate 的理由可能是删除 devDependencies,这样消费者用 `npm install yourpackage.tgz` 安装你的包就不会得到 devDependencies。然而,情况已经如此。请参阅下面的 Kevin Cox 的回答 (http://stackoverflow.com/a/15826602/825588)。 (3认同)
  • 从 npm 6.9.0 开始,https://docs.npmjs.com/cli/install 清楚地记录了 `--product` 和 `--only={prod[uction]|dev[elopment]}`。 (2认同)

小智 223

我也遇到了这个问题!npm install有些令人困惑,Web帖子继续引入-d/ - dev标志,好像有一个明确的'开发'安装模式.

  • npm install将安装" dependencies "和" devDependencies "

  • npm install --production只会安装" 依赖 "

  • npm install --dev只会安装" devDependencies "

  • 警告:如果`NODE_ENV`设置为`production`并运行`npm install`,则不会安装dev依赖项.我在Dockerfile中遇到了这个问题. (23认同)
  • @vaughan 我也遇到过这个问题,可以通过运行 `npm --production=false install` 来解决(虽然不确定这是否可以与 --dev 标志一起使用) (4认同)

Clo*_*ure 131

新选项是:

npm install --only=prod
Run Code Online (Sandbox Code Playgroud)

如果只想安装devDependencies:

npm install --only=dev
Run Code Online (Sandbox Code Playgroud)

  • 这是2015/2016的正确答案 (24认同)
  • 嘿.在@ user1614572添加关于`--only = prod`的部分之前,我留下了那条评论.先生,您是部分正确的.,P (3认同)
  • 你是部分正确@ musicin3d,这就是为什么在第一部分我回答了如何安装prod唯一的依赖关系,在第二部分我如何安装dev仅依赖关系,以防万一. (2认同)
  • 这是评论,而不是答案。我不会定期检查我所有的评论。我从未见过人们从多年前更新*评论*。你基本上是来这里批评我把我的评论加一年的。我不会再回复了。玩得开心拖着别人。 (2认同)

wzr*_*337 45

如果您在2016年阅读此POST,请通过使用实现您想要的

--only={prod[uction]|dev[elopment]} 
Run Code Online (Sandbox Code Playgroud)

无论NODE_ENV如何,参数都将导致仅安装devDependencies或仅安装非devDependencies.

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

  • 这些标记也可以与`npm ci`一起使用吗? (6认同)

pie*_*bot 31

如果您已经安装了所有依赖项,并且希望避免再次从NPM下载生产包,则只需键入:

npm prune --production
Run Code Online (Sandbox Code Playgroud)

这将从您的node_modules文件夹中删除您的dev依赖项,如果您尝试自动执行两步过程,这将非常有用

  1. Webpack我的项目,使用dev依赖项
  2. 仅使用生产模块构建Docker镜像

npm prune在两者之间运行将使您不必重新安装所有内容!

  • 在 2021 年,npm v7.11 你只需要 `npm install --only=product` 即使你安装了整个东西并且它达到了相同的结果 (2认同)

cre*_*uru 19

使用"npm install"时,无论模块是"devDependencies"还是"依赖项",模块都会在整个应用程序中加载并可用.这个想法的总和:package.json定义为依赖关系(任何类型)的所有内容都安装到node_modules.

依赖项/ devDependencies/optionalDependencies之间差异的目的是代码的使用者可以使用n/n来安装这些资源.

根据文档:https://npmjs.org/doc/json.html ...

如果有人计划在他们的程序中下载和使用您的模块,那么他们可能不希望或不需要下载和构建您使用的外部测试或文档框架.

在这种情况下,最好在devDependencies哈希中列出这些附加项.

只要设置了--dev配置标志,就会安装这些东西.在执行npm链接或从包的根目录执行npm install时,会自动设置此标志,并且可以像任何其他npm配置参数一样进行管理.有关该主题的更多信息,请参阅config(1).

但是,要解决此问题,如果您只想使用npm安装"依赖项",则以下命令为:

npm install --production
Run Code Online (Sandbox Code Playgroud)

这可以通过查看添加此过滤器的Git提交(以及下面列出的一些其他过滤器来提供此功能)来确认.

可以由npm使用的替代过滤器:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors
Run Code Online (Sandbox Code Playgroud)

@dmarr尝试使用npm install --production


Kev*_*Cox 16

从软件包内部安装时,npm将安装dev依赖项(如果package.json当前目录中有一个).如果它来自另一个位置(npm注册表,git repo,文件系统上的不同位置),它只安装依赖项.


mar*_*rix 10

我建议使用npm ci. 如果您只想安装生产所需的软件包(如您所写 - 没有devDependencies),则:

npm ci --only=production
Run Code Online (Sandbox Code Playgroud)

或者

NODE_ENV=production npm ci
Run Code Online (Sandbox Code Playgroud)

如果你更喜欢老学校,npm install那么:

npm install --production
Run Code Online (Sandbox Code Playgroud)

或者

NODE_ENV=production npm install
Run Code Online (Sandbox Code Playgroud)

这是为什么你应该使用npm ci.


Fra*_*ula 7

值得一提的是,您可以使用NODE_ENV环境变量来达到相同的结果。如果您正在容器化 Node 应用程序(例如 Docker),则特别有用。

NODE_ENV=production npm install
Run Code Online (Sandbox Code Playgroud)

上面的代码将安装除开发依赖项之外的所有依赖项(即devDependencies)。

如果您需要在您的环境变量中使用更多信息,可以在这里Dockerfile找到。

环境变量很容易在需要时被覆盖(例如,如果您想在 Travis CI 上运行测试套件)。如果是这种情况你可以这样做:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install
Run Code Online (Sandbox Code Playgroud)

NPM 文档在这里

生产

  • 默认值:假
  • 类型:布尔值 设置为 true 以在“生产”模式下运行。

    1. 当不带任何参数运行本地 npm install 时,devDependency 不会安装在最顶层。
    2. 为生命周期脚本设置 NODE_ENV="product"。

快乐的容器化=)


Мар*_*ров 6

npm install --production --no-optional

它只安装依赖于dependencies并且会忽略optionalDependenciesdevDependencies


eri*_*icP 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 容器的 package.json。当然,这不是必需的,但如果有必要(就像对我来说),那就有你的技巧了。