试用GraphQL-Ruby的Language Server

这篇文章是GraphQL Advent Calendar 2017第10天的文章。
很遗憾,参与者不够,请有兴趣的任何人随时加入。


我是GraphQL东京的组织者,我的名字是松岛。

每2到3个月我们都会聚在一起嘻嘻哈哈地玩,如果你方便的话,请随时加入我们。


我听说了写了 Ruby 上的 GraphQL 语言服务器的 graphql-ruby 的人,所以我决定试一试。

graphql.gif

可能在合并时发生了各种更改,这是截至 2017/12/10 的信息。

由于以下存储库中有示例,因此尝试这个会更方便。

“语言服务器是什么?”

语言服务器是一种为编辑器提供方便功能的服务器,例如自动补全、跳转到定义、检测语法错误等功能。具体的编辑器交互方式由语言服务器协议定义。因为长,所以后面简称LSP。

听到「服务器」这个词常常会有一些误解,但实际上不是在某个地方设置服务器,让大家连接,而是基本上是在本地启动它。
(当然,作为LSP,它可以在任何地方运行。)

有没有公式来说明这个问题?

有。

为什么要重新实施这个呢?看起来主要的动力似乎是实施不足,但是又不想写JS。

为什么不使用JavaScript呢?
有一个名为GraphQL语言服务的JS项目,但我没有尝试使用它,因为:
– 我对它的依赖不熟悉
– 支持语言服务器方法并不理想
– 我不喜欢JavaScript

如何使用

准备LSP客户端

只要找到一个能够适当地使用LSP的客户端,并与服务器连接,就可以正常运行了。

Vim 等软件已经具备通用的 LSP 客户端,因此只需在配置文件中声明启动方法和目标文件类型即可。

另一方面,VS Code 提供了 LSP 客户端的核心部分作为 npm 包,似乎采取了将其简单封装并作为单独的扩展功能提供的方针。

我使用 VS Code 作为主要的编辑器,所以首先要从创建扩展功能开始。

虽然如此,可是要写的内容并不是很多。

'use strict';

import * as vscode from 'vscode';

import { LanguageClient, LanguageClientOptions } from 'vscode-languageclient';

export async function activate(context: vscode.ExtensionContext) {
    const conf = vscode.workspace.getConfiguration("graphql-lsc");
    let [command, ...args] = (<[string]>conf.get("commandWithArgs"));
    const clientOptions: LanguageClientOptions = {
        documentSelector: ['graphql'],
    };
    const disposable = new LanguageClient('Language Server GraphQL', {command, args, options: {cwd: vscode.workspace.rootPath}}, clientOptions).start();

    context.subscriptions.push(disposable);
}

我大致上已经设置好了启动命令。

你可以从这里安装。

启动服务器

这个项目似乎是为了在使用graphql gem的Rails应用程序中进行使用而创建的。

首先,创建如下所示的文件。
请注意,由于需要指定模式类(schema),因此需要首先阅读 config/environment.rb 文件以加载 Rails 应用程序。

#!/usr/bin/env ruby

require_relative "../config/environment"
require "graphql/language_server"

class GraphQLLanguageServer < GraphQL::LanguageServer
  self.schema = StarWarsSchema
  self.logger = Logger.new(Rails.root.join("log/lsp.log"))
  self.development_mode = true
end

GraphQLLanguageServer.new.start

接下来,我们需要指定启动命令。
由于你应该是在 Docker 上进行开发,所以只需要在已经为 Rails 定义的 docker-compose 服务中修改命令即可。

如果app是在Rails环境下,会是这样的。

{
  "graphql-lsc.commandWithArgs": [
    "docker-compose", "run", "--rm", "app", "bin/graphql_language_server"
  ]
}

使用

只要打开xxx.graphql文件,就可以使用它。

graphql.gif

看起来是根据读取的 Ruby 代码进行补全,而不是生成的 GraphQL Schema。

感觉

我之前以为情报的起点是从GraphQL Schema开始的,但是从graphql-ruby的角度来看,它更认为Ruby DSL才是核心。

似乎会发生一些语法错误的情况下,尝试进行补全可能会导致系统崩溃,但由于这方面的工作将在今后进行,所以还要加以改进。

需要注意的是,由于修复和再现类似于“若在 Language Server 上执行 ○○ 动作,则会导致崩溃”这样的问题非常繁琐,因此对于能够重现该问题的项目一系列细节报告是很重要的。

广告
将在 10 秒后关闭
bannerAds