rumnet脚手架开发

368 阅读2分钟

脚手架的地址:rumnet

目前该脚手架只支持dumi、umi模版。

1、创建项目

创建一个文件夹,进入文件夹,使用npm i,来初始化项目,会生成一个package.json文件。

其中字段含义为:

  • name: 脚手架的名称
  • version:脚手架的版本
  • description:脚手架的描述。这个描述在发版之后,会出现在npm仓库中脚手架的下方。

image.png

  • bin:执行哪个脚本,进入哪个文件执行。
  • files:发布到npm上时,哪些文件上传。
  • repository:仓库的类型和地址。
  • keywords:暴漏给npm的搜索关键词。
  • bugs:我这里放的是issue的地址。

配置完package.json之后,再使用git init,初始化一下仓库。

创建src/index.js文件,开始正式的开发过程!

2、开发过程

(1)init函数

module.exports =  function init(name){
    //name为rumnet init后面的项目名称
    if (name) {
        const curPath = process.cwd();

        fs.readdir(`${curPath}/${name}`, (err, dirName)=>{
            if (err) {
                createDir(name)
            } else {
                console.log(chalk.red('the project name is created'))
            }
        })
    } else {
        console.log(chalk.red('project name is not found, please use: rumnet init <projectName>'))
    }
}

(2)createDir函数

const createDir = (name) => {
    shell.exec('npm config set registry https://registry.npmjs.org/')
    console.log(chalk.green('Switched to https://registry.npmjs.org/'))
    if (checkNodeVersion()) {
        fs.mkdirSync(name);
        choiceTemplate(name)
    }
}

这里先切换一下npm的源。然后判断当前node的版本。

(3)checkNodeVersion函数

const checkNodeVersion = () => {
    const nodeV = shell.exec('node -v')
    const firstVersion= Number(nodeV.stdout.split('.')[0].split('v')[1])

    if (firstVersion < 14) {
        console.log(chalk.red('Node version should be above 14, please switch to above 14.'))
        process.exit(0)
    }

    return true
}

这里如果node的版本是小于14的,那么提示用户,切换到14以上。

(4)choiceTemplate函数

const choiceTemplate = (name) => {
    inquirer.prompt(templateList).then( async answer => {
        const { type } = answer;
        download({url: '下载的仓库/项目名称/分支', dir: `./${name}`, type})
    })
}

选择模版,templateList为rumnet内部定义的模版列表,如:

module.exports = [
    {
        type: 'list',
        name: 'type',
        message: 'Choose the template you want:',
        choices: ['umi', 'dumi']
    },
]

inquirer是一个npm包,能够实现终端交互选择。

(5)download函数

module.exports = ({url, dir, type}) => {
    const oraLoading = ora(`Downloading ${type} template.`)
    oraLoading.start();
    downloadFunc(`github:${url}`, dir, (err)=>{
        if (!err) {
            oraLoading.text = `Successfully created ${type} project!`
            oraLoading.succeed();

            shell.exec(`cd ${dir};git init;`)
            const installLoading = ora(`Installing ${type} template.\n`)
            installLoading.start();
            
            if(shell.exec('npm i').code === 0) {
                oraLoading.text = `Successfully installed ${type} project!`
                installLoading.succeed();
            } else {
                installLoading.stop();
            }
        } else {
            oraLoading.stop()
        }
    })
}

ora是一个能够控制下载提示状态的包,downloadFunc是download-git-repo包,能够用来下载仓库上的项目代码。

其中chalk是一个友好的界面提示工具。

整个脚本开发其实没有什么困难的地方,第一次开发,只是不知道用什么包能实现我们想要的功能而已。

到这里,我们已经开发完这个脚手架的主要部分。下面我们来看看如何配置发布相关的内容。

3、发布

我的这个脚本不需要打包,所以这步就跳过。之后在终端使用npm login登录自己的npm账号,并使用npm publish发布就可以了。但是这里有一个问题,每次发布我都要手动的去更改package.json文件中的version,这样很不方便,并且我还想要一个功能,每次发版本的时候,都能生成一个changelog文件。在找了一些资料之后,我决定使用release-it。

使用release-it的原因有以下几点:

  • 自动更新version。
  • 可以按照需求发布alpha版本,或者beta,release版本。
  • 自动在项目中生成一个CHANGELOG.md文件,存储每个版本的changelog。
  • 自动在github仓库(我自己的仓库)生成对应的issue。
  • 自动为版本打上tag。

release-it的配置还是非常简单的。按照以下步骤来配置:

下载release-it包:

npm init release-it

根目录下创建.release-it.json文件,并配置:

{
  "plugins": {
    "@release-it/conventional-changelog": {
      "preset": {
        "name": "conventionalcommits",
        "types": [
          {
            "type": "feat",
            "section": "Features"
          },
          {
            "type": "fix",
            "section": "Bug Fixes"
          },
          {
            "type": "docs",
            "hidden": true
          },
          {
            "type": "style",
            "hidden": true
          }
        ]
      },
      "infile": "./CHANGELOG.md"
    }
  },
  "github": {
    "release": true // 是否自动发布到github上
  },
  "npm": {
    "publish": true // 是否自动发布到npm上
  },
  "git": {
    "commitMessage": "release: v${version}" //自动更新version
  }
}

types类型我们可以根据自己的需要来配置。

在package.json中创建scripts:

    "alpha": "release-it preminor --preReleaseId=alpha --npm.tag=alpha --github.preRelease",
    "beta": "release-it preminor --preReleaseId=beta --npm.tag=beta --github.preRelease",
    "release": "release-it"

配置完成之后,就可以根据自己的需求来发布alpha版本,或者beta,release版本了。