试用GraphQL-Ruby的Language Server
这篇文章是GraphQL Advent Calendar 2017第10天的文章。
很遗憾,参与者不够,请有兴趣的任何人随时加入。
我是GraphQL东京的组织者,我的名字是松岛。
每2到3个月我们都会聚在一起嘻嘻哈哈地玩,如果你方便的话,请随时加入我们。
我听说了写了 Ruby 上的 GraphQL 语言服务器的 graphql-ruby 的人,所以我决定试一试。

可能在合并时发生了各种更改,这是截至 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文件,就可以使用它。

看起来是根据读取的 Ruby 代码进行补全,而不是生成的 GraphQL Schema。
感觉
我之前以为情报的起点是从GraphQL Schema开始的,但是从graphql-ruby的角度来看,它更认为Ruby DSL才是核心。
似乎会发生一些语法错误的情况下,尝试进行补全可能会导致系统崩溃,但由于这方面的工作将在今后进行,所以还要加以改进。
需要注意的是,由于修复和再现类似于“若在 Language Server 上执行 ○○ 动作,则会导致崩溃”这样的问题非常繁琐,因此对于能够重现该问题的项目一系列细节报告是很重要的。