【问题标题】:How to do recursive installation of dependencies in Nodejs?如何在 Nodejs 中递归安装依赖项?
【发布时间】:2016-01-05 23:21:03
【问题描述】:

我有以下项目结构。

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

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

【问题讨论】:

标签: node.js gruntjs


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    假设您正在为每个模块创建包,您只需要在根目录中使用 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)
    

    这是the difference between ~ and ^上接受的答案

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

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

    【讨论】:

    • 每个包都有不同的依赖项,我不想在根 package.json 上列出。我想根据包级别将它们分开,因为有时我需要不同的版本来获得相同的依赖项在不同的模块上。
    • 是的,因此您只需在根 package.json 中引用子包名称和版本,然后子 package.json 文件就可以引用它们自己的依赖项
    • 子包是我自己的模块,你能提供一个简短的例子,它将如何保存在 root 的 package.json 中?
    • 我认为我们应该使用file:path 作为package.json 中的本地路径传递依赖项,然后它才会安装依赖项。我尝试了上面的示例,但它只是复制了@987654337 中子包的package.json @ 目录。是否可以不将子包放在node_module 目录下,并且它的依赖项应该安装在它自己的包下?
    • 是的,您应该为本地模块使用文件路径,否则 npm 会尝试从包索引中获取它(即,您需要将模块发布到包索引,但您可能不想这样做)
    猜你喜欢
    • 2017-01-31
    • 1970-01-01
    • 2016-11-20
    • 2015-05-26
    • 2016-12-14
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多