(略)在关注编辑支持和客户端模型的创建之前,我们先看为模板项目进行代码生成。这是我们目标的一个基础的需求,我们想使用现有的 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获取。请期待~