【问题标题】:How to write a package.json file so that all dependencies are downloaded with "npm install"如何编写 package.json 文件,以便使用“npm install”下载所有依赖项
【发布时间】:2016-07-26 20:08:21
【问题描述】:

我使用 node.js 编写了一个简单的应用程序。这取决于 express、mongodb 和 mongoose(简单)。 因此,我创建了一个名为 package.json 的文件并将其放入其中:

{
  "name": "booking-dojo",
  "description": "Booking dojo app",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "express": "3.x",
    "mongodb": "*",
    "mongoose": "*"
  }
}

然后我运行npm install,期望 npm 安装这些模块它们的依赖项。 结果令人失望:

booking-dojo@0.0.1 /home/merc/Synced/Development/Bookings/app/server
├─┬ express@3.0.0rc3 
│ ├── commander@0.6.1 
│ ├─┬ connect@2.4.3 
│ │ ├── bytes@0.1.0 
│ │ ├── formidable@1.0.11 
│ │ ├── pause@0.0.1 
│ │ └── qs@0.4.2 
│ ├── cookie@0.0.4 
│ ├── crc@0.2.0 
│ ├── debug@0.7.0 
│ ├── fresh@0.1.0 
│ ├── methods@0.0.1 
│ ├── mkdirp@0.3.3 
│ ├── range-parser@0.0.4 
│ └─┬ send@0.0.3 
│   └── mime@1.2.6 
├─┬ mongodb@1.1.4 
│ └── bson@0.1.1 
└─┬ mongoose@3.0.3 
  ├── hooks@0.2.1 
  └── ms@0.1.0 

我对此感到困惑,因为我知道express 需要jade(以及更多),而mongoose 需要mongodb
如果我进入node_modules/jade 并运行npm install,主树的结果会非常不同:

booking-dojo@0.0.1 /home/merc/Synced/Development/Bookings/app/server
├─┬ express@3.0.0rc3 
│ ├── commander@0.6.1 
│ ├─┬ connect@2.4.3 
│ │ ├── bytes@0.1.0 
│ │ ├── formidable@1.0.11 
│ │ ├── pause@0.0.1 
│ │ └── qs@0.4.2 
│ ├─┬ connect-redis@1.4.1 
│ │ └─┬ redis@0.7.2 
│ │   └── hiredis@0.1.14 
│ ├── cookie@0.0.4 
│ ├── crc@0.2.0 
│ ├── debug@0.7.0 
│ ├── ejs@0.8.2 
│ ├── fresh@0.1.0 
│ ├── github-flavored-markdown@1.0.1 
│ ├─┬ hjs@0.0.4 
│ │ └── hogan.js@2.0.0 
│ ├─┬ jade@0.27.2 
│ │ └── mkdirp@0.3.0 
│ ├── methods@0.0.1 
│ ├── mkdirp@0.3.3 
│ ├─┬ mocha@1.4.0
│ │ ├── diff@1.0.2 
│ │ ├── growl@1.5.1 
│ │ └─┬ jade@0.26.3 
│ │   └── mkdirp@0.3.0 
│ ├── range-parser@0.0.4 
│ ├─┬ send@0.0.3 
│ │ └── mime@1.2.6 
│ ├── should@1.1.0 
│ ├─┬ stylus@0.29.0 
│ │ └── cssom@0.2.5 
│ └─┬ supertest@0.0.1 
│   └─┬ superagent@0.5.0 
│     ├── emitter-component@0.0.1 
│     ├── formidable@1.0.9 
│     ├── mime@1.2.5 
│     └── qs@0.4.2 
├─┬ mongodb@1.1.4 
│ └── bson@0.1.1 
└─┬ mongoose@3.0.3 
  ├── hooks@0.2.1 
  └── ms@0.1.0 

所以,express 已经增长了很多。看起来npm install 只加载了一些子模块的依赖项。

有人可以解释一下吗?为什么缺少一些依赖项?难道我做错了什么? (可能)

谢谢!

默克。

【问题讨论】:

    标签: node.js npm


    【解决方案1】:

    您至少对 2 点感到困惑。

    首先,express不依赖jade,阅读node_modules/express/package.json文件可以看出:

      "dependencies": {
        "connect": "2.4.2",
        "commander": "0.6.1",
        "range-parser": "0.0.4",
        "mkdirp": "0.3.3",
        "cookie": "0.0.4",
        "crc": "0.2.0",
        "fresh": "0.1.0",
        "methods": "0.0.1",
        "send": "0.0.3",
        "debug": "*"
      }
    
    但是,

    Express 确实可以与 如果 它可用,以及许多其他模板引擎。因此,将这个列表 jam 修复为 package.json 文件中的依赖项就可以了。

    其次,npm 只安装 node 包,不安装 mongodb 之类的第三方东西。您需要使用其他方式(apt-getyum、手动安装等)安装 mongodb 和任何其他非 npm 模块的依赖项。

    所以 npm 确实递归安装依赖项,但只安装 npm 模块。

    【讨论】:

    • 另外需要注意的是,如果一个包依赖于一个可以在依赖链中进一步解析的模块,它会。例如,由于您的 package.json 中有 mongodb,Mongoose 不需要安装自己的 mongodb
    • 布兰登,这的答案。不久前我才想通。基本上,它不会在 Mongoose 下安装 MongoDb,因为它已被进一步解决。由于这实际答案,您能否将其添加为正确答案,而不是评论,以便我接受?
    • @Peter 好点,由 express 生成的应用程序 生成 将作为依赖项顺便说一句。我的问题是“为什么缺少一些依赖项?”,答案很简单(由 Brandon 提供)“它们丢失是因为它们在依赖关系树中被进一步解析”。谢谢!
    【解决方案2】:

    布兰登在对另一个答案的评论中提供了答案:

    "另外需要注意的是,如果一个包依赖于一个可以在依赖链中进一步解析的模块,它会。例如,由于你的 package.json 中有 mongodb,Mongoose 不需要安装自己的 mongodb。——Brandon Tilley 2 天前

    谢谢布兰登! (这就是答案……)

    【讨论】:

      【解决方案3】:

      使用此示例

      {
        "name": "app",
        "version": "0.0.1",
        "main":"test.js",
        "author":"Test",
        "description": "For test ",
        "dependencies": {
          "express": "latest",
          "mongoose": "latest"
        }
      
      }

      【讨论】:

        猜你喜欢
        • 2017-12-18
        • 2018-11-07
        • 2013-10-07
        • 1970-01-01
        • 2015-07-25
        • 2022-06-20
        • 1970-01-01
        • 2017-03-24
        • 2020-07-28
        相关资源
        最近更新 更多