defmodule Mix.Tasks.Gitgud.Protoc do
@shortdoc "Regenerate Elixir modules from priv/proto/*.proto."
@moduledoc """
mix gitgud.protoc
Requires `protoc` on PATH and the `protoc-gen-elixir` escript
installed (run `mix escript.install hex protobuf` first; the escript
is installed under `~/.mix/escripts`).
"""
use Mix.Task
@impl Mix.Task
def run(_argv) do
out_dir = "lib/git_gud_web/protos"
File.mkdir_p!(out_dir)
plugin_path = Path.expand("~/.mix/escripts/protoc-gen-elixir")
unless File.exists?(plugin_path) do
Mix.raise("""
protoc-gen-elixir not found at #{plugin_path}.
Install with: mix escript.install hex protobuf
""")
end
protos = Path.wildcard("priv/proto/**/*.proto")
if protos == [], do: Mix.raise("no .proto files found under priv/proto/")
args =
[
"--plugin=protoc-gen-elixir=#{plugin_path}",
"--elixir_out=plugins=grpc:#{out_dir}",
"--proto_path=./priv/proto"
] ++
protos
{output, status} = System.cmd("protoc", args, stderr_to_stdout: true)
Mix.shell().info(output)
if status != 0,
do: Mix.raise("protoc exited with #{status}")
Mix.shell().info("regenerated #{length(protos)} proto file(s) into #{out_dir}")
end
end
1.3 KiB · text
5af55d9