Рассмотрим у вас есть генератор generator-blog
(BlogGenerator) с двумя суб-генераторов (блог-сервера и блог-клиент):
app\index.js
client\index.js
server\index.js
Так что, когда вы запускаете yo blog
вы что спросить пользователя для некоторых вариантов и (необязательно) подгенераторы, правильно?
Для запуска подкаталога необходимо набрать this.invoke("generator_namespace", {options: {}})
. Второй аргумент, который мы передали, может иметь поле options
- это объект объектов, который будет передан генератору.
В App \ index.js:
BlogGenerator.prototype.askFor = function askFor() {
var cb = this.async();
// have Yeoman greet the user.
console.log(this.yeoman);
var prompts = [{
name: 'appName',
message: 'Enter your app name',
default: 'MyBlog'
}, {
type: 'confirm',
name: 'createServer',
message: 'Would you like to create server project?',
default: true
}, {
type: 'confirm',
name: 'createClient',
message: 'Whould you like to create client project?',
default: true
}];
this.prompt(prompts, function (props) {
this.appName = props.appName;
this.createServer = props.createServer;
this.createClient = props.createClient;
cb();
}.bind(this));
}
BlogGenerator.prototype.main = function app() {
if (this.createClient) {
// Here: we'are calling the nested generator (via 'invoke' with options)
this.invoke("blog:client", {options: {nested: true, appName: this.appName}});
}
if (this.createServer) {
this.invoke("blog:server", {options: {nested: true, appName: this.appName}});
}
};
В клиентском \ index.js:
var BlogGenerator = module.exports = function BlogGenerator(args, options, config) {
var that = this;
yeoman.Base.apply(this, arguments);
// in this.options we have the object passed to 'invoke' in app/index.js:
this.appName = that.options.appName;
this.nested = that.options.nested;
};
BlogGenerator .prototype.askFor = function askFor() {
var cb = this.async();
if (!this.options.nested) {
console.log(this.yeoman);
}
}
UPDATE 2015-12-21:
Использования invoke
осуждается сейчас и должен заменить на composeWith
. Но это не так просто, как могло бы быть. Основное различие между invoke
и composeWith
заключается в том, что теперь у вас нет возможности контролировать подгенераторы. Вы можете только объявить их использование.
Вот как main
метод сверху должен выглядеть следующим образом:
BlogGenerator.prototype.main = function app() {
if (this.createClient) {
this.composeWith("blog:client", {
options: {
nested: true,
appName: this.appName
}
}, {
local: require.resolve("./../client")
});
}
if (this.createServer) {
this.composeWith("blog:server", {
options: {
nested: true,
appName: this.appName
}
}, {
local: require.resolve("./../server")
});
}
};
Также я извлекал заменил yeoman.generators.Base
с yeoman.Base
.
** Точно, что я искал. Благодарю. – Fiona
Я знаю, что это старо, но это близко к тому, что я ищу. Моя проблема в том, что мой подгенератор расширяет «yeoman.generators.NamedBase». Когда я запускаю этот код, я получаю «Ошибка: не предоставлял требуемое имя аргумента!» Я пытаюсь выяснить, как передать имя (т. Е. «Тест» в «yo make: controller test») на подгенераторы, вызываемые .invoke(). Любая помощь? – ItJustWerks
Получил это: this.invoke ("make: controller", {options: {nested: true, ...}, args: [this.name]}); – ItJustWerks