假设我已经有一些由生成器生成的文件,并且想要创建一些子生成器,这些子生成器根据某些内容的模板将内容插入到这些文件中。
目标是创建一个由3层组成的多层体系结构的生成器(对于用typescript编写的Angular2应用程序):
对于每一层,主生成器必须生成组成它的所有文件:模块文件,interfaces文件,...在此过程中生成的主要3个文件如下所示:
hero.applicatif.ts :
import { Injectable } from '@angular/core';
import { IHeroApplicatif } from './hero.applicatif.interface';
import { HeroMetier } from '../metier/hero.metier';
@Injectable()
export class HeroApplicatif implements IHeroApplicatif {
constructor(private heroMetier: HeroMetier) {}
}
hero.metier.ts :
import { Injectable } from '@angular/core';
import { IHeroMetier } from './hero.metier.interface';
import { HeroBusinessDelegate } from '../business-delegate/hero.business-delegate';
@Injectable()
export class HeroMetier implements IHeroMetier {
constructor(private heroBusinessDelegate: HeroBusinessDelegate) {}
}
hero.business-delegate.ts :
import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { IHeroBusinessDelegate } from './hero.business-delegate.interface';
@Injectable()
export class HeroBusinessDelegate implements IHeroBusinessDelegate {
constructor(private http: Http) {}
}
基于模板生成这些文件不会造成问题。但是我希望子生成器提示用户输入方法名称,它是返回类型和参数,因此子生成器必须修改每个先前生成的文件以插入代码,默认情况下,每个层都将调用传递给下一层。
假设子生成器已提示用户输入名为getHero的方法,则必须修改3个文件的内容,如下所示:
hero.applicatif.ts :
import { Injectable } from '@angular/core';
import { IHeroApplicatif } from './hero.applicatif.interface';
import { HeroMetier } from '../metier/hero.metier';
@Injectable()
export class HeroApplicatif implements IHeroApplicatif {
constructor(private heroMetier: HeroMetier) {}
getHero(id:number): Promise<any> {
return this.heroMetier.getHero(id);
}
}
hero.metier.ts :
import { Injectable } from '@angular/core';
import { IHeroMetier } from './hero.metier.interface';
import { HeroBusinessDelegate } from '../business-delegate/hero.business-delegate';
@Injectable()
export class HeroMetier implements IHeroMetier {
constructor(private heroBusinessDelegate: HeroBusinessDelegate) {}
getHero(id:number): Promise<any> {
return this.heroBusinessDelegate.getHero(id);
}
}
hero.business-delegate.ts :
import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { IHeroBusinessDelegate } from './hero.business-delegate.interface';
@Injectable()
export class HeroBusinessDelegate implements IHeroBusinessDelegate {
constructor(private http: Http) {}
getHero(id:number): Promise<any> {
return this.http.get(...).toPromise();
}
}
最简单,最安全,最新的方式是什么?
答案 0 :(得分:2)
要以安全的方式编辑代码文件内容,不会弄乱最终用户的未预测更改,最安全的方法是修改文件Abstract Syntax Tree。
Node有多个AST解析器可用。最受欢迎的两个是Esprima和Acorn。在这些解析器上还有一些工具可以更容易地修改AST。
如果您想查看https://github.com/SBoudrias/AST-query,我会在前一段时间内编写这样的工具 - 它可能适用于您的用例。