如何防止为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

在开发环境(默认)中, npm install命令将在软件包目录中运行时,沿其他dependencies安装devDependencies 。 为了解决这个问题,使用npm install --production或者将NODE_ENV环境variables设置为production

这里是一些更多的信息。


编辑:

从npm(2015-08-13)v3.3.0开始,使用npm install --production会发出警告:

--production选项的用法已被弃用。 使用--only=production

使用npm install --only=production 安装dependencies ,而不是devDependencies,而不pipeNODE_ENV环境variables的值。

参考: npm docs | npm更新日志

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

  • npm install将同时安装“ dependencies ”和“ devDependencies

  • npm install –production将只安装“ 依赖关系

  • npm install –dev只会安装“ devDependencies

新的选项是:

 npm install --only=prod 

如果你只想安装devDependencies:

 npm install --only=dev 

如果你在2016年阅读这篇文章,请使用你想要的

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

参数将导致无论是否devDependencies或只有非devDependencies被安装,而不pipeNODE_ENV。

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

当使用“npm install”时,无论是“devDependencies”还是“dependencies”,模块都会被加载并在整个应用程序中使用。 这个概念的总和:package.json定义为依赖项(任何types)的所有东西都被安装到node_modules。

依赖关系/ devDependencies / optionalDependencies之间区别的目的是代码的消费者可以使用w / npm来安装这些资源。

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

如果有人计划在他们的程序中下载和使用你的模块,那么他们可能不想或者不需要下载和构build你使用的外部testing或者文档框架。

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

只要设置了–devconfiguration标志,就会安装这些东西。 这个标志在做npm链接或者从一个包的根目录进行npm安装的时候会自动设置,并且可以像其他npmconfiguration参数那样进行pipe理。 有关该主题的更多信息,请参阅config(1)。

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

 npm install --production 

这可以通过查看添加此filter的Git提交(以及其他一些filter[下面列出]来提供此function)来加以确认。

可以使用npm的替代filter:

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

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

如果您已经安装了所有的依赖关系,并且想要避免再次从NPM下载您的产品包,则只需键入:

 npm prune --production 

这将从您的node_modules文件夹中删除您的开发依赖关系,如果您尝试自动化两步过程(如

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

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

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

我发现,当试图为包含节点插件的软件包安装开发依赖项时,即使只想安装devDependencies,也不能避免在运行npm install –dev时创build插件。 所以,我不得不在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 packageName --save如果你使用npm install packageName --save-dev那么它会在依赖关系中添加软件包,然后是devDependencies

npm install packageName --save-dev应该用于为开发目的添加软件包。 就像添加TDD包(柴,摩卡等)。 哪些用于开发而不用于生产。

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

 NODE_ENV=production npm install 

上面的代码将安装所有的依赖关系,但是dev的依赖关系(即devDependencies )。

如果你需要在你的Dockerfile使用环境variables,可以在这里find更多的信息。

环境variables很容易被覆盖(例如,如果你想在Travis CI上运行你的testing套件)。 如果是这样,你可以做这样的事情:

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

NPM文档在这里

生产

  • 默认:false
  • types:布尔值设置为true,以“生产”模式运行。

    1. 在没有任何参数的情况下运行本地npm安装时,devDependencies不会安装在最高级别。
    2. 为生命周期脚本设置NODE_ENV =“生产”。

快乐容器化=)

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