如何编写package.json文件,以便所有依赖项都可以通过“npm install”下载。

28

我使用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仅加载了子模块中一些依赖项。

有人能否请解释一下?为什么会缺少某些依赖项?我是否做错了什么?(很可能)

谢谢!

Merc.

3个回答

38

你至少有两个地方存在困惑。

首先,可以通过阅读node_modules/express/package.json文件来看出,Express并不依赖于Jade:

  "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": "*"
  }

如果您已经安装了 jade 或其他模板引擎,则 Express 可以与其一起使用。因此,为了解决问题,请在 package.json 文件中将 jade 列为依赖项。

另外,npm 只安装 Node.js 模块,而不是第三方软件如 MongoDB。对于不是 npm 模块的任何其他依赖项,您需要使用其他方式(如 apt-get、yum、手动安装等)进行安装。

因此,npm 确实会递归地安装依赖项,但仅限于 npm 模块。


1
另一个需要注意的是,如果一个包依赖于一个可以在依赖链中进一步解决的模块,它将会这样做。例如,由于你在package.json中有mongodb,Mongoose不需要安装自己的mongodb - Michelle Tilley
Brandon,这就是答案。我不久前才弄清楚了。基本上,它不会在Mongoose下安装MongoDb,因为它已经被解决了。既然这是真正的答案,你能否将其作为适当的答案添加,而不是作为评论,以便我可以接受它? - Merc
@Peter 不错,由express生成的应用程序将具有express作为依赖项。顺便说一句,我的问题“为什么有些依赖项丢失了?”有一个简单的答案(由Brandon提供):“它们丢失了,因为它们在依赖树的更高层次上被解决了”。谢谢! - Merc

7

以下是另一篇回答中Brandon提供的答案:

"还有一件事情需要注意,如果一个软件包依赖于可以在依赖关系链上进一步解决的模块,它会这样做。例如,由于您在package.json中有mongodb,因此Mongoose不需要安装自己的mongodb。- Brandon Tilley 2天前

感谢Brandon!(这就是答案...)


4

使用这个示例

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

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接