2016-01-20 91 views
0

我有一個模塊,期望從​​命令行調用,所以它使用yargs處理命令行參數,並失敗並提供幫助消息,如果它沒有提供任何。如何編寫可從命令行和模塊使用的NodeJS模塊?

但我還想從其他NodeJS模塊(使用gulp)調用此模塊。如果我只是require(./mymodule),它將嘗試解析命令行參數並失敗。

一個顯而易見的解決方案是將命令行位放入包含主模塊的單獨模塊中。有其他人嗎?是否有共同的模式?

編輯

,並有一個命名約定區分主模塊封裝器嗎?

回答

2

我可能只是用命令行調用的包裝腳本,就像你提到的那樣。我覺得這是節點中更常見的模式。但如果我有解決這個問題,我可能會做這樣的事情。

var path = require('path'); 
var fileBase = path.parse(__filename).base; 

var lib = { 
    run: function() { 
     console.log('my lib is running'); 
    } 
}; 

module.exports = lib; 


// assuming your file is not named node.js or gulp.js 
// this will execute the module only when its invoked directly via the command line 
// eg node ./path/to/mylib 
process.argv.reduce(function(opts, arg) { 
    if (opts || arg[0] === '-') return true; 
    if (path.parse(arg).base === fileBase) { 
     lib.run(); 
    } 
}, false); 
+0

謝謝。問題我可能應該包括:模塊和命令行包裝器是否有一個命名約定? –

+0

有趣的問題....當js代碼被用作可執行文件,然後在頂部的'#!/ usr/bin/env節點'處添加一個hashbang時,它有時會忽略'.js'。文件。 如果你看看你的./node_modules/.bin目錄,你有時會看到那裏有js可執行文件遵循這種模式......比如'gulp'或'knex'或其他什麼 – eblahm