2016-01-20 53 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