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が使いやすいものにできそう。
よし、先が見えた気がする。