LoginSignup
0
1

More than 5 years have passed since last update.

Yeomanってどう?その2

Posted at

Yeomanってどう?

  • Generatorって自由に使えるの?
  • yeoman-environmentを使うらしい。
  • でも、よくわからない......
  • あと、TestAdapterとかあるらしい。

yeoman-environmentの使い方

こうすると、なんとなく動く。

var yeoman = require('yeoman-environment');
var adapter = require('yeoman-test/lib/adapter');

function yo(name, args, opts, answers, callback) {
  // 初期化。args?opts?知らない......
  var env = yeoman.createEnv(args, opts, new adapter.TestAdapter(answers));
  // generatorを探してくる
  env.lookup(function () {
    // 呼び出す。
    env.run(name, {'skip-install': true}, callback);
  });
}
yo('node:readme');

自前のgeneratorを登録するには

var yeoman = require('yeoman-environment');
var adapter = require('yeoman-test/lib/adapter');
var path = require('path');

function yo(name, generator, answers, opts) {
  // 初期化。opts?未調査......
  var env = yeoman.createEnv(name, opts, new adapter.TestAdapter(answers));
  // 自前のgeneratorを登録。nameは、xxx:xxxじゃなくても大丈夫なはず。
  env.register(generator, name);
  // 呼び出す。
  env.run(function () {
    console.log();
  });
}

yo('test', 'generator.js'), answers);

自前のgeneratorの作り方

ディレクトリ構成
generator.js     // 任意の名前
templates/       // 固定。this.templatePathで取得可能。
  _template.js   // 任意の名前
generator.js
var yeoman = require('yeoman-generator');

module.exports = yeoman.Base.extend({
  prompting: function () {
    var prompts = [{
      type: 'confirm',
      name: 'someAnswer',
      message: 'Would you like to enable this option?',
      default: true
    }, {
      name: 'moduleName',
      message: 'input moduleName',
      default: 'newName',
    }];

    return this.prompt(prompts).then(function (props) {
      this.props = props;
    }.bind(this));
  },

  writing: function () {
    this.fs.copyTpl(
      this.templatePath('_template.js'),
      this.destinationPath(this.props.moduleName + '.js'),
      this.props
    );
  },
});
answers
{
  someAnswer: true,
  moduleName: 'test', 
}

問題点

  • とりあえず、自動ではできそう。
  • validateを書いて失敗すると固まったりする?エラーになってくれないのかな?
  • promptsを取るというか、answersのキー名の取得が大変。promptを差し込めば行けそうだけど。タイミングがあるのかな?

改善点

  • generator.promptingをpromptsとdoneに分ける。(doneは、内部で勝手に持てば要らないか。)
  • writingも、copyTpl固定にすれば、source/destだけで行ける。
  • でも、propsがそのまま、writingに行けるとは限らない。→doneで良しなに変換することができればOKか。

まとめ

なんか、軽いラッパを作れば、yeomanが使いやすいものにできそう。
よし、先が見えた気がする。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1