JetBrains MPS是我们选择的工具,用于针对非开发人员构建针对特定领域的语言

MPS是一个不错的选择,但是在多个项目中,我们遇到了需要研究答案的特定问题。

在本文中,我们将看到如何使用Modelix将MPS模型存储到数据库中,从而通过一种非常简单的方法使多个用户通过使用相同的模型进行协作来解决这些问题之一。

我们还将讨论有关如何进一步改进DSL编辑器并使它们对我们的用户越来越容易使用的想法。

MPS的优点

MPS之所以出色,是因为:

  • 它允许非常快速地原型化DSL 。 通过这种方式,我们与客户讨论,并很快进行实验。 我们可以构建一些东西,他们可以尝试并在迭代过程中不断提供反馈
  • 它支持多种表示法:文本,表格,图形等。 这使DSL更易于使用,因为许多专业人员习惯使用非文本符号
  • 它具有构建高级语言和编辑器的所有必要功能:类型系统,约束等,通过这种方式,我们可以构建有效支持用户的编辑器
  • 这是一个丰富的环境,可用来构建出色的集成工具:解释器,模拟器,调试器,文档生成器等。以我们的经验,围绕DSL构建的工具对提高生产率起了重要作用。
  • 它允许在不破坏现有代码的情况下发展语言。 这一点非常重要,因为DSL总是以增量方式进行设计和演进

我们的客户对MPS不满意的地方

但是,某些客户正在寻找针对这些特定问题的解决方案:

  • 环境的UI看起来太复杂了。 尽管可以对其进行自定义并使用精致的UI来构建环境,但通常,使用MPS构建的IDE看起来像……具有大量菜单,高级项目面板等的IDE。 虽然为我们的DSL构建的编辑器看起来容易理解和简单,但是有时用户会对编辑器周围的环境感到恐惧,这就是我们所说的IDE-shell
  • MPS编辑器是桌面应用程序,而不是Web应用程序。 这意味着必须在用户的计算机上安装和更新编辑器。 虽然我们可以设置插件存储库,从而限制了使这些系统保持最新状态的成本,但是,当我们要迁移到新版本的MPS时,仍然需要进行新安装。 这也意味着内置MPS的编辑器无法与Web应用程序集成在一起。
  • MPS模型存储在文件中。 在我们从事的所有项目中,都有多个人在同一个项目上进行协作。 我们绝对不希望人们来回传递文件​​。 同样,将这些文件存储在Dropbox文件夹(或类似文件)上也不理想,并且会导致冲突。 因此,为了使这些文件保持同步,我们通常使用git。 现在,git很难学习,并且对于大多数专业人士来说都是令人困惑的。 因此,真的很受欢迎。 我们将在本文中看到一个。

我们如何在DSL开发中推动发展?

我们认为,所有这些问题的解决方案都可以来自Modelix项目,也可以与从Strumenta开始的项目(即MPSServerWebEditKit )一起使用。

这些项目是什么?

  • Modelix是由Itemis的SaschaLißon启动的项目。 该项目旨在实现由MarkusVölter推动的Active Repository的构想。 阅读本白皮书,您可以找到有关它的更多信息。 除其他外,该项目允许将MPS模型存储到数据库中。 我们将在本文中利用它。 请注意,虽然我为该项目做出了贡献,并计划在将来继续做出贡献,但其架构和艰苦的概念性工作都是由Sascha提供的。 作为一个社区,我认为我们应该非常感谢他,Itemis和Markus将其作为开源发布
  • MPSServer是MPS的插件,可从MPS启动Web服务器。 它可用于通过HTTP调用和Websocket访问MPS的所有功能。 这对于读取和修改模型很有用,但对于获取有关错误,触发意图,验证约束,计算类型等的信息也很有用。 这个项目已经在Strumenta开始,但是得到了SergejKoščejev的重要贡献
  • WebEditKit是一个框架,用于为使用MPS开发的语言构建网络投影编辑器。 确实可以与MPSServer结合使用。 借助WebEditKit,可以定义调用MPSServer的编辑器,以获取所需信息并发回用户执行的更改。 至于MPSServer,该项目已在Strumenta启动,但得到了SergejKoščejev的重要贡献。

这三个项目都是开源的,可以在GitHub上获得。

可以实现什么 使用的项目
在桌面上使用MPS,将模型保存在数据库中型号
在浏览器中使用MPS,将模型保存在git上MPSServer + WebEditKit
在浏览器中使用MPS,将模型保存在数据库中 Modelix + MPSServer + WebEditKit

在本文中,我们将了解如何在MPS中使用Modelix将模型保存到数据库中。 这样,用户不需要学习如何使用git,而是可以使用直观的界面来支持版本控制。

另一方面,我们已经在使用MPSServer和WebEditKit为我们的客户构建基于Web的编辑器。 这样,用户无需在自己的计算机上安装MPS,就可以并发工作,并且可以获得简单的界面,因为没有IDE shell。 他们还可以集成我们在更大的Web应用程序中构建的编辑器。

因此,自然而然的下一步是将所有这些项目组合在一起,以使用基于Web的MPS语言构建编辑器,并将它们存储在数据库中。 这应该可以解决我们客户面临的所有主要问题。

如果要查看MPSServer和WebEditKit的外观,可以查看此演示。 它不是最新的,但它应该给您一个想法:

如何在数据库上存储MPS模型

现在,我们将看到一个分步教程,以:

  • 创建一种简单的语言来定义流程
  • 创建一个modelix-server,配置它以使用Postgres数据库存储模型
  • 使用MPS内的modelix-server处理我们的模型,并由modelix-server将其无缝保存在数据库中

与往常一样,代码可在GitHub上找到: https : //github.com/Strumenta/processes-modelix-demo

定义语言

我们将要定义的语言只是一种玩具。 我们可以使用它来定义简单的过程。

在下面的视频中,我演示了如何定义语言以及如何使用它指定撰写文章的过程。

您也可以从GitHub存储库中获取语言。

您应该注意,本教程使用的是MPS 2020.1.1。 您可以从这里获取它: https : //www.jetbrains.com/mps/download

建立资料库

Modelix可以将我们的模型存储在GCloud上托管的kubernetes集群上,以确保我们有多个节点托管我们的模型并且它们保持同步。 如果您想在大中型组织的生产中使用我们的语言,我们应该这样做。

但是,Modelix还支持使用简单的Postgres数据库,这非常适合我们的需求。 您可以根据需要获取Postgres数据库:使用已安装的Postgres安装,使用某些云服务等在本地运行它。

如果您只想试用Modelix,并且想要快速获取Postgres数据库,则可以使用Elephantsql.com 。 它提供托管的Postgres数据库,并且有免费计划。

您可以注册并很快获得免费的数据库:

在MPS中安装Modelix

我们总是安装gradle包装器。 为此,您将需要在计算机上安装gradle。

然后,我们运行:

可以实现什么

至此,我们创建了build.gradle文件。 我们将添加说明以下载modelix。

可以实现什么

此时,您可以运行:

可以实现什么

现在,您应该有一个名为artifacts的目录。 它应该包含三个子目录:

  • de.itemis.mps.extensions
  • org.modelix.common
  • org.modelix.model

现在,我们应该在MPS项目中指定要使用这些目录作为库。

请注意,尽管UI显示了这些库的绝对路径(例如,在我的情况下,它显示的路径是/Users/federico/ ),但保存的路径实际上是相对于项目根目录的。

您可以通过查看.mps/libraries.xml文件来验证:

可以实现什么

这样,您可以从GitHub克隆此项目,并且库将正确加载到您的计算机上。 您只需要运行./gradlew setup即可从Maven存储库获取modelix和MPS扩展库。

如果可行,您应该在MPS IDE中看到“云”面板:

默认情况下,Modelix带有预配置的modelix服务器,该项目的作者(SaschaLißon)在开发过程中已使用该服务器。我们将删除该modelix-server并添加我们自己的服务器。

在此之前,我们需要运行我们的Modelix服务器。

运行Modelix服务器

我们首先需要下载它。 为此,我们将更新gradle脚本:

可以实现什么

现在,我们有了我们的模型服务器:它只是一个名为model-server-fatjar-0.0.6.jar ,包含在apps目录下。 这是一个大罐子:它意味着一个JAR,其中包含应用程序及其所有依赖项。 这样,您无需获取运行它的库。

我们将其设置为使用Postgres服务器运行,但在此之前,我们可以使用内存存储来启动它。 我们不想在生产中使用这种方式,因为重新启动modelix服务器时所有信息都会丢失,但是它对于测试很有用。

您应该能够以这种方式运行服务器:

可以实现什么

默认情况下,服务器在端口28101上启动。我们可以使用PORT环境变量控制启动服务器的PORT 。 例如,要在端口6060上启动它,我们可以使用以下命令:

可以实现什么

我们可以通过访问http://localhost:6060来验证服务器已启动。 我们应该看到消息Model Server ,如下面的屏幕快照所示。

现在我们应该配置它以使用我们的Postgres数据库。

使modelix服务器使用Postgres数据库

我们应该做的第一件事是准备modelix模式,并创建我们在其中需要的唯一表。 您可以通过多种方式做到这一点。 例如,如果您的计算机上安装了psql命令,则可以运行它。

如果您正在寻找一种简便的方法,可以使用pgAdmin 。 您必须使用Elephantsql安装的数据对其进行配置,然后运行以下查询:

可以实现什么

您应该得到这样的内容:

现在,您可以刷新数据库视图,并且应该看到带有model表及其三列的新模式。

现在数据库已准备就绪,我们可以定义JDBC配置,以便我们的modelix服务器可以学习如何访问数据库。

为此,我们创建一个名为database.properties的文件,并使用elepanthsql安装中的数据填充该文件:

我们以这种方式使用这些值:

可以实现什么

最后,我们可以启动针对数据库的modelix服务器:

可以实现什么

使用Modelix

至此,我们已经看到:

  • 我们如何在MPS项目中添加对Modelix的支持
  • 如何在本地运行Modelix服务器
  • 如何配置Modelix服务器以使用Postgres数据库

剩下要做的一件事:实际使用Modelix服务器!

在下面的视频中,我们看到了如何连接到Modelix服务器,如何在服务器上创建模块以及如何在本地处理这些模块。 这很容易。 然后,通过魔术,我们所有的更改都将反映在服务器上,并因此存储在我们的数据库中。 那不是很好吗?

概要

我们已经看到,使用MPS构建的DSL为在不同领域工作的客户提供了大量价值。 医生,工程师,会计师:通过使用DSL来支持他们的流程,所有这些人的工作效率都得到了提高。

然而,MPS并不完美,在我们参与这些DSL的工业化过程中,我们遇到了一些特定的问题。 有一个计划解决每个问题。 今天,我们已经看到了该计划的一个关键组成部分:Modelix及其编辑存储在数据库中的MPS模型的能力。

尽管这些项目看起来很有希望,但还有很多工作要做。 我们讨论的所有项目都没有经过激烈的尝试,在更多的客户采用之前,它们需要成熟。 但是,它们已经可以用于构建原型,并且这些想法正在得到证明。 这是在上面进行更多工作的问题。

我们还看到了更多的想法和项目。 例如, ProjectIt是一个框架,用于构建与MPS不相关的基于Web的投影编辑器。 尽管我们认为MPS极其有价值,并且在服务器上继续使用它会很有意义,但我们还会监视替代策略,从中学习并了解在实践中最有效的方法。 目前,ProjectIt不能与Modelix互操作,但是正在考虑使它们互操作。 这样,Modelix可以成为存储模型的更通用的解决方案,而不仅仅是适用于使用MPS构建的模型的解决方案。

对于语言工程来说,这绝对是一个非常重要的领域,已经流传了一段时间的思想现在已经转化为代码并经过了测试。 这是一段激动人心的时刻,我非常高兴能在这一领域工作。 我们正在Strumenta社区中就这些主题进行讨论,我们期待看到事情如何发展,并在可能的情况下做出我们的贡献。

翻译自: https://www.javacodegeeks.com/2020/11/saving-jetbrains-mps-models-in-a-database-using-modelix.html

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐