2015-02-01 16 views
5

VớiWrapping đòi hỏi

3 Node.js dự án chính - Khung - Repositories

chính có hai dự án khác kết nối thông qua liên kết NPM.

Trong bài kiểm tra tôi đã bao gồm các yêu cầu trong một phương pháp. Tôi đã có một số vấn đề giải quyết các dự án liên kết (chi tiết xem dưới đây)

đang Giản trông như thế này:

module.export.resolve = function(file){ 
[...]//Some more logik to handle relative pathes 
return require(file) 
} 

này hoạt động tốt trong hầu hết các tình huống. Tôi cũng đã làm việc ra để xử lý với người thân pathes (nhìn lên cho người gọi và áp dụng pathes dựa trên con đường này)

Bây giờ đây là trong Dự án Khung được liên kết (NPM liên kết) đến Main Project. Dự án chính cũng có Kho dự án được liên kết.

Bây giờ trong Main Project tôi có:

require('ProjectRepositories/foo') // Works as expected 
myRequire.resolve('ProjectRepositories/foo') // Returns MODULE_NOT_FOUND "Cannot find module 'ProjectRepositories/foo' 

tôi giả sử vấn đề là Repositories Dự án ist không được liên kết trong Khung Dự án. Nhưng có cách nào khác hơn là liên kết chúng?

Tôi muốn có ít sự phụ thuộc hơn. Bất kỳ gợi ý về điều đó?

+0

Nó không hoàn toàn rõ ràng với tôi về cấu trúc của bạn. Bạn có thể làm rõ? Trong khi đó, bạn có biết bạn có thể có ['NODE_PATH'] (https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders) env var không? – gustavohenke

+0

Bạn nói "hoạt động như mong đợi" nhưng bạn không nói những gì nó trả về. Vì vậy, nó có thể trở lại giống nhau. Từ những gì bạn đăng, nó thực hiện chính xác như nhau, ngoại trừ việc bạn đã viết thêm logic mà thực sự có thể làm hỏng những gì yêu cầu nhập khẩu. Nếu bạn thực hiện một hàm resolve2 trả về trực tiếp 'require (file)', nó sẽ hoạt động tốt như lời gọi 'require ('ProjectRepos/foo') trực tiếp của bạn. Sau đó, bạn có thể kết luận rằng logic tùy chỉnh của bạn thực sự là nơi lỗi nằm, tôi đoán. – EricG

Trả lời

1

Bạn đang hoàn toàn đúng ở chỗ lý do tại sao Dự án Khungresolve không hoạt động là do requireFn được sử dụng từ bên trong dự án mà chỉ biết về các module được cài đặt trong khuôn khổ. Điều này là do khi bạn require tệp javascript, nút đánh giá tập lệnh bên trong mô-đun context của mô-đun và không phải ngữ cảnh của dự án hiện tại (đây là cách hoạt động của mô-đun phụ thuộc 'require s từ tập lệnh cấp cao nhất của bạn).

Những gì bạn có thể làm, tuy nhiên, là cung cấp một cách để giải quyết khuôn khổ để sử dụng một người dùng chỉ định yêu cầu chức năng để làm công việc của mình, một khi nó đã làm thay đổi các đường dẫn.

module.exports.resolve = function(file, resolver) { 
    //Some more logik to handle relative pathes 
    resolver = typeof resolver == 'function' ? resolver : require; 
    return resolver(file) 
} 

Bây giờ trong mã của bạn, bạn có thể làm

myRequire.resolve('ProjectRepositories/foo', require); 

Bây giờ bạn Main Project yêu cầu sẽ được sử dụng để giải quyết các tập tin.

Bạn cũng có thể thực hiện bước này thêm một bước nữa nếu bạn muốn và yêu cầu mô-đun trở nên rõ ràng và nhớ trình phân giải cần sử dụng.

var _requireFn = require; 

module.exports = { 
    resolve: resolve, 
    setRequireFn: setRequireFn 
}; 

function resolve(path) { 
    return _requireFn(path); 
} 

function setRequireFn(requireFn) { 
    _requireFn = requireFn; 
} 

Ngày lưu ý khác, tôi sẽ phải cẩn thận về việc sử dụng thuật ngữ resolve vì trong nút đó là ngữ nghĩa sử dụng cho nhìn lên các đường dẫn tập tin đúng được yêu cầu, a la require.resolve.

Cuối cùng, về mặt giảm thiểu phụ thuộc, tôi khuyên bạn nên bao gồm các dự án con của bạn bằng npm bằng cách sử dụng repo github. Điều này đã làm việc khá tốt cho tôi trong quá khứ, trừ khi hai subrepos của bạn đang ở trong trạng thái không đổi. Xem install docs để biết thêm thông tin.

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