33
ruby-grahql: generating schema definition file
While developing your GraphQL api using graphql-ruby you will probably come across the need of generating the schema definition file from the schema you defined in your code, so other front-end client would be able to consume it, or generate types automatically based on that schema.
There is this github issue, where this comment outlines how you can accomplish the code generation. I couldn't make the same example work in my code so I came up with another solution.
It will also involve what was implemented in this example from https://howtographql.com.
We'll define a custom rake task and a rake task from the ruby-graphql package.
Start by creating the file lib/taks/graphql.rake
.
The file itself will be really simple:
require "graphql/rake_task"
require "rake"
GraphQL::RakeTask.new(
load_schema: -> (_task) {
require_relative '../../app/graphql/dcms_schema'
DcmsSchema
}
)
namespace :graphql do
task export: :environment do
Rake::Task["graphql:schema:dump"].invoke
end
end
So, first we are requiring graphql/rake_task
so we can declare a graphql rake task and require rake
to be able to invoke a rake task from within the file.
Here we declare the rake task called graphql:schema:dump
. Inside the load_schema
callback we require our schema definition file and return the schema class at the end of the callback.
GraphQL::RakeTask.new(
load_schema: -> (_task) {
require_relative '../../app/graphql/dcms_schema'
DcmsSchema
}
)
After declaring the graphql rake task, we create our custom task by doing the following:
namespace :graphql do
task export: :environment do
Rake::Task["graphql:schema:dump"].invoke
end
end
Inside it, we are simply calling the rake task we previously defined with Rake::Task["graphql:schema:dump"].invoke
Now, in the terminal we are able to execute our rake task by typing the following
$ rake graphql:export
If all works, you should be able to see two files: schema.graphql
and schema.json
in the root of your project.
You can check the rake tasks documentation for graphql-ruby here: https://graphql-ruby.org/api-doc/1.9.12/GraphQL/RakeTask
33