如何防止为Node.js(package.json)安装devDepend的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。

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

npm install

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

npm install --dev

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

483125 次浏览

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标志。

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

  • npm install将同时安装“依赖项”和“开发依赖项

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

  • npm install --dev将只安装“devDepend的

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

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

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

依赖项/devDepend的区别的目的是代码的使用者可以做什么w/npm来安装这些资源。

每个留档:https://npmjs.org/doc/json.html

如果有人计划下载并使用您的模块程序,那么他们可能不想或不需要下载和构建您使用的外部测试或留档框架。

在这种情况下,最好将这些附加项列在开发依赖哈希。

这些东西将在--dev配置标志时安装已设置。此标志在执行npm链接或从包的根目录执行npm安装,并且可以像任何其他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--生产

我发现,当尝试为包含节点插件的包安装dev依赖项时,即使您只想安装devDepend,也无法在运行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 --only=prod

如果您只想安装devDepend的:

npm install --only=dev

如果您已经安装了所有依赖项,并且您想避免再次从NPM下载生产包,您可以简单地键入:

npm prune --production

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

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

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

如果您在2016年阅读此帖子,请通过使用

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

参数将导致只安装devDepend,或只安装非devDepend,而不管NODE_ENV。

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

使用npm install packageName --save这将在依赖关系中添加包,如果您使用npm install packageName --save-dev,则使用开发依赖

npm install packageName --save-dev应该用于添加用于开发目的的包。例如添加TDD包(Cai、mocha等)。它们用于开发而不是生产。

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

NODE_ENV=production npm install

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

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

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

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

这里是NPM文档

生产

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

    1. 在没有任何参数的情况下运行本地npm install时,开发依赖项不会安装在最顶层。
    2. 为生命周期脚本设置NODE_ENV=“生产”。

快乐的集装箱化=)

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

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

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

npm ci --only=production

NODE_ENV=production npm ci

如果你喜欢OldSchoolnpm install,那么:

npm install --production

NODE_ENV=production npm install

这是个好答案为什么你应该使用npm ci

我在docker节点中遇到了一个问题:当前-斯利姆(运行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。当然,这不应该是必要的,但如果是(就像我一样),有你的黑客。

npm install --production --no-optional

它只从dependencies安装deps,并且会忽略optionalDependenciesdevDependencies