如何开发一个Node脚手架

缘由

在工做中,须要开发一个脚手架,用于给相关用户提供相关的开发便利性。javascript

适合人群

对前端、Node 操做有必定的了解,同时想了解脚手架开发过程或者须要本身实现一个脚手架的开发者。css

目标

  1. 开发一个简单的脚手架,可以提供给用户进行安装。
  2. 可以输出相关提示。
  3. 对用户文件进行读写操做。
  4. 在脚手架中使用 Shell 脚本。

步骤

开发脚手架

脚手架的开发最开始过程与普通的前端项目相同,须要一个入口文件 command.js 和配置文件 package.json前端

与其余配置文件不一样的是,你须要在 command.js 文件第一行增长以下声明:java

#! /usr/bin/env node
复制代码

同时须要在 package.json 文件中加上一下一项:node

{
  ...,
  "bin": {
   	"cm-cli": "command.js"
   }
}
复制代码

在配置文件中增长了此项后,只须要在配置文件根目录下执行 npm link 命令,便可使用 cm-cli --help 命令来查看加载的 cm-cli 脚手架(须要保证 command.js 可以处理响应,详情见下一节,放在此处是为了文章方便阅读)。npm

若是你发布了你的脚手架,那么在其余用户使用命令 npm install -g cm-cli 以后,即可以在全局下使用你的脚手架了。json

对用户进行提示

在对注释和命令进行提示中,咱们须要使用到 commander 包,使用 npm install commander 便可进行安装。(若是NPM版本低于5,则须要添加 --save 参数保证更新 package.json 配置文件)。bash

commander 是一个提供用户命令行输入和参数解析的强大功能。有须要的能够阅读相关的库文档。在这里我介绍两个用的最多的方法。curl

option

可以初始化自定义的参数对象,设置关键字和描述,同时还能够设置读取用户输入的参数。具体用法以下:函数

const commander = require('commander');

commander.version('1.0.0')
    .option('-a, --aaa', 'aaaaa')
    .option('-b, --bbb', 'bbbbb')
    .option('-c, --ccc [name]', 'ccccc')
    .parse(process.argv);


if (commander.aaa) {
    console.log('aaa');
}

if (commander.bbb) {
    console.log('bbb');
}

if (commander.ccc) {
    console.log('ccc', commander.ccc);
}
复制代码

此时若是已经配置完成而且执行过 npm link 命令后,能够看到以下结果:

clipboard.png

command

该方法可以在命令行增长一个命令。用户在执行此命令后,可以执行回调中的逻辑。具体用法以下:

commander
    .command('init <extensionId>')
    .description('init extension project')
    .action((extensionId) => {
        console.log(`init Extension Project "${extensionId}"`);
		// todo something you need
    });
复制代码

具体展现效果以下:

对用户文件进行读写操做

经过上面的步骤,咱们已经可以完成一个简单的脚手架了。下面,咱们须要读取用户配置,同时为用户生成一些模板文件。

读取文件

如今,咱们须要读取用户的 cm-cli.json 配置文件来进行一些配置。

咱们可使用 Node.js 的 fs 文件模块来对文件进度读操做,因为此处没有太多难点,所以略去。

写入文件模板

咱们提早将模板文件存储在 CDN 上,再根据本地读取到的相关脚手架配置文件来进行模板的下载。

注:脚手架中读取的路径为使用者使用时当前路径,所以没有办法将模板文件存储在脚手架中进行读取。

咱们可使用诸如 request 这种库来帮助咱们进行文件下载,简化操做步骤。执行 npm install request 便可进行安装。

注:在文件写入时建议先判断文件是否存在,再进行覆盖。

使用 Shell 脚本

与 Node.js 提供的 API 函数来看,有些人更加倾向于使用 Shell 脚原本进行文件操做。幸运的是,咱们也能够在咱们的脚手架中引入 node-cmd 来启用对 Shell 脚本的支持。执行 npm install node-cmd 便可进行安装。

具体示例以下:

commander
    .command('init <extensionId>')
    .description('init extension project')
    .action((extensionId) => {
        id = extensionId;
        console.log(`init Extension Project "${extensionId}"`);

        cmd.get(
            ` mkdir -p static/${extensionId} mkdir tmp mkdir tmp/source-file mkdir tmp/build-file curl -o tmp/source-file/index.js https://xxxxxxxx.com?filename=index.js touch tmp/source-file/index.css curl -o tmp/build-file/server.js https://xxxxxxxx.com?filename=server.js curl -o tmp/build-file/router.js https://xxxxxxxx.com?filename=router.js curl -o tmp/build-file/package.json https://xxxxxxxx.com?filename=package.json cp tmp/source-file/* static/${extensionId} cp tmp/build-file/* ./ rm -fr tmp npm install `,
            (err, data) => {
                console.log(data)
                if (!err) {
                    console.log('init success');
                    return;
                }

                console.error('init error');
            });
    });
复制代码

咱们能够快速的使用 Shell 脚原本进行文件夹的建立和文件模板的下载。

总结

脚手架想要在终端可以快速执行,能够在 package.json 配置文件中增长相关字段。

脚手架须要可以读取相关终端输入,可使用 commander 库来快速开发。

脚手架须要可以执行 Shell 脚本,可使用 node-cmd 库来快速实现需求。

相关文章
相关标签/搜索