-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
egg-init improve #379
Comments
发个脑洞, boilerplate 的写法: class Boilerplate {
getDependencies() {
return [ 'egg-boilerplate-empty' ];
}
getQuestions() {
return {
name: {
desc: 'project name',
},
};
}
}
class SimpleBoilerplate extends Boilerplate {
// install this first
getDependencies() {
return super.getDependencies().concat('egg-boilerplate-abc');
}
getQuestions() {
return Object.assign({}, super.getQuestions(), {
author: {
desc: 'project author',
},
});
}
replaceTemplateHook(tpl, answers) {
}
getUsage(){
}
}; 但这样做会不会太复杂了? 做到后面感觉跟 yo 差不多了, cc @popomore |
plop 还没细看, 不过似乎它的理念是跟随项目的, 不太符合
|
这是要做一个自动生成router,controller,view,helper,service的工具吗? |
主要需求是:
|
其他都可以不变,就用 plop 做个底层模版吧,他的 API 可以拷贝文件和渲染模版。 初始化要做的两件事情
|
@popomore 这些 API 是给到 boilerplate 那边做定制使用的吧? |
@atian25 是的,这样具体使用什么工具来转换内容是不用管的。egg-init 主要还是把具体初始化化的工具做好
|
还需要: 然后你提到第一点这个也是正在考虑的,如果要做 sub generator 的话,模板肯定要有本地缓存,否则太慢。 如果但判断模板是否更新了,有点问题,因为需要判断模板的依赖有没有更新, 这里还没想好怎么判断,初步想法就是缓存一天就好了,仅能保证当天内第N次的速度,命中率不高。 第三点,目前 tnpm 的提示方式足够么?进一步的自己更新自己内核这个不知道会不会有权限问题。 |
感觉这个做依赖很麻烦,还是不要支持了 |
目前还有一个痛点,如何更新 依赖的那个回头做的时候再看看 plug 有没有支持 sub generator 的方式直接调用。 |
昨天思考了下这块,几点考虑:
$ egg-init init [dir] --type=simple
$ egg-init add service user
$ # if not exist `news` controller, create it, then add `list` action, then add router
$ egg-init add controller news.list --style=class --router=/news/list --method=get 待讨论:
// egg-init init [dir] --type=simple
// egg-init add controller <name> --style=class
// egg-init add <type> <name>
class EggInitCommand extends Command {
* run({ argv, cwd }) {
const dir = argv.dir;
let boilerplateName = argv.type;
let action;
// 如果目标目录不存在,则视为初始化行为
if (!fs.existSync(dir)) {
// 安装 boilerplate
this.npmInstall(boilerplateName, dir);
action = 'init';
} else {
// 从 pkg 读取当前应用使用的骨架
boilerplateName = this.getPkgInfo(dir, 'boilerplate.name');
// egg-init add <type> <name>
action = argv._[0];
}
// 执行 boilerplate
const boilerplate = require(path.join(dir, 'node_modules', boilerplateName));
yield boilerplate.run({ action, argv, cwd } );
}
}
class EggBoilperlate {
addRouter() {}
addController() {}
addPlugin() {}
addHelper() {}
addService() {}
addMiddleware() {}
addConfig() {}
addDependency() {}
* run({ action, argv, cwd }) {
switch(action) {
case 'init':
yield this.init();
break;
case 'add':
const type = argv._[0];
const method = `add${type}`;
yield this[method];
break;
default:
this.onAction();
}
}
}
class SimpleBoilperlate extends EggBoilperlate {
addController() {
super.addController();
// do sth else, such as mount to RPC and HTTP router
}
} |
|
嗯,上面只是大概的思路,方向没啥问题的话,我就写详细的 RFC 下。
|
Egg-init 只提供功能,不做具体初始化工作,所以应该没有默认的,都是每个脚手架自己实现的 |
嗯,
默认的行为还是需要有的,大部分 boilerplate 都不需要提供 |
嗯,那是基类的功能,不是 egg-init 的 |
命令方面,再讨论下:
|
保留 其他可以将命令行映射到类方法,比如 |
嗯,不做自动映射了,子类自己搞: 那 * run({ action, argv, cwd }) {
switch(action) {
case 'init':
yield this.init();
break;
case 'add':
const type = argv._[0];
const method = `add${type}`;
yield this[method];
break;
default:
this.onAction();
}
} |
我认为脚手架应该有更新功能,不只是脚手架本身可以更新,脚手架还得支持更新生成的代码,比如 egg 的脚手架,egg 升级到了 2.0 那在 1.0 的代码下执行会提示是否升级到 2.0。 脚手架更新机制脚手架工具和脚手架应该是解耦合的,脚手架工具只提供功能,而脚手架提供模版和初始化代码,这个和 yeoman 一样。但是 yeoman 将脚手架视为 npm 模块,只负责查找不管更新。应该每次执行都看下版本更新,始终使用最新的。
脚手架 API脚手架应该能用完善的 API,支持
脚手架版本化脚手架应该支持多版本,并且使用 --upgrade 可以升级 |
@atian25 我会脱离 egg 社区做一个脚手架的工具,这个可以先放放,专心做 egg-script |
从这篇介绍 vue cli 的文章里面看到 metalsmith 貌似挺有意思的。 |
@popomore https://github.com/sapegin/mrm 这个有意思 看了下 https://github.com/sapegin/mrm-core 源码感觉一般,回头我们自己实现也问题不大。 |
先关掉了,后续如果再有想法再新开 issue 跟进吧 |
http://yeoman.io/(too complex)The text was updated successfully, but these errors were encountered: