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

时间:2012-02-13 21:25:10

标签: node.js 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之类的内容同时安装dependencies和{{1} }}?

17 个答案:

答案 0 :(得分:725)

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

答案 1 :(得分:212)

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

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

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

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

答案 2 :(得分:123)

新选项是:

npm install --only=prod

如果您只想安装devDependencies:

npm install --only=dev

答案 3 :(得分:40)

如果您在2016年阅读此POST,请使用

达到您想要的效果
--only={prod[uction]|dev[elopment]} 
无论NODE_ENV如何,

参数都会导致只安装devDependencies或者只安装非devDependencies。

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

答案 4 :(得分:23)

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

var data = {
  "id": "123",
   "members": [
     { "id": 1, "name": "Andrew" },
     { "id": 2, "name": "Jim" }
   ]
};

var result = data.members.map(function (e) {
  return e.name;
}).join(', ');

console.log(result);

这将从您的npm prune --production 文件夹中删除您的开发依赖项,如果您尝试自动执行两步过程(例如

),这将非常有用
  1. 使用dev dependencies
  2. 对我的项目进行Webpack
  3. 仅使用生产模块构建Docker镜像
  4. 在其间运行node_modules将使您无需重新安装所有内容!

答案 5 :(得分:18)

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

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

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

  

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

     

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

     

只要--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 --production

答案 6 :(得分:15)

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

答案 7 :(得分:6)

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

npm ci --only=production

NODE_ENV=production npm ci

如果您更喜欢老式的npm install,则:

npm install --production

NODE_ENV=production npm install

Here is good answer为什么要使用npm ci

答案 8 :(得分:2)

我发现,在尝试为包含节点插件的软件包安装dev依赖项时,即使您只是想安装devDependencies,也无法避免在运行npm install --dev时构建插件。所以,我不得不绕着npm回来:

#container

或者,更好(也更简洁),

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

答案 9 :(得分:2)

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

答案 10 :(得分:2)

使用npm install packageName --save这将在依赖关系中添加包,如果您使用npm install packageName --save-dev,那么 devDependencies

npm install packageName --save-dev应该用于添加包以用于开发目的。就像添加TDD包(Chai,mocha等)一样。哪些用于开发而非生产。

答案 11 :(得分:1)

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

NODE_ENV=production npm install

上面的代码将安装所有依赖项,但是安装dev(即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

  

生产

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

         
        
    1. 在没有任何参数的情况下运行本地npm安装时,devDependencies不会安装在最顶层。
    2.   
    3. 设置NODE_ENV ="制作" for lifecycle scripts。
    4.   
  •   

快乐的集装箱化 =)

答案 12 :(得分:1)

现在有一个问题,如果你有一个npm 5+的package-lock.json。您必须在使用func updateAllRecords(responseArray: [Dictionary<String, String>]) { for settingsObject in responseArray { var dic2 = ["IS_CIVIL_ID_MANDATORY": "xyz", "TIME_IN_MIN_BEFORE_ENABLING_START_TRIP": "xyz"] let keys = settingsObject.flatMap() {$0.0} let values = settingsObject.flatMap(){$0.1} let settingKeys = dic2.flatMap() {$0.0} for settingsKey in settingKeys { dic2.updateValue(settingsObject[settingsKey]!, forKey: settingsKey) } print(keys) print(dic2) } } var dicArray = [Dictionary<String, String>]() let dic1 = ["IS_CIVIL_ID_MANDATORY": "Smith", "TIME_IN_MIN_BEFORE_ENABLING_START_TRIP": "Robert"] dicArray.append(dic1) updateAllRecords(responseArray: dicArray) 之前将其删除。

答案 13 :(得分:0)

npm install --dev will install dev dependencies

并且,按照仅安装依赖项的问题,以下命令将提供帮助

npm install --prod will install dependencies

答案 14 :(得分:0)

我在docker节点中遇到了一个问题: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 :(得分:-1)

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

答案 16 :(得分:-1)

npm install --production --no-optional

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