我正在用commander-plus编写一个节点命令行工具。
import program from 'commander-plus';
const prompts = ['a', 'b', 'c'];
program.choose(prompts, (index) => {
// never returns;
});
并希望在gulp任务中运行它,主要是因为它很方便,而且我们正在加载。env变量,但在上只开发。
import env from 'gulp-env';
gulp.task('env', () => {
env();
});
一开始我一直在尝试gulp-shell。我实际上使用了一个类似的脚本来启动nodemon,它工作得很好。cli脚本运行得很好,但是commander-plus无法监听键盘输入。
import shell from 'gulp-shell';
import gulp from 'gulp';
gulp.task('cli', ['env'], shell.task([
'babel-node src/cli',
]))
后来我发现,要么这就是它应该如何工作,要么它现在已经修复了。https://github.com/sun-zheng-an/gulp-shell/issues/10
但是gulp-shell也被列入黑名单,并且认为可以尝试使用gulp-exec或child_process。exec代替。
import { exec } from 'child_process';
gulp.task('cli', ['env'], done => {
exec('babel-node src/server/cli', done);
});
不确定它是否符合答案,但我找到了使用node-dotenv的方法。
首先我有一个配置文件,看起来像
// only set default for env
configExport.env = process.env.NODE_ENV || 'development';
// and a lot of other variables
然后在我的服务器和cli工具中,我只在需要时加载。env。
import dotenv from 'dotenv'
import config from '../server/config';
if(config.env === 'development'){
dotenv.load();
}
如果没有找到。env文件,dotenv不会失败,但是额外的if检查的原因是我担心。env可能被意外部署。
我们还需要确保。env没有部署所有适当的。ignore()。Gitignore, modulusignore, .dockerignore),应该可以完成这项工作
显然gulp-bg是一个工作选项。这样,我们仍然可以继续使用gulp运行开发人员任务,并避免在生产环境中完全使用dotenv。
import bg from 'gulp-bg';
import gulp from 'gulp';
gulp.task('cli', ['env'], bg('node', './src/cli'));