2013-03-06 31 views
16

Tôi có tập lệnh nút/javascript thực thi có boolean gỡ lỗi, nếu được đặt thành true, một vài tệp sẽ được ghi. Tệp thực thi này cũng là mô-đun nút. Tùy thuộc vào thư mục làm việc của người dùng đang chạy tập lệnh, có vẻ như hàm không thể tìm thấy thư mục để ghi tệp vào.Đường dẫn ghi hệ thống tệp tương đối trong mô-đun

Module này được cấu trúc như

output/ 
lib/ 
    helpers.js 
index.js 

lập luận ban đầu của tôi này sẽ có con đường được.

helper.write = function(data,filename){ 
    if(typeof data !== "string") data = JSON.stringify(data); 
    fs.writeFileSync("./output/"+filename, data); 
}; 

Tuy nhiên công trình này khi chạy kịch bản từ bên trong thư mục node_module

fs.writeFileSync("process.cwd()+"/node_modules/the_module/output/"+filename, data); 

Như thế này

node ./my_app/node_modules/the_module/index.js 

này được khó hiểu hơn nếu các module được sử dụng trong một tập tin thực thi mà sử dụng thư viện.

node ./my_app/run.js 

Có cách nào để lưu tệp độc lập khỏi tất cả các biến này không?

Trả lời

42

Nếu tôi hiểu câu hỏi một cách chính xác, bạn muốn luôn viết cho một đường dẫn liên quan đến tập lệnh hiện tại. Để có được tên của thư mục mà kịch bản hiện đang thực hiện cư trú tại, bạn có thể sử dụng __dirname như vậy:

var path = require('path'); 

helper.write = function(data,filename){ 
    if(typeof data !== "string") data = JSON.stringify(data); 
    var file = path.join(__dirname, 'output', filename); 
    fs.writeFileSync(file, data); 
}; 

Điều đó đang được nói, tôi không nghĩ rằng đó là thói quen tốt để được ghi tập tin bên trong thư mục node_modules của bạn . Tôi khuyên bạn nên mô-đun của bạn yêu cầu đường dẫn đầy đủ đến một tệp ở một nơi khác trong hệ thống tệp. Nếu người gọi muốn ghi vào một thư mục đầu ra trong cây dự án của chính nó, bạn có thể sử dụng cùng một thủ thuật __dirname.

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