(略)在关注编辑支持和客户端模型的创建之前,我们先看为模板项目进行代码生成。这是我们目标的一个基础的需求,我们想使用现有的 EMF code generator。所以在 che 里面复用已有的 Eclipse 架构是可行的吗?
让我们快速的看一哈 EMF 代码生成器如何被触发。默认的方式是利用 Eclipse IDE 里的 UI。除此之外,EMF 提供就一个 Java API 来运行代码生成。这听上去很吸引人,因为 Che 的 server 构件也是用 java 编写的。也就是说我们可以为 Che 的 server 写一个封装的功能:由 Che 的浏览器 IDE 触发并调用 EMF 的 API 来生成代码。但,等一下,EMF 是被设计运行在 OSGi 运行时环境的。此话,他使用了一些扩展点(如注册表打包)。虽然用 Java 可以直接调用 EMF 的代码生成器,但我们需要手动将这些东西连接起来。在这种场景下,在没有 OSGi 的情况下设置类的路径就像噩梦。另一个坏处是我们可能需要在我们的服务器端配置 EMF 库,这会使更新变得繁琐。
幸运的是,有一个很简单的方式来整合现有的代码生成器。Eclipse 的桌面 IDE 提供了一个在命令行执行的无头应用程序。用如下的指令,你可以为 make it happen 样例生成代码。
$ /eclipse/eclipse \
-noSplash \ # do not show the eclipse splash screen
-data /path/to/data/dir \ # the path to be our current project
-application org.eclipse.emf.codegen.ecore.Generator \ # the application id to execute
-model \ # generate EMF model classes
-edit \ # generate EMF edit bundle
/path/to/modelname.genmodel # the path to the genmodel file
那么我们如何将这一段代码整合进 Che 里面?好消息是我们可以直接把 Eclipse 部署到一个工作空间里。Che 里的工作空间不仅仅是托管代码的目录。它同样也是一个 docker 的容器并包含一些工具。因此如果我们将一个 Eclipse Modeling Tools Edition 安装进我们的工作空间。我们就能用命令行调用 EMF 的 API 生成代码。
首先,我们需要在 Che 的工作空间容器中安装 Eclipse。作为一个基于 Linux image 的容器,我们可以直接用 shell 去下载和提取最新的 Eclipse Modeling Tools。下载链接可以由官网下载(复制 Linux 32/64 bit 的链接)。如果界面里没有 shell 的话,点击低端的 terminal 即可打开,实际的 shell 指令如下:
$ sudo su # gain super user privileges (become root)
$ cd / # switch to the root directory
$ wget ${Download Link} -o eclipse.tar.gz # download eclipse
$ tar xfv eclipse.tar.gz # extract the downloaded tar.gz file
然后你就可以用下面的命令行出发 EMF code generator 了。
$ /eclipse/eclipse \
-noSplash \
-data /projects/makeithappen \
-application org.eclipse.emf.codegen.ecore.Generator \
-model \
-edit \
/projects/makeithappen/org.eclipse.emf.ecp.makeithappen.model/model/task.genmodel
下一张截图展现了代码生成器在 shell 里打印的 log。我们然后就可以在 IDE 打开被生成的代码。这就意味着,我们成功在 che 里面复用了 EMF 的代码生成器!
现在,我们完成了从命令行启动 code generator。让我们为用户提供更便利的方式,而不是来自己输入这些复杂的指令。我们想要使得这个代码生成的过程只需由一个点击触发。Che 允许我们自己定义一个‘custom command’。点击右上角的下拉菜单选择 Edit commands。
然后点击 ’+’,然后点 Custom,如图所示填好右边的内容。你就可以看到 Che 里面多了这个指令(刚刚的右上角位置)。然鹅,最后一部分 ganmodel 的路径还是静态的,
现在,我们就可以用一个 click 为一个模板项目生成代码了。我们复用了现有的 EMF code generator,也没有写过一行代码。但是,存在很多开放的问题需要提升。比如,我们只可以为固定的项目生成代码,我们仍然是在指定的模板上修改,无法真正改变模型。这些问题都需要我们进一步优化,之后我们还会涉及。现在下一部分的内容,我们先关注如何创建一个 custom stack 是的我们的这一部分内容可复用。这个目的是使得我们这个下载了 Eclipse 实例的定义了自定义指令的工作关键可以从 scratch 获取。请期待~