之前从来没接触过这类的课题,自己写命令行工具,没写过之前觉得这是一个很高大上的玩意儿,写过之后才发现原来不难。写之前当然是先在网上扒拉扒拉,看看别人怎么写的,结果找来找去,千篇一律,一个字也不带换的,还都是从npm仓库中复制下来的,还复制的不全,我已无力吐嘈!!!!

最后还是在NPM仓库中找到一段比较符合自己的介绍,就是自定义命令,下面就按照我的代码记录一下我是怎么写的。

首先创建项目,alaska-cli,编辑package.json,加入babel等就不细说了,目录结构如下:

alaska-cli

-index.js

-src

--alaska-build.js


本项目依赖commander包,这是一个非常方便简单的开发自己的CLI命令的包。


先看index.js:

'use strict';
const program = require('commander');
const buildAdmin = require('./src/alaska-build');
program
  .version('0.1.0')
  .command('alaska-build')
  .alias('build')
  .description('build admin views')
  .action(buildAdmin);

program.parse(process.argv);

导入commander, 导入CLI命令背后要执行的函数文件。

使用commander创建命令:

  .version('0.1.0')

命令版本,这个没什么好说的。

  .command('alaska-build')

命令名字,就是以后可以直接在命令窗口使用的名字,像webpack babel等。

  .alias('build')

命令的别名,就像小名一样,一般是个短名字。

  .description('build admin views')

命令介绍,生辰八字什么的可以写到这,

    .action(buildAdmin);

执行命令时要调用的函数,

program.parse(process.argv);

开始解析命令。

到这已经差不多了,我要说现在收尾你信么,不管你信不信,反正我是信了,剩下的就是写这个命令要怎么做事了。

看alaska-build.js:

/**
 * 所有读取文件时的错误处理
 * */
function excludeError(err, files) {
  if (err) {
    console.log(err);
  } else {
    if (typeof files === 'object' && files.length > 0) {
      collection(files);
    } else {
      console.log('未找到要构建的文件!');
    }
  }
}
module.exports = function () {
  fs.readdir(path, excludeError);
};

这一段不用说了吧,就是读取一个目录下的所有文件,从每个文件里导出一些数据组合再输出到另一个目录下。

写完这些逻辑,这个项目基本上已经完了,把项目上传到NPM仓库,在其他项目里就可以用 npm install

来安装这个包,之后就能像webpack babael 这类的命令一样直接用了。


github :  https://github.com/maichong/alaska-cli.git