首页 > 代码库 > 编写自己的yeoman generator
编写自己的yeoman generator
在构建前端项目时,使用yeoman generator可以帮助我们完成新建文件、安装模块、类库等重复性操作,然而已有的generator有时并不能满足需求,所以可以利用yeoman 的API来构建自己的生成器。
这里介绍自定义generator的大致步骤。
1. $ npm install -g generator-generator
2. $ yo generator
输入你的github用户名、生成器的名字(注意命名,yoeman会为你输入的名字添加前缀generator)
看一下生成的文件目录结构:
3. 编写generator
我们需要编写的文件主要是 app/index.js ,看下index文件的内容:
'use strict'; var util = require('util'); ... var MygeneratorGenerator = yeoman.generators.Base.extend({ init: function () { // 初始化模块 ... }, askFor: function () { ... }, app: function () { ... }, projectfiles: function () { ... } }); module.exports = MygeneratorGenerator;
这里省略了函数体,这样可以清楚的看到文件结构。
编写这个index.js时有几处需要注意的地方:
* module.exports
* 继承 yeoman.generators.Base
* 执行yo mygenerator 时模块中的所有方法会依次执行(即 init(), aksFor(), app(), projectfiles()顺次),如果需要加入私有方法(供其他方法调用)有多种方式,个人感觉比较方便的是直接在方法名之前添加下划线,如
_protectedMethod: function() { console.log('This is a protected function.'); }
还是以一个简单的示例介绍几个基本的API。示例generator实现的效果:生成一个配置好gulp的livereload功能的项目。
index.js文件完整代码
'use strict'; var util = require('util'); var path = require('path'); var yeoman = require('yeoman-generator'); var yosay = require('yosay'); var chalk = require('chalk'); var MygeneratorGenerator = yeoman.generators.Base.extend({ init: function () { this.pkg = require('../package.json'); this.on('end', function () { if (!this.options['skip-install']) { this.installDependencies(); } }); }, askFor: function () { var done = this.async(); // 建议使用this.log() 而不是console.log, 因为在非命令行环境下console.log()不会显示 this.log(yosay('Hi Keith, this is a new generator!')); var prompts = [{ type: 'confirm', name: 'someOption', message: 'Hello boy, would you like to enable this option?', default: true }]; this.prompt(prompts, function (props) { this.someOption = props.someOption; done(); }.bind(this)); }, app: function () { //创建目录 this.mkdir('app'); this.mkdir('app/templates'); // this.copy() 第一个参数为源文件名,默认目录为app/templates, 第二个参数为目标文件 this.copy('index.html', 'app/index.html'); this.copy('_package.json', 'package.json'); this.copy('_bower.json', 'bower.json'); }, gulp: function() { var done = this.async(); // 安装gulp模块, this.npmInstall()会解决模块安装问题,对同一模块只安装一次 this.npmInstall(['gulp', 'gulp-connect'], { 'saveDev': true }, done); this.template('gulpfile.js'); }, projectfiles: function () { this.copy('editorconfig', '.editorconfig'); this.copy('jshintrc', '.jshintrc'); } }); module.exports = MygeneratorGenerator;
index.js中的app方法中执行了copy函数,所以我们要在相应的目录(app/templates)下建立所需源文件,在app/templates 新建index.html。
index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello yeoman</title> </head> <body> <h1>Hello World</h1> <h2> This is my own yeoman generator!</h2> </body> </html>
在index.js中的gulp方法中还使用到了this.template方法,同样需要在app/templates目录下建立一个模板文件 gulpfils.js
gulpfile.js(这里对文件内容不做详细介绍)
'use strict'; var gulp = require('gulp'), connect = require('gulp-connect'); gulp.task('default', ['clean'], function () { gulp.start('start'); }); gulp.task('server', function() { connect.server({ root: 'app', livereload: true }); gulp.watch(['app/*.html'], ['html']); }); gulp.task('html', function() { gulp.src('app/*.html') .pipe(connect.reload()); }); gulp.task('start', function() { console.log('This is default task, Developing...'); }); gulp.task('clean', function() { console.log('cleaning...'); });
此时,一个基本的generator就已经编写完毕。
4. 使用generator
写好generator后可以将它发布到npm中,这里先在本地使用,在generator根目录下执行
$ npm link
接下来就和使用其他yeoman generator一样了,在任意工作目录下执行
$ yo mygenerator
等待安装完毕,cd到新建项目的根目录下,使用livereload功能(修改html文件保存后浏览器自动刷新),执行
$ gulp server
访问 http://localhost:8080即可
到此一个基本的generator构建加使用过程就已经结束,关于自定义generator的更多API请参考官方文档http://yeoman.github.io/generator/
构建generator官方教程http://yeoman.io/authoring/getting-started.html
编写自己的yeoman generator