【问题标题】:How do you prevent install of "devDependencies" NPM modules for Node.js (package.json)?如何防止为 Node.js (package.json) 安装“devDependencies”NPM 模块?
【发布时间】:2012-03-05 07:28:49
【问题描述】:

我的 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 之间的区别以及它们各自的使用时间。

标签: node.js npm


【解决方案1】:

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

使用npm install --only=prod(或--only=production安装dependencies,而不是devDependencies, ,无论NODE_ENV环境变量的值如何。

来源:npm docs

注意:您可能还需要--no-optional

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

【讨论】:

  • 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。”
【解决方案2】:

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

  • npm install 将安装“dependencies”和“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 我有一个项目,其中生产依赖项全局安装,开发依赖项安装在本地。这是一个测试工具,所以根本不是一个常见的用例(也不是我设计它的方式),但它绝对是一个用例。我们使用 -g 标志运行 --production 和不带 -g 的 --dev。
【解决方案3】:

新选项是:

npm install --only=prod

如果你只想安装 devDependencies:

npm install --only=dev

【讨论】:

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

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

npm prune --production

这将从您的 node_modules 文件夹中删除您的开发依赖项,如果您尝试自动化两步过程,这将很有帮助,例如

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

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

【讨论】:

  • 在 2021 年,npm v7.11 你只需要npm install --only=production,即使你安装了整个东西并且它达到了相同的结果
【解决方案5】:

如果你在 2016 年读过这篇文章,请通过使用实现你想要的

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

参数将导致仅安装 devDependencies 或仅安装非 devDependencies,而与 NODE_ENV 无关。

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

【讨论】:

  • 为什么要大写“POST”? docs.npmjs.com/cli/install 清楚地记录了--production--only={prod[uction]|dev[elopment]}
【解决方案6】:

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

dependencies/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

【讨论】:

    【解决方案7】:

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

    【讨论】:

    • 您能重新制定一下吗?我认为您在括号中犯了一个错误,我认为您忘记早点关闭它并且您的框架对我来说没有多大意义(非英语母语人士)。 Johann 在 Rohan Singh 的回答下的评论让我看看你的回答(因为我的怀疑与玛瑙的怀疑完全一样),但没有成功。我仍然不明白npm install some-module 不会安装some-module 的开发依赖项。
    • 谢谢,已修复。但是,我不明白您的其余问题。
    【解决方案8】:

    我建议使用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
    【解决方案9】:

    值得一提的是,您可以使用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

    生产

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

      1. 在没有任何参数的情况下运行本地 npm install 时,devDependencies 不会安装在最顶层。
      2. 为生命周期脚本设置 NODE_ENV="production"。

    快乐的容器化=)

    【讨论】:

      【解决方案10】:

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

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

      【讨论】:

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

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

      【讨论】:

        【解决方案12】:

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

        【讨论】:

        • 是的,-g 不会安装 devDependencies,但它会在全局范围内安装软件包,这通常不是预期的结果。
        【解决方案13】:

        npm install --production --no-optional

        它只安装来自 dependencies 的 deps,并且会忽略 optionalDependenciesdevDependencies

        【讨论】:

          【解决方案14】:

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

          【讨论】:

            【解决方案15】:

            npm install --production 是安装生产所需的节点模块的正确方法。查看文档了解更多详情

            【讨论】:

              【解决方案16】:

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

              【讨论】:

                猜你喜欢
                • 2022-10-19
                • 1970-01-01
                • 2023-02-17
                • 2011-11-12
                • 2016-08-28
                • 1970-01-01
                • 2018-04-04
                • 1970-01-01
                相关资源
                最近更新 更多