如何在Nodejs中递归安装依赖项?

Sag*_*gar 8 node.js gruntjs

我有以下项目结构。

parentDir
---> Child1
---- [Child1] package.json
---> Childe2
---- [Child2] package.json
     -----> SubChild3
     ------ [subchild3] package.json
---- [parent] package.json
Run Code Online (Sandbox Code Playgroud)

我有单独的模块,它有自己的依赖项,我想一次安装所有包,我不想进入特定目录。这可能吗 ?我尝试使用保存目录路径的 shell 脚本,但代码库发生了巨大变化,因此不能总是更新 shell 脚本目录条目。如何使用 Grunt 等任何任务运行器在 Nodejs 中实现这一点?

Ans*_*ngh 6

几天前,我正在阅读recursive-install节点库,它甚至会递归地将所有 package.json 安装在 child-module 或 sub-child-module 中。使用这个库,你不必在父 package.json 中提及 child-modules 和 sub-child-module。如果你会看到这个库 ( github-link )的实现,它只是一个 JS 文件,它递归地分析你的子模块。因此,您可以使用此库,也可以编写类似于此库的 js 脚本。


br3*_*3w5 5

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

npm install
Run Code Online (Sandbox Code Playgroud)

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",
...
}
Run Code Online (Sandbox Code Playgroud)

甚至上面的依赖项也会有自己的包文件,npm当您npm install在根目录下运行时,这些文件会起作用。它将结果打印到命令行(如果您从那里运行它)。如果我尝试一个简单的(全局)安装,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) 
Run Code Online (Sandbox Code Playgroud)

子依赖项垂直列出,子项的子项横向列出,例如子依赖项 js-yaml 列为:

js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.16)
Run Code Online (Sandbox Code Playgroud)

这里有一个公认的答案之间的差别~^

用最简单的术语来说,波浪号与最新的次要版本(中间数字)相匹配。~1.2.3 将匹配所有 1.2.x 版本,但会错过 1.3.0。

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