6

使用热巧克力 GraphQL 服务器直接打印 GraphQL SDL 非常适合使用 Relay 进行开发。有没有办法做到这一点?

schema {
  query: Query
}

type Query {
  sayHello: String
}
4

2 回答 2

12

Hot Chocolate Server 提供了将模式打印为 GraphQL SDL 的简单方法。

  1. 您可以通过调用打印任何模式ToStringISchema

    这是一种更加程序化的方式,但在测试或控制台工具中打印模式非常有用。很高兴在这里知道任何语法节点都允许您以这种方式打印。所以,即使你想打印一个解析后的查询,你也可以ToString在它上面做得到它的 GraphQL 语言字符串表示。

  2. 对于 Relay 之类的东西,在端点上提供模式以下载它是非常有用的。Hot Chocolate 服务器在所有版本中都提供了一个 GraphQL SDL 端点。

    版本 10 及更早版本:http://localhost:5000/graphql/schema

    版本 11 及更新版本:http://localhost:5000/graphql?sdl

    在路由上托管 GraphQL 端点时,此 URL 应该是有效的graphql

于 2021-01-14T10:44:13.030 回答
0

如果您首先使用带有属性的代码来自动生成架构,这里有一个示例,说明如何获取架构的实例并将其写入文件(如果它已更改)。

我将这段代码放入其中,以便在我的 aspnet.core 项目在开发期间启动时为我的前端工具Program.cs自动生成我的文件。schema.graphql

HostInstance = builder.Build();
if(Debugger.IsAttached)
{
    var resolver = HostInstance.Services.GetService<IRequestExecutorResolver>();
    if (resolver != null)
    {
        var executor = resolver.GetRequestExecutorAsync().Result;
        if (executor != null)
        {
            var schemaFile = Path.Combine(ProjectPathInfo.ProjectPath, "Apps\\src\\lib\\com\\GraphQL\\schema.graphql");
            var newSchema = executor.Schema.ToString();
            var oldSchema = File.ReadAllText(schemaFile);
            if (newSchema != oldSchema)
                File.WriteAllText(schemaFile, newSchema);
        }
    }

}

我使用这个支持内部类(从这里借来的)来查找用于 SDL 输出的项目文件夹。

internal static class ProjectPathInfo
{
    public static string CSharpClassFileName = nameof(ProjectPathInfo) + ".cs";
    public static string CSharpClassPath;
    public static string ProjectPath;
    public static string SolutionPath;

    static ProjectPathInfo()
    {
        CSharpClassPath = GetSourceFilePathName();
        ProjectPath = Directory.GetParent(CSharpClassPath)!.FullName;
        SolutionPath = Directory.GetParent(ProjectPath)!.FullName;
    }

    private static string GetSourceFilePathName([CallerFilePath] string callerFilePath = null) => callerFilePath ?? "";
}
于 2021-12-15T19:51:29.253 回答