1

我目前正在研究 Xtext 以创建可重用的 DSL 和基于 DSL 构建的工件。简化的项目布局如下:

  • projectA:包含基于 Xtext 的 DSL、feature-project、updatesite 等。
  • projectB:使用 projectA 中的工件生成代码。
  • projectC:使用从 projectB 生成的代码

使用 Maven 和 Xtext 构建 projectA 不是问题(网上已经有几个示例),但我不知道如何在 projectB 中使用来自 projectA 的 DSL 并将生成的代码发布到 projectC 中使用。教程、文档和我能找到的每个示例都使用从 projectA 生成的 Eclipse 插件在 projectB 中生成代码。虽然这很好用,但我想知道如何重用生成的代码。

是否可以仅将 projectA 中的代码生成器与 Maven 或类似的东西一起使用?我应该如何在持续集成服务器中使用 DSL?我是否为此无头运行 Eclipse?

在我看来,我错过了一些明显的东西。因此,欢迎任何指针、提示、示例!

4

1 回答 1

0

可以使用 Fornax MWE 运行器从 Xtext 生成代码(遗憾的是在 Maven Central 中不可用,但在http://www.fornax-platform.org/m2/repository中可用)。

我们在基于 Tycho 编译的 EMF-IncQuery(相应的 pom 文件)中使用这种方法

1. 配置 clean 插件清空 src-gen 和 xtend-gen 文件夹(来自所有相关项目,例如 core、test 和 ui 项目) 2. 使用 Fornax 插件执行 MWE2 工作流 3. 执行 Xtend 编译器(一些代码作为 Xtend 类生成)

其他(主要是存储库和 Xtend 编译器版本)配置被添加到我们构建的父 pom中。

更新:回答了一个错误的问题;对不起。尝试不同的答案。

首先,您必须以可在无头环境中集成的方式实现您的语言/编译器(请参阅 xtend-maven-compiler 的打包方式)。

您的语法已经有一个接收模型的生成器(实现IGenerator接口)和一个用于文件创建的帮助器类。在使用 Xbase 语法的情况下,这个生成器是由 Xtext 实现的,否则你应该已经实现了它。

然后您可以提供一个使用此生成器的附加项目,从而能够生成此类代码。基本上,使用您的语言 StandaloneSetup/headless injector 来获取 IGenerator 实例(在新项目中),并添加一个根据您的构建参数化的新 FileSystemAccess 实例。

然后你的项目应该引用原始项目——例如它也可以是一个插件项目,用 Tycho 构建它,然后将它用作基于 jar 的编译器;或者您可以创建一个纯 Maven 插件,但在这种情况下,您可能需要手动选择 Xtext 所需的传递依赖项。

在 xtend-maven-compiler 插件的情况下,可以通过将所有依赖项复制到单个 jar 文件中来创建一个“uberjar”来解决这个问题,然后引用它。丑陋,但它的工作原理。

于 2013-09-04T11:52:09.740 回答