yo --generators 查看所有的generators
注意:文件名称一定要和命令行名字一样:例如:mkdir generator-ai-cli,在package.json中的name也要为: generator-ai-cli,不然会报错误:没有这个包
mkdir generator-ai-cli
npm init -y
npm install yeoman-generator --save
mkdir generators/app/index.js
// generators/app/index.js
const Generator = require('yeoman-generator')
module.exports = class extends Generator {
prompting () {
// 命令行交互模式
return this.prompt([
{
type: 'input',
name: 'name',
message: 'Your project name',
default: this.appname
}
])
.then(answers => {
this.answers = answers
})
}
writing () {
// 把每一个文件都通过模板转换到目标路径
/*
const templates = [
'.browserslistrc',
'.editorconfig',
'.env.development',
'.env.production',
'.eslintrc.js',
'.gitignore',
'babel.config.js',
'package.json',
'postcss.config.js',
'README.md',
'public/favicon.ico',
'public/index.html',
'src/App.vue',
'src/main.js',
'src/router.js',
'src/assets/logo.png',
'src/components/HelloWorld.vue',
'src/store/actions.js',
'src/store/getters.js',
'src/store/index.js',
'src/store/mutations.js',
'src/store/state.js',
'src/utils/request.js',
'src/views/About.vue',
'src/views/Home.vue'
]
templates.forEach(item => {
// item => 每个文件路径
this.fs.copyTpl(
this.templatePath(item),
this.destinationPath(item),
this.answers
)
})
*/
// 把每一个文件都通过模板转换到目标路径
const tmplDir = path.join(__dirname, 'templates')
fs.readdir(tmplDir, (err, templates) => {
if (err) throw err
templates.forEach(item => {
// item => 每个文件路径
this.fs.copyTpl(
this.templatePath(item),
this.destinationPath(item),
this.answers
)
})
})
}
}
package.json
{
"name": "generator-ai-cli",
"version": "0.1.0",
"main": "index.js",
"author": "",
"license": "MIT",
"dependencies": {
"yeoman-generator": "^4.0.1"
}
}
generators/app/templates
文件
1.场景:使用plop创建代码模块
必须是用yarn,使用npm好像生成不成功。
module.exports = plop => {
/**
setGenerator参数:
component: 生成器的名字
{}: 生成器的配置
*/
plop.setGenerator('component', {
description: 'create a component',
prompts: [
{
type: 'input', // // 输入方式
name: 'name', // 问题返回值的键
message: 'component name', // 屏幕上给出的提示
default: 'MyComponent', // 问题的默认答案
}
],
actions: [
{
type: 'add', // 代表添加文件
path: 'src/components/{{name}}/{{name}}.js', // 添加文件的具体路径
templateFile: 'plop-templates/component.hbs' // 添加文件的模版文件路径
},
{
type: 'add', // 代表添加文件
path: 'src/components/{{name}}/{{name}}.css',
templateFile: 'plop-templates/component.css.hbs'
},
{
type: 'add', // 代表添加文件
path: 'src/components/{{name}}/{{name}}.test.js',
templateFile: 'plop-templates/component.test.hbs'
}
]
})
}
模版文件:
// plop-templates/component.css.hbs
import React from 'react';
export default () => (
<div className="{{name}}">
<h1>{{name}} Component</h1>
</div>
)
// plop-templates/component.css.hbs
.{{name}} {
}
// plop-templates/component.test.hbs
import React from 'react';
import ReactDOM from 'react-dom';
import {{name}} from './{{name}}';
it('renders without crashing', () => {
const div = document.createElement('div');
ReactDOM.render(<{{name}} />, div);
ReactDOM.unmountComponentAtNode(div);
});