尝试graphql-ruby的Language Server


本文是GraphQL Advent Calendar 2017的第十天。
不幸的是,参加人数不足,所以如果有人感兴趣,请继续这样做。

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

https://www.meetup.com/ja-JP/GraphQL-Tokyo/

我们大约每两到三个月聚会一次,所以请随时与我们联系。

graphql-ruby的人似乎已经开始用Ruby编写GraphQL Language Server,所以我尝试了一下。

https://github.com/rmosolgo/graphql-ruby/pull/1144

graphql.gif

:construction_worker: 2017/12/10由于当前信息,在合并时可能已更改:construction_worker:

以下存储库中有示例,因此可以快速尝试它们。

https://github.com/mtsmfm/graphql-ruby-demo/tree/language-server

什么是语言服务器

语言服务器是主要为编辑器提供有用功能的服务器,例如完成,定义跳转和语法错误检测。
与编辑器进行交互的特定方式在"语言服务器协议"中定义。
由于很长,它将被写为LSP。

听到"服务器"一词似乎有点误解,但是您基本上是立即启动它,而不是在某个地方设置服务器并与所有人建立联系。
(当然,LSP在哪里工作都没有关系)

没有官方的东西吗?

https://github.com/graphql/graphql-language-service

重新实现它的主要动机是看来实现还不够,但是我不想写JS。

为什么不使用JavaScript?
有一个名为GraphQL Language Service的JS项目,但我没有尝试使用它是因为:
-我不熟悉它的依赖关系
-无论如何,对语言服务器方法的支持不是很好
-我不喜欢JavaScript

如何使用

准备LSP客户端

如果您查看可以正确说出LSP并将其连接到服务器的客户端,则此方法有效。

Vim等具有通用LSP客户端,因此您可以在配置文件中声明启动方法和目标文件类型。
另一方面,VS Code将LSP客户端的核心部分作为npm软件包提供,并且似乎容易将其包装并单独提供为扩展是一种策略。

我使用VS Code作为主编辑器,因此必须首先创建一个扩展。

即使说

,也没什么可写的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'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);
}

https://github.com/mtsmfm/vscode-graphql-lsc/blob/9b9838f29e396eea874d57bb01ac40d8c21911f8/src/extension.ts

我暂时可以设置启动命令。

您可以从这里安装它。

https://marketplace.visualstudio.com/items?itemName=mtsmfm.graphql-lsc

启动服务器

它似乎是为使用graphql gem的Rails应用程序设计的。

首先,创建以下文件。
请注意,您必须首先阅读config / environment.rb来加载Rails应用程序,因为您需要指定架构类。

bin / graphql_language_server

1
2
3
4
5
6
7
8
9
10
11
12
#!/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

https://github.com/mtsmfm/graphql-ruby-demo/blob/5169f4a29a9110519e1ca73ff86b8f3358148e3d/bin/graphql_language_server

接下来,指定启动命令。
当然,它应该在Docker上开发,因此您可以像在为Rails定义的docker-compose服务中一样使用该命令。

例如,如果app是Rails环境,它将如下所示。

.vscode / settings.json

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

https://github.com/mtsmfm/graphql-ruby-demo/blob/5169f4a29a9110519e1ca73ff86b8f3358148e3d/.vscode/settings.json

使用

您可以通过打开

xxx.graphql来使用它。

graphql.gif

似乎它加载Ruby代码而不是生成的GraphQL Schema,并在此基础上进行补充。

印象数

我认为信息的来源是GraphQL Schema,但这是否意味着Ruby DSL恰好适用于graphql-ruby?

语法如果您尝试以错误状态完成操作,似乎可能会死掉,但是似乎从现在开始将完成该区域的创建。

如果在Language Server上执行○○,将很难注意到,重现和解决您将死亡的事实,因此,详细报告整套可复制项目非常重要。