2012-08-26 58 views
25

Tôi đã viết một ứng dụng đơn giản bằng nút. Nó phụ thuộc vào thể hiện, mongodb và mongoose (dễ dàng). Vì vậy, tôi đã tạo ra một tập tin gọi là package.json và đặt điều này trong nó:Cách viết tệp package.json để tất cả các phụ thuộc được tải xuống bằng "npm install"

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

sau đó tôi chạy npm install, mong NPM để cài đặt những mô-đun phụ thuộc của họ. Kết quả là đáng thất vọng:

[email protected] /home/merc/Synced/Development/Bookings/app/server 
├─┬ [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ └─┬ [email protected] 
│ └── [email protected] 
├─┬ mongodb[email protected] 
│ └── [email protected] 
└─┬ [email protected] 
    ├── [email protected] 
    └── [email protected] 

Tôi bối rối bởi điều này, như tôi biết rằng express nhu cầu jade (và nhiều hơn nữa), và mongoose nhu cầu mongodb.
Nếu tôi đi vào node_modules/jade và chạy npm install, kết quả từ các cây trồng chính là rất khác nhau:

[email protected] /home/merc/Synced/Development/Bookings/app/server 
├─┬ [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ └── [email protected] 
│ ├─┬ [email protected] 
│ │ └─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ └─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ └─┬ [email protected] 
│ └─┬ [email protected] 
│  ├── [email protected] 
│  ├── [email protected] 
│  ├── [email protected] 
│  └── [email protected] 
├─┬ [email protected] 
│ └── [email protected] 
└─┬ [email protected] 
    ├── [email protected] 
    └── [email protected] 

Vì vậy, expressphát triển rất nhiều. Có vẻ như npm install chỉ tải một số phụ thuộc của các mô-đun phụ.

Ai đó có thể làm sáng tỏ điều này không? Tại sao một số phụ thuộc bị thiếu? Tôi có làm điều gì sai? (có thể)

Cảm ơn!

Merc.

Trả lời

7

Câu trả lời được cung cấp bởi Brandon trong một chú thích cho câu trả lời khác:

"Một điều cần lưu ý là nếu một gói phụ thuộc vào một mô-đun có thể được giải quyết tiếp tục lên trong chuỗi sự phụ thuộc, nó sẽ Đối với. Ví dụ, vì bạn có mongodb trong package.json của bạn, Mongoose không cần phải cài đặt Mongodb của riêng nó - Brandon Tilley 2 ngày trước

Cảm ơn Brandon! (Và đây là câu trả lời ...)

38

Bạn đang bối rối về ít nhất 2 điểm.

Đầu tiên, thể hiện không phụ thuộc vào ngọc bích, như bạn có thể nhìn thấy bằng cách đọc các node_modules/express/package.json file:

"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 không, tuy nhiên, việc với ngọc nếu nó có sẵn, cũng như nhiều công cụ mẫu khác. Vì vậy, để sửa chữa danh sách này ngọc bích như là một phụ thuộc trong tập tin package.json của bạn và bạn sẽ được sử dụng tốt.

Thứ hai, npm chỉ cài đặt các gói nút, chứ không phải các thứ của bên thứ ba như mongodb. Bạn cần phải cài đặt mongodb và bất kỳ phụ thuộc nào khác không phải là mô-đun npm bằng các phương tiện khác (apt-get, yum, cài đặt thủ công, v.v.).

Vì vậy, npm KHÔNG cài đặt phụ thuộc đệ quy, nhưng chỉ mô-đun npm.

+1

Một điều cần lưu ý là nếu một gói phụ thuộc vào một mô-đun có thể được giải quyết tiếp tục lên trong chuỗi sự phụ thuộc, nó sẽ. Ví dụ, vì bạn có 'mongodb' trong package.json của bạn, Mongoose không cần cài đặt' mongodb' của riêng nó. –

+0

Brandon, đây * là * câu trả lời. Tôi chỉ tìm ra cách đây không lâu. Về cơ bản, nó không cài đặt MongoDb dưới Mongoose bởi vì nó được giải quyết thêm. Vì đây là * câu trả lời thực tế, bạn có thể vui lòng thêm nó làm câu trả lời thích hợp, thay vì nhận xét, để tôi có thể chấp nhận nó không? – Merc

+0

@Peter Điểm tốt, các ứng dụng * được tạo bởi express sẽ có tuy nhiên thể hiện như là một phụ thuộc BTW. Câu hỏi của tôi, "tại sao một số phụ thuộc bị thiếu?", Có câu trả lời đơn giản (do Brandon cung cấp) "Chúng bị thiếu bởi vì chúng được giải quyết thêm trong cây phụ thuộc". Cảm ơn! – Merc

4

sử dụng mẫu này

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

 
}

Các vấn đề liên quan