如何在Nodejs中执行依赖关系的recursion安装?

我有以下结构的项目。

parentDir ---> Child1 ---- [Child1] package.json ---> Childe2 ---- [Child2] package.json -----> SubChild3 ------ [subchild3] package.json ---- [parent] package.json 

我有独立的模块,它有自己的依赖关系,我想要一次安装所有的软件包,我不想进入特定的目录。 这可能吗 ? 我尝试了使用shell脚本来保存目录path,但代码库发生了巨大的变化,因此无法总是更新shell脚本目录条目。 如何在Nodejs中使用像Grunt等任何跑步者来实现这一点?

假设你正在为你的每个模块创build一个package.json ,你只需要一个名为package.json的所有依赖项。 这些包中的每一个都有自己的package.json和依赖关系。 然后从你的项目根目录( package.json )运行

 npm install 

npm将负责安装依赖关系的依赖关系。 例:

 // parent package.json { "name": "yourApp", "description": "An app for doing stuff", "version": "1.0.0", "scripts": { "init": "npm install", "install": "bower install", "start": "node src/server/app.js", "test": "gulp test" }, "dependencies": { "angular-ui-router": "^0.2.15", "body-parser": "^1.8.2", "express": "^4.9.3", "express-content-length-validator": "^1.0.0" } } // child dependency (this example is part of angular-ui-router's package.json) { "name": "angular-ui-router", "description": "State-based routing for AngularJS", "version": "0.2.15", "homepage": "http://angular-ui.github.com/", ... "dependencies": {}, "devDependencies": { "grunt": "~0.4.1", "grunt-contrib-concat": "~0.3.0", "grunt-contrib-uglify": "~0.4.0", "grunt-contrib-jshint": "~0.8.0", "grunt-contrib-watch": "~0.5.3", "grunt-contrib-connect": "~0.7.1", "grunt-contrib-clean": "~0.5.0", ... } 

即使上面的依赖关系也会有自己的包文件,当你在根目录下运行npm install时候, npm工作。 它将结果打印到命令行(如果从那里运行)。 如果我尝试一个简单的(全局)安装grunt我看在命令行上:

 grunt@0.4.5 node_modules/grunt ├── which@1.0.9 ├── dateformat@1.0.2-1.2.3 ├── eventemitter2@0.4.14 ├── getobject@0.1.0 ├── rimraf@2.2.8 ├── colors@0.6.2 ├── async@0.1.22 ├── hooker@0.2.3 ├── grunt-legacy-util@0.2.0 ├── exit@0.1.2 ├── nopt@1.0.10 (abbrev@1.0.7) ├── minimatch@0.2.14 (sigmund@1.0.1, lru-cache@2.7.0) ├── glob@3.1.21 (inherits@1.0.2, graceful-fs@1.2.3) ├── lodash@0.9.2 ├── coffee-script@1.3.3 ├── underscore.string@2.2.1 ├── iconv-lite@0.2.11 ├── findup-sync@0.1.3 (glob@3.2.11, lodash@2.4.2) ├── grunt-legacy-log@0.1.2 (grunt-legacy-log-utils@0.1.1, underscore.string@2.3.3, lodash@2.4.2) └── js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.16) 

子依赖关系是垂直列出的,而子项的子项是水平列出的,例如,子依赖关系js-yaml被列为:

 js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.16) 

以下是~^之间差异的答案

用最简单的术语来说,代字符与最近的次版本(中间数字)匹配。 〜1.2.3将匹配所有的1.2.x版本,但会错过1.3.0。

另一方面,插入符号更轻松。 它会将您更新到最新的主要版本(第一个数字)。 ^ 1.2.3将匹配包括1.3.0在内的任何1.xx版本,但会在2.0.0版本上延期。