脚手架的地址:rumnet。
目前该脚手架只支持dumi、umi模版。
1、创建项目
创建一个文件夹,进入文件夹,使用npm i
,来初始化项目,会生成一个package.json文件。
其中字段含义为:
- name: 脚手架的名称
- version:脚手架的版本
- description:脚手架的描述。这个描述在发版之后,会出现在npm仓库中脚手架的下方。
- 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版本了。