如何将 HotChocolate 中的模式打印为 GraphQL SDL
How can I print the schema in HotChocolate as GraphQL SDL
直接使用 Hot Chocolate GraphQL 服务器打印 GraphQL SDL 对 Relay 的开发非常有用。有办法吗?
schema {
query: Query
}
type Query {
sayHello: String
}
Hot Chocolate Server 提供了将模式打印为 GraphQL SDL 的简便方法。
您可以通过在 ISchema
上调用 ToString
来打印任何模式。
这是一种更具编程性的方法,但在测试或控制台工具中仅打印模式仍然非常有用。值得一提的是,任何语法节点都允许您以这种方式打印。所以,即使你想打印一个已解析的查询,你也可以对其执行 ToString
以获得其 GraphQL 语言字符串表示形式。
对于 Relay 之类的东西,在端点上提供架构以下载它是非常有用的。 Hot Chocolate 服务器在所有版本中都提供了一个 GraphQL SDL 端点。
版本 10 及更早版本:http://localhost:5000/graphql/schema
版本 11 及更新版本:http://localhost:5000/graphql?sdl
在 graphql
路由上托管 GraphQL 端点时,此 URL 应该有效。
如果您使用带有属性的代码优先来自动生成您的架构,这里是一个示例,说明如何获取架构的实例并将其写入文件(如果它已更改)。
我将此代码放在 Program.cs
中,因此当我的 aspnet.core 项目在开发过程中启动时,它会自动为我的前端工具生成 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);
}
}
}
我使用这个内部支持 class(借自 here)来找到用于 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 ?? "";
}
如果您想在 CI/CD 中生成架构,您可以添加一个生成架构但不启动应用程序的 CLI 参数。类似于:
在Program.cs中:
if (args.Any(c => c == "--generate-schema"))
{
builder.Services.AddGraphQL().InitializeOnStartup();
var app = builder.Build();
var executor = host.Services.GetRequiredService<IRequestExecutorResolver>().GetRequestExecutorAsync().Result;
var schema = executor.Schema.Print();
File.WriteAllText("schema.graphql", schema);
return;
}
直接使用 Hot Chocolate GraphQL 服务器打印 GraphQL SDL 对 Relay 的开发非常有用。有办法吗?
schema {
query: Query
}
type Query {
sayHello: String
}
Hot Chocolate Server 提供了将模式打印为 GraphQL SDL 的简便方法。
您可以通过在
ISchema
上调用ToString
来打印任何模式。这是一种更具编程性的方法,但在测试或控制台工具中仅打印模式仍然非常有用。值得一提的是,任何语法节点都允许您以这种方式打印。所以,即使你想打印一个已解析的查询,你也可以对其执行
ToString
以获得其 GraphQL 语言字符串表示形式。对于 Relay 之类的东西,在端点上提供架构以下载它是非常有用的。 Hot Chocolate 服务器在所有版本中都提供了一个 GraphQL SDL 端点。
版本 10 及更早版本:
http://localhost:5000/graphql/schema
版本 11 及更新版本:
http://localhost:5000/graphql?sdl
在
graphql
路由上托管 GraphQL 端点时,此 URL 应该有效。
如果您使用带有属性的代码优先来自动生成您的架构,这里是一个示例,说明如何获取架构的实例并将其写入文件(如果它已更改)。
我将此代码放在 Program.cs
中,因此当我的 aspnet.core 项目在开发过程中启动时,它会自动为我的前端工具生成 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);
}
}
}
我使用这个内部支持 class(借自 here)来找到用于 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 ?? "";
}
如果您想在 CI/CD 中生成架构,您可以添加一个生成架构但不启动应用程序的 CLI 参数。类似于:
在Program.cs中:
if (args.Any(c => c == "--generate-schema"))
{
builder.Services.AddGraphQL().InitializeOnStartup();
var app = builder.Build();
var executor = host.Services.GetRequiredService<IRequestExecutorResolver>().GetRequestExecutorAsync().Result;
var schema = executor.Schema.Print();
File.WriteAllText("schema.graphql", schema);
return;
}