我目前正在研究Xtext,以创建可重用的DSL和在DSL上构建的构件。
简化的项目布局如下:
projectA:包含基于Xtext的DSL,功能项目,updatesite等。
projectB:使用projectA中的工件生成代码。
projectC:使用从projectB生成的代码
使用Maven和Xtext构建projectA没问题(网络上已经有几个示例),但是我不知道如何在projectB内使用projectA中的DSL并释放生成的代码以供projectC使用。教程,文档以及我能找到的每个示例都在使用从projectA生成的Eclipse插件在projectB中生成代码。尽管这可以正常工作,但我想知道如何重用生成的代码。
是否可以仅将来自projectA的代码生成器与Maven或类似的东西一起使用?我应该如何在连续集成服务器中使用DSL?我是否为此无头运行了Eclipse?
在我看来,我缺少明显的东西。因此,欢迎您提供任何指针,提示,示例!
最佳答案
可以使用Fornax MWE运行程序从Xtext生成代码(不幸的是,在Maven Central中不可用,但是在http://www.fornax-platform.org/m2/repository中可用)。
我们基于基于Tycho的编译在EMF-IncQuery(corresponding pom file)中使用此方法
1.配置clean插件以清空src-gen和xtend-gen文件夹(来自所有相关项目,例如core,test和ui项目)
2.使用Fornax插件执行MWE2工作流程
3.执行Xtend编译器(某些代码作为Xtend类生成)
其他(主要是存储库和Xtend编译器版本)配置已添加到我们构建的parent pom中。
更新:回答了错误的问题;抱歉。尝试不同的答案。
首先,您必须以在无头环境中可集成的方式来实现语言/编译器(请参阅xtend-maven-compiler的打包方式)。
您的语法已经有一个生成器(实现IGenerator接口),用于接收模型和用于文件创建的辅助类。如果使用Xbase语法,则此生成器由Xtext实现,否则您应该已经实现了它。
然后,您可以提供一个利用此生成器的附加项目,从而能够生成此类代码。基本上,使用您的语言StandaloneSetup / headless注入器来获取IGenerator实例(在新项目中),并添加一个根据您的构建参数化的新FileSystemAccess实例。
然后,您的项目应引用原始项目-例如它也可以是一个插件项目,使用Tycho进行构建,然后将其用作基于jar的编译器;或者您可以创建一个纯Maven插件,但在这种情况下,您可能需要手动选择Xtext所需的可传递依赖项。
如果使用xtend-maven-compiler插件,则可以通过将所有依赖项复制到单个jar文件中来创建“ uberjar”来解决此问题,然后再进行引用。丑陋,但是行得通。