yeoman generator自定义编写

1. 安装node.js、git、yeoman,这里只介绍yeoman

Yeoman其实是三个工具的集合:YO、GRUNT、BOWER,这三个工具是分别独立开发的,但需要配合使用,来实现我们更高效的工作流模式。效率和规范是yeoman的核心诉求。
  YO:Yeoman核心工具,项目工程依赖目录和文件生成工具,项目生产环境和编译环境生成工具。
  GRUNT:grunt去年很火,前端构建工具,jquery就是使用这个工具打包的。
  BOWER:Web开发的包管理器,概念上类似npm,npm专注于nodeJs模块,而bower专注于CSS、JavaScript、图像等前端相关内容的管理。
以下命令一并安装这三个工具:

npm install -g yo grunt-cli bower    //全局安装
yo --version&&grunt --version&&bower --version    //查看是否安装成功
6.png
2. 使用 yo下载一个webapp generator

输入以下命令:

yo
2.png

上下移动选择Install a generator,按回车键表示确认。

4.png

在Search npm for generators:后输入webapp,它会为你找出所有的符合条件的generator模板。这里我选择的是第二个webapp,按回车开始下载webapp generator。

5.png

下载成功后你会发现Run a generator里有了一个Webapp,它安装在全局里,你可以在node模块中找到它。
熟练后也可直接输入以下命令安装generator-webapp

npm install -g generator-webapp

当Install a generator出错时可能是yo、node、npm环境问题。
输入以下命令

yo doctor

它会帮你检测出问题,并提示你如何做出修改,没问题的话如下图所示。

7.png

创建一个项目目录,并cd到该目录,利用webapp generator快速生成一个webapp项目模板

yo webapp

后面会出现一些问答,根据自己的需求进行选择,space键当前选项反选,i键全部选项反选,选择后回车确认便开始下载了。没有出现问题就代表下载成功了,你可以在当前目录看到webapp目录结构。

3.自定义generator

Yeoman 给我们提供了一个用来写脚手架的脚手架 generator-generator,我们可以执行命令下载它。

yo generator-generator

首先创建一个文件夹存放generator,并cd到该目录

yo generator

问答回复如下图,假设我要写一个 Generator 叫做 ys,根据Yeoman 的规定,你需要将这个 node 模块的名字命名为 generator-*,所以我命名为 generator-ys。keywords必须包含“yeoman-generator”。

8.png

回车即开始下载generator模板,下载成功后你可以在当前目录中找到generator-ys文件夹。
我们得到的generator目录
├── generators/
│ └── app/
│ ├── index.js
│ └── templates/
│ └── dummyfile.txt
├── .editorconfig
├── .gitattributes
├── .gitignore
├── .eslintrc
├── .travis.yml
├── .yo-rc.json
├── package.json
├── gulpfile.js
├── README.md
├── LICENSE
└── test/
└── app.js

它并没有全局安装到node模块中,运行以下命令就可以在全局中使用。

cd generator-ys
npm link

进入之前的存放工程目录mypoject

mkdir generator-ys
cd generator-ys
npm init       //帮你生成package.json
bower init     //帮你生成bower.json
9.png
10.png

你也可以进入这两个文件更改这些信息。其中npm里的description必填、keywords必须包含“yeoman-generator”、repository必填(我这里乱填的,先确保不报错)
现在可以开始使用generator-ys这个脚手架了,只是生成的目录里没啥内容。

yo ys
4. 往generator-ys里添加内容
11.png

我们的generator生成什么样的基础工程,目录结构,是否自动安装依赖模块等等都是在index.js文件完成的。可以先浏览下里面内容,然后把里面的内容删掉照着下面步骤来。
(1)继承generator
Yeoman提供基类generator,你可以继承它并实现自己的方法

'use strict';
var Generator = require('yeoman-generator');

module.exports = class extends Generator {
//以下大部分内容将会写在里面
};

(2)构造函数

constructor(args, opts) {
    super(args, opts);
    }

(3)初始化函数

initializing()   {
    this.props = {};      //定义这个后面会用到
    this.log('初始化完成');
  }

(4)promoting块

//promts是问题集合,在调用this.promt使其在运行yo的时候提出来
  prompting() {
    // 拥有一个Yeoman图形欢迎
    this.log(yosay(
      'Welcome to the impressive ' + chalk.red('generator-ys') + ' generator!'
    ));

    //promts是问题集合,在调用this.promt使其在运行yo的时候提出来
  return this.prompt([{
      type    : 'input',
      name    : 'appname',
      message : 'give Your project a name',
      default : this.appname     //appname是内置对象,代表工程名,这里就是ys
    }, {
      type    : 'confirm',
      name    : 'cool',
      message : 'Would you like to enable the Cool feature?'
    },
    {
        type: 'input',
        name: 'projectDesc',
        message: 'Please input project description:'
      },
      {
        type: 'list',
        name: 'projectLicense',
        message: 'Please choose license:',
        choices: ['MIT', 'ISC', 'Apache-2.0', 'AGPL-3.0']
      },
    {
       type    : 'input',
       name    : 'username',
       message : 'What\'s your GitHub username',    //里面的单引号需要转义
       store   : true
     }
    //打印出answers回复内容
    ]).then((answers) => {
      this.log('appname :', answers.appname);
      this.log('cool feature :', answers.cool);
      this.log('username :', answers.username);
      this.log('projectDesc :', answers.projectDesc);
      this.log('projectLicense :', answers.projectLicense);

      //最后将用户输入的数据存在this.props中,以方便后面调用。
      this.props = answers;
    })
  }

(5)default块

defaults () {           //判断工程名同名文件夹是否存在,不存在则自动创建
    if (path.basename(this.destinationPath()) !== this.props.appname) {
      this.log(
        'Your generator must be inside a folder named ' + this.props.appname + '\n' +
        'I\'ll automatically create this folder.'
      );
      //mkdirp是我们引用的模块,用来创建文件夹,此时没有设置项目根目录,则在当前目录创建
      mkdirp(this.props.appname);
      //this.destinationRoot则是设置要创建的工程的根目录为工程名文件夹。
      this.destinationRoot(this.destinationPath(this.props.appname));
    }
  }

(6)write
先在templates下创建文件夹public,在public下添加index.html和index.js文件(后面会用到)

17.png
writing() {
//在根目录下创建这些文件夹
       mkdirp('lib/3');
       mkdirp('lib/2');
       mkdirp('lib/1');
       mkdirp('public');
       mkdirp('src');

//复制templates目录中的index.html、index.js到目标目录(先在templates里创建这两个文件)
    this.fs.copy(
      this.templatePath('public/index.html'),
      // returns './templates/public/index.html'
      this.destinationPath('public/index.html'),
      { title: '首页' }   //index.html中绑定了title,html标题设为“首页”
    ),

    this.fs.copy(
      this.templatePath('public/index.js'),
      // returns './templates/public/index.js'
      this.destinationPath('public/index.js')
    );
  }

(7)install

install() {
  //使用npm安装依赖lodash和jquery
    this.npmInstall(['lodash'], { 'save-dev': true });
    this.npmInstall(['jquery'], { 'save-dev': true });
  }
  };

到这里一个有内容的generator创建出来了
在工程目录下运行

yo ys

初始化函数调用与Yeoman图形欢迎

13.png

promoting块问答阶段

14.png

创建文件复制文件阶段

15.png

安装依赖

16.png

到此项目生成完成了,你可以进入当前目录查看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容