ChatGPT解决这个技术问题 Extra ChatGPT

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

我的 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。

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

npm install

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

npm install --dev

如何使 npm install 只安装 dependencies(所以生产环境只获取那些模块),而像 npm install --dev 这样的东西同时安装 dependenciesdevDependencies

根据文档,您是对的, --dev 安装 devdeps,否则,仅安装 deps。 npmjs.org/doc/json.html。我知道这至少适用于命名包。
如果您在 2015 年遇到此问题,--save-dev 开关会完全按照此问题中的要求完成操作。
这个答案 stackoverflow.com/a/22004559/3718119 很好地解释了 dependenciesdevDependencies 之间的区别以及何时使用它们。

N
NoNameProvided

npm install 命令将在开发环境(默认)中的软件包目录内运行时将 devDependencies 与其他 dependencies 一起安装。

在 8.x 及更高版本中,使用 --omit=dev 标志仅安装常规依赖项:

npm install --omit=dev

这将安装 dependencies,而不是 devDependencies,无论 NODE_ENV 环境变量的值如何。

如果您使用 6.x 或更早版本,则需要改用 --only=prod 标志。

注意:
在npm(2015-08-13)的v3.3.0之前,该选项被称为--production,即

npm install --production

您可能还需要 --no-optional 标志。


Agate 的推理可能是删除 devDependencies,以便使用 npm install yourpackage.tgz 安装您的包的消费者不会同时获得 devDependencies。然而,情况已经如此。请参阅下面的 Kevin Cox 的回答 (stackoverflow.com/a/15826602/825588)。
npmjs.org/doc/cli/npm-install.html “默认情况下,npm install 将安装列为依赖项的所有模块。使用 --production 标志,npm 不会安装 devDependencies 中列出的模块。”
我的天啊。我完全从我正在做的其他事情中获得了 NODE_ENV=production,并且我一生都无法弄清楚为什么 npm install 不会安装依赖项。感谢您的详尽回答。
对于 npm 3.3 及更高版本: npm WARN install 不推荐使用 --dev 选项。请改用 --only=dev
根据当前的 documentation 它仍然只有 --production:“使用 --production 标志(或当 NODE_ENV 环境变量设置为生产时),npm 将不会安装 devDependencies 中列出的模块。”
L
Liam

我也遇到了这个问题! npm install 有点令人困惑,网络帖子不断引入 -d/--dev 标志,就好像有一个明确的“开发”安装模式。

npm install 将安装“依赖项”和“devDependencies”

npm install --production 只会安装“依赖项”

npm install --dev 只会安装“devDependencies”


警告:如果 NODE_ENV 设置为 production 并且您运行 npm install,它将不会安装开发依赖项。我在 Dockerfile 中遇到了这个问题。
@vaughan 我也遇到过这个问题,可以通过运行 npm --production=false install 来解决(虽然不确定这是否可以与 --dev 标志一起使用)
@vaughan 如果 echo $NODE_ENV 返回空怎么办?
为什么有人会使用 npm install --dev?意思是在什么情况下?例如,他们已经由 npm install --production 安装,现在决定做一些测试?
@JimRaynor 我有一个项目,其中生产依赖项全局安装,开发依赖项安装在本地。这是一个测试工具,所以根本不是一个常见的用例(也不是我设计它的方式),但它绝对是一个用例。我们运行--production 带有-g 标志,--dev 没有-g。
u
user1614572

新选项是:

npm install --only=prod

如果您只想安装 devDependencies:

npm install --only=dev

这回答了问题的反面。 OP 询问如何不安装 devDependencies。
你是部分正确的@musicin3d,这就是为什么在第一部分我回答了如何安装仅生产依赖项和第二部分如何安装仅开发依赖项,以防万一。
嘿。在@user1614572 添加关于 --only=prod 的部分之前,我留下了该评论。先生,您部分正确。 ;P
我们可以为部署包含单独的依赖项吗?
这是评论,不是答案。我不会定期检查我的所有评论。我从没见过人们去更新几年前的评论。你基本上来这里批评我对我的评论放了一年。我不会进一步回应。玩得开心拖钓别人。
p
piercebot

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

npm prune --production

这将从您的 node_modules 文件夹中删除您的开发依赖项,如果您尝试自动执行两步流程,例如

Webpack 我的项目,使用开发依赖项 仅使用生产模块构建 Docker 映像

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


在 2021 年,npm v7.11 你只需要 npm install --only=production 即使你安装了整个东西并且它达到了相同的结果
w
wzr1337

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

--only={prod[uction]|dev[elopment]} 

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

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


为什么要大写“POST”? docs.npmjs.com/cli/install 清楚地记录了 --production--only={prod[uction]|dev[elopment]}
c
creatovisguru

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

依赖项/devDependencies/optionalDependencies 之间差异的目的是代码的使用者可以使用 npm 执行哪些操作来安装这些资源。

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

如果有人计划在他们的程序中下载和使用您的模块,那么他们可能不想或不需要下载和构建您使用的外部测试或文档框架。在这种情况下,最好在 devDependencies 哈希中列出这些附加项。只要设置了 --dev 配置标志,就会安装这些东西。此标志在执行 npm link 或从包的根目录执行 npm install 时自动设置,并且可以像任何其他 npm 配置参数一样进行管理。有关该主题的更多信息,请参见 config(1)。

但是,要解决这个问题,如果您只想使用 npm 安装“依赖项”,则以下命令是:

npm install --production

这可以通过查看添加此过滤器的 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

@dmarr 尝试使用 npm install --production


K
Kevin Cox

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


你能重新表述一下吗?我认为你在括号中犯了一个错误,我认为你忘了早点关闭它,你的框架对我来说没有多大意义(非英语母语人士)。 Johann 在 Rohan Singh 回答下的评论让我关注你的回答(因为我的怀疑与玛瑙的怀疑完全相同),但没有成功。我仍然不明白 npm install some-module 如何不安装 some-module 的开发依赖项。
谢谢,修好了。但是,我不明白您的其余问题。
m
marverix

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

npm ci --only=production

或者

NODE_ENV=production npm ci

如果您更喜欢 oldschool npm install,那么:

npm install --production

或者

NODE_ENV=production npm install

Here is good answer 为什么应该使用 npm ci


很酷,它也适用于 npm ci,而不仅仅是 npm install
F
Francesco Casula

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

NODE_ENV=production npm install

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

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

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

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

NPM Documentation here

production 默认值:false 类型:Boolean 设置为 true 以在“生产”模式下运行。在不带任何参数运行本地 npm install 时,devDependencies 不会安装在最顶层。为生命周期脚本设置 NODE_ENV="production"。

快乐的容器化 =)


S
Sandip Nirmal

使用 npm install packageName --save 这将在 dependencies 中添加包,如果您使用 npm install packageName --save-dev 则它是 devDependencies

npm install packageName --save-dev 应用于添加用于开发目的的包。就像添加 TDD 包(Chai、mocha 等)。哪些用于开发而不是生产。


OP 在 package.json 中保存依赖项没有问题,但是一旦这些依赖项已经保存,那么如何强制 npm 仅安装一种特定类型的依赖项。当我在这里阅读您的答案时,我没有学到任何有助于解决 OP 提出的问题的知识。
G
Gabriel Schulhof

我发现,当尝试为包含节点插件的包安装开发依赖项时,即使您只想安装 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

М
Марат Зимнуров

npm install --production --no-optional

它仅安装来自 dependencies 的 deps,将忽略 optionalDependenciesdevDependencies


a
ack

需要添加到所选答案:截至目前,包目录(包含 package.json)中的 npm install 将安装 devDependencies,而 npm install -g 不会安装它们。


是的,-g 不会安装 devDependencies,但它会全局安装软件包,这通常不是预期的结果。
e
ericP

我在 docker 节点中遇到了一个问题:current-slim(运行 npm 7.0.9),其中 npm install 似乎忽略了 --production--only=prod--only=production。我找到了两种解决方法:

使用 ci 代替(RUN npm ci --only=production),这需要在 npm 安装之前使用最新的 package-lock.json,粗暴地编辑 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 容器的那个。当然,这不应该是必要的,但如果是(就像我一样),那就是你的黑客。


R
Rubin bhandari

npm install --production 是安装生产所需的节点模块的正确方法。查看文档以获取更多详细信息


E
Erich Stark

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