Commander-plus gulp

Commander-plus with gulp

我正在用 commander-plus 编写一个 node cli 工具。

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 的方法。只是没有 gulp.

首先我有一个类似于

的配置文件
// 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 没有与所有适当的 .ignores(.gitignore、modulusignore、.dockerignore)一起部署,这应该可以完成工作。

显然 gulp-bg 是一个可行的选项。有了它,我们仍然可以继续 运行 开发人员任务 gulp 并在生产中完全避免 dotenv。

import bg from 'gulp-bg';
import gulp from 'gulp';

gulp.task('cli', ['env'], bg('node', './src/cli'));