Cac常用命令合集

1,111 阅读4分钟

CAC是一个用于构建CLI应用程序的JavaScript库。在Vite构建工具中使用到。

一、 CAC的常用API

  • 1、.cac(name?)

创建CLI实例,可以选择指定将用于在帮助和版本消息中显示的程序名。未设置时,我们使用argv[1]的basename。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
  • 2、.command(name, description, config?)

创建命令实例。该选项还接受第三个参数config作为附加命令config: config.allowUnknownOptions: 布尔值允许此命令中存在未知选项。 config.ignoreOptionDefaultValue: 在解析的选项中不使用选项的默认值,只在帮助消息中显示它们。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.command('[root]', "vite启动本地服务");
  • 3、.option(name, description, config?)

添加全局选项。该选项还接受第三个参数config作为附加命令config: config.default: 选项的默认值。 config.type: any[]设置为[]时,选项值返回数组类型。您还可以使用转换函数,例如[String],它将使用String调用选项值。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.option('--port <port>', `[number]  port to listen to`, { type: [String] });
  • 4、command.action(callback)

当命令与用户输入匹配时,使用回调函数作为命令操作。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.command('[root]', "vite启动本地服务").action(function() {
  console.log("serve")
});
cli.parse();
  • 5、.parse(argv?)

全局解析。调用此方法时,cli.rawArgs cli.args cli.options cli.matched命令也将可用。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.command('[root]', "vite启动本地服务");
cli.option('--port <port>', `[number]  port to listen to`);
cli.help();
cli.version("1.0.1");
cli.parse();

命令行执行

$ node index.js -v
  • 6、.version(version, customFlags?)

定义版本号。当命令行输入-v--version时,输出版本号。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.version("1.0.1");
  • 7、.help(callback?)

定义帮助信息。当命令行输入-h--help时,输出帮助信息。可选回调允许在显示帮助文本之前对其进行后处理。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.help(function () { });
  • 8、.outputHelp()

输出帮助信息。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.command('[root]', "vite启动本地服务");
cli.option('--port <port>', `[number]  port to listen to`);
cli.help();
cli.outputHelp();
  • 9、.outputVersion()

输出版本信息。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.command('[root]', "vite启动本地服务");
cli.option('--port <port>', `[number]  port to listen to`);
cli.version("1.0.1");
cli.outputVersion();
  • 10、.usage(text)

添加全局用法文本。子命令不使用此选项。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.usage("usage");
  • 11、.example(example)

添加一个将显示在帮助消息末尾的示例。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.command('[root]', "vite启动本地服务");
cli.example("npm run serve");
cli.outputHelp();
  • 12、command.alias(name)

将别名添加到此命令,此处的名称不能包含括号。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.command('[root]', "vite启动本地服务").alias("serve");
  • 13、command.allowUnknownOptions()

允许此命令中的未知选项,默认情况下,当使用未知选项时,CAC将记录错误。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.command('[root]', "vite启动本地服务").allowUnknownOptions();
  • 14、command.ignoreOptionDefaultValue()

在解析的选项中不使用选项的默认值,只在帮助消息中显示它们。

example

const cac_1 = require('./cac');
const cli = cac_1.cac(`vite`);
cli.command('[root]', "vite启动本地服务").ignoreOptionDefaultValue();

二、一个完整的例子


// 解析命令行参数
const cac_1 = require("cac");

// 指定名称
const cli = cac_1.cac(`vite`);


// 全局options
cli
  .option('--config <file>, -c <file>', `[string]  use specified config file`)
  .option('--debug [feat]', `[string | boolean]  show debug logs`)
  .option('--mode <mode>, -m <mode>', `[string]  specify env mode (default: 'development' for dev, 'production' for build)`)
  .option('--jsx <preset>', `['vue' | 'preact' | 'react']  choose jsx preset (default: 'vue')`)
  .option('--jsx-factory <string>', `[string]  (default: React.creatElement)`)
  .option('--jsx-fragment <string>', `[string]  (default: React.Fragment)`);

// 服务配置 serve
cli
  .command('[root]') // 默认名 e.g. npm run dev   package.json -> script -> dev: 'vite dev'
  .alias('serve') // 别名为serve e.g. npm run serve
  .option('--port <port>', `[number] port to listen to`)
  .option('--force', `[boolean]  force the optimizer to ignore the cache and re-bundle`)
  .option('--https', `[boolean]  start the server with TLS and HTTP/2 enabled`)
  .option('--open', `[boolean]  open browser on server start`)
  .action(async (root, argv) => {
    if (root) {
      argv.root = root;
    }
    const options = await resolveOptions({ arg, defaultMode: 'development' /* serve 时默认 'development' */});
    return runServe(options);
  });

// 打包配置 build
cli
  .command('build [root]')
  .option('--entry <file>', `[string]  entry file for build (default: index.html)`)
  .option('--base <path>', `[string]  public base path (default: /)`)
  .option('--outDir <dir>', `[string]  output directory (default: dist)`)
  .option('--assetsDir <dir>', `[string]  directory under outDir to place assets in (default: _assets)`)
  .option('--assetsInlineLimit <number>', `[number]  static asset base64 inline threshold in bytes (default: 4096)`)
  .option('--ssr', `[boolean]  build for server-side rendering`)
  .option('--sourcemap', `[boolean]  output source maps for build (default: false)`)
  .option('--minify [minifier]', `[boolean | 'terser' | 'esbuild']  enable/disable minification, or specify minifier to use (default: terser)`)
  .action(async (root, argv) => {
    if (root) {
        argv.root = root;
    }
    const options = await resolveOptions({ argv, defaultMode: 'production' /* serve 时默认 'production' */});
    return runBuild(options);
  });

// 最优化 optimize
cli
  .command('optimize [root]')
  .option('--force', `[boolean]  force the optimizer to ignore the cache and re-bundle`)
  .action(async (root, argv) => {
    if (root) {
      argv.root = root;
    }
    const options = await resolveOptions({ argv, defaultMode: 'development' });
    return runOptimize(options);
  });
  cli.help();
  cli.version(require('../../package.json').version);
  cli.parse();

看完3件事

1、如果文章对你有帮助,可以给博主点个赞。

2、如果你觉得文章还不错,可以动动你的小手,收藏一下。

3、如果想看更多的源码详解,可以添加关注博主。

附录:

1、Cac完整版源码解析:github.com/fanqiewa/Ca…

2、其它源码解析:www.fanqiewa.xyz/