Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在Nodejs中递归安装依赖项?_Node.js_Gruntjs - Fatal编程技术网

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

Node.js 如何在Nodejs中递归安装依赖项?,node.js,gruntjs,Node.js,Gruntjs,我有以下项目结构 parentDir ---> Child1 ---- [Child1] package.json ---> Childe2 ---- [Child2] package.json -----> SubChild3 ------ [subchild3] package.json ---- [parent] package.json 我有单独的模块,它有自己的依赖项,我想一次安装所有的包,我不想进入特定的目录。这可能吗?我尝试使用shell脚本

我有以下项目结构

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

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

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

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
时,这些包文件会一直工作。它将结果打印到命令行(如果从那里运行)。如果我尝试简单(全局)安装
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.x.x版本,但将推迟到2.0.0


几天前,我正在阅读节点库,它将递归地在子模块或子模块内部安装所有package.json。使用这个库,您不必在parent package.json中提到子模块和子模块。如果您将看到这个库()的实现,它只是一个JS文件,递归地分析您的子模块。因此,您可以使用此库,也可以编写类似于此库的js脚本。

每个包都有不同的依赖项,我不想在root package.json中列出。我想根据包级别将它们分开,有时,我需要不同的版本来实现对不同模块的相同依赖关系。是的,因此您只需要引用根package.json中的子包名称和版本,然后子package.json文件就可以引用它们自己的依赖关系。child package是我自己的模块,您能否提供一个简短的示例,它将如何保存在root的package.json中?我认为我们应该使用
文件:path
作为
package.json
中的本地路径传递依赖项,然后只有它才会安装依赖项。我尝试了上面的示例,但它只是复制了
节点模块
目录中子包的
package.json
。是否可以不将子包扔到
node\u module
目录下,并且它的依赖项应该在它自己的包下安装?是的,您应该使用本地模块的文件路径,否则npm将尝试从包索引中获取它(即,您需要将模块发布到包索引中,但您可能不想看到)
js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.16)