2012-03-16 34 views
26

Tôi có một ứng dụng nút đơn giản có phụ thuộc duy nhất trên một ứng dụng khác trên github. Sự phụ thuộc cài đặt tốt với npm install, nhưng khi tôi cố gắng yêu cầu một cái gì đó được cài đặt ở đó, nó nói rằng nó không có sẵn. Ví dụ, ứng dụng github cài đặt Mongoose như một phụ thuộc. Tôi nghĩ rằng ứng dụng của phụ huynh này sẽ có thể truy cập vào module vì nó là trong một đứa trẻ:Yêu cầu sự phụ thuộc của một phụ thuộc khác trong các mô-đun nút

var mongoose = require('mongoose') 

Cấu trúc trông giống như sau:

/app 
    /node_modules 
    /github_dependency [parent module] 
     /node_modules 
     /mongoose [child module] 

Tôi chỉ phải bao gồm cầy mangut như một sự phụ thuộc cũng như trong ứng dụng cha mẹ hoặc có cách nào để truy cập vào mô-đun đó theo cách của đứa trẻ không?

Trả lời

30

Tôi chỉ cần bao gồm mongoose như một phụ thuộc cũng như trong ứng dụng gốc hoặc có cách nào để truy cập vào mô-đun đó theo cách của đứa trẻ không?

Trong khi đó là có thể cho bạn, ví dụ: require('github/node_modules/mongoose'), thực hành tiêu chuẩn là cài đặt tất cả các phụ thuộc của bạn một cách rõ ràng (nghĩa là, bạn nên bao gồm đàn giống như một phụ thuộc của ứng dụng của bạn) và require('mongoose').

+1

Cảm ơn bạn, chúng tôi sẽ theo quy ước này. Một điều tôi đã muốn đề cập đến, điều này về lý thuyết có thể dẫn đến nhiều, phụ thuộc trùng lặp trong dự án? –

+0

Nó có thể, và bạn thường sẽ có một số trường hợp của một số mô-đun khác nhau (và phiên bản của chúng) trong một dự án nút. Đó là một trong những thế mạnh của npm IMO, đã dành một phần đáng kể của những năm 00 làm việc ra kinks trong bộ nạp lớp của các thùng chứa Java khác nhau ... –

+4

Có một lý do rất tốt để sử dụng kỹ thuật này. Nếu bạn yêu cầu ('github/node_modules/mongoose'), bạn đang sử dụng cùng một thể hiện của mongoose mà github đang sử dụng, vì vậy bạn chia sẻ hồ bơi kết nối của nó. Kỹ thuật này cũng hữu ích để đảm bảo bạn đang sử dụng cùng một phiên bản. –

2

Đối với một trường hợp mạnh mẽ hơn, đó là tốt trong các tình huống như thử nghiệm, bạn có thể sử dụng chức năng sau:

var Module = require('module'); 
var path = require('path'); 

function requireFrom(self, parent, name) { 
    var pPath = Module._resolveFilename(parent, self); 
    var m = new Module(pPath, module); 
    m.filename = pPath; 
    m.paths = Module._nodeModulePaths(path.dirname(pPath)); 
    return m.require(name); 
} 

mà có thể được sử dụng như sau

requireFrom(module, 'github_dependency', 'mongoose') 
Các vấn đề liên quan