实现一个小型脚手架(cli )

194 阅读1分钟

搭建过程

  • 打开命令行,通过mkdir创建一个项目目录

    mkdir sample-scaffolding
    
  • 切入到这个项目目录下

    cd sample-scaffolding
    
  • 通过yarn init -y 命令初始化一个package.json的文件

    yarn init -y
    
  • 通过code .命令使用vscode打开这个目录

  • 在package.json文件中添加bin字段,用于去指定一下cli应用的入口文件

    {
      "name": "sample-scaffolding",
      "version": "1.0.0",
      "main": "index.js",
      "bin": "cli.js",
      "license": "MIT"
    }
    
  • 新建这个cli.js

    • 注意:cli 的入口文件 cli.js 中必须要有一个特定的文件头 #!/usr/bin/env node
  • 在命令行执行 yarn link 使得当前模块link到全局

  • 使用inquirer 模块用于在node中发起命令行交互询问

    • yarn add inquirer
  • 根目录下新建templates目录,里面放模板文件(index.html和index.css)

    // index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title><%= name %></title>
    </head>
    <body>
        
    </body>
    </html>
    
  • cli.js 中使用node提供的path模块去获取路径

  • cli.js 中使用node提供的fs模块去读取和写入文件

  • 安装ejs模块用于渲染模板文件

    yarn add ejs
    
  • 最后使用fs的writeFileSync方法将ejs渲染的结果写入到目标文件中,代码如下

    #!/usr/bin/env nodeconst fs = require('fs')
    const inquirer = require('inquirer')
    const path = require('path')
    const ejs = require('ejs')
    ​
    inquirer.prompt([
        {
            type: 'input',
            name: 'name',
            message: 'Project name?'
        }
    ])
    .then(anwsers => {
        // 模板目录
        const tmplDir = path.join(__dirname, 'templates')
        // 目标目录
        const destDir = process.cwd()
    ​
        // 将模板目录下的文件全部转换到目标目录
        fs.readdir(tmplDir, (err, files) => {
            if(err) throw err
            files.forEach(file => {
                ejs.renderFile(path.join(tmplDir, file), anwsers, (err, results) => {
                    if(err) throw err
                    fs.writeFileSync(path.join(destDir, file), results)
                })
            })
        })
    })
    

使用方法

  • 选择一个目标文件夹,打开命令版,新建一个文件夹,并切换到此文件夹,执行sample-scaffolding命令

    mkdir xxx
    cd xxx
    sample-scaffolding
    
  • 此时命令行会弹出一个预设的问题让输入名称,输入自定义名称

  • 此时在xxx文件夹里已生成想要的模板文件内容