This plugin uses protofetch to download Protobuf definition files.
In project/plugins.sbt
:
addSbtPlugin("com.coralogix" % "sbt-protofetch" % "0.1.0")
In build.sbt
:
lazy val root = (project in file("."))
.enablePlugins(ProtofetchPlugin)
With the plugin enabled, you can use the protofetchFetch
task
to fetch protobuf definitions defined in the protofetch.toml
descriptor,
and the protofetchOutputDirectory
to find out the location of the downloaded .proto
files.
In practice, you most likely want these protobuf definitions to be used
by the rest of the build process. For sbt-protoc
the configuration snippet
will look like this:
lazy val root = (project in file("."))
.enablePlugins(ProtofetchPlugin)
.settings(
// Use protofetch output as a sbt-protoc source
Compile / PB.protoSources += protofetchOutputDirectory.value,
Compile / PB.generate := (Compile / PB.generate).dependsOn(protofetchFetch).value,
// The rest of the sbt-protoc configuration
Compile / PB.targets := Seq(scalapb.gen(grpc = true) -> (Compile / sourceManaged).value / "scalapb"),
libraryDependencies += "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion
)
It is recommended to put downloaded .proto files inside the target
directory, for example
proto_out_dir = './target/proto'
# ...
The protofetchFetch
task runs protofetch fetch
or protofetch fetch --locked
depending on the value of the insideCI
settings.
This means that the protofetch.lock
file has to be committed to the repository.
To avoid running protofetch for every axis of you project matrix, it's recommended to create a separate project that will fetch the .proto files:
lazy val protos = (project in file("protos"))
.enablePlugins(ProtofetchPlugin)
lazy val app = (projectMatrix in file("app"))
.jvmPlatform(scalaVersions = Seq("2.13.12", "3.3.1"))
.settings(
Compile / PB.protoSources += (protos / protofetchOutputDirectory).value,
Compile / PB.generate := (Compile / PB.generate).dependsOn(protos / protofetchFetch).value,
// ...
)
If you previously used Protodep.generateProject
from sbt-protodep,
you can migrate to sbt-protofetch
with the following snippet:
lazy val grpcDeps = (project in file("grpc-deps"))
.enablePlugins(ProtofetchPlugin)
.settings(
protofetchModuleFile := baseDirectory.value / ".." / "protofetch.toml",
Compile / PB.protoSources += protofetchOutputDirectory.value,
Compile / PB.targets := Seq(
scalapb.gen(grpc = true) -> (Compile / sourceManaged).value / "scalapb",
scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value / "scalapb"
),
Compile / PB.generate := (Compile / PB.generate).dependsOn(protofetchFetch).value,
libraryDependencies ++= Seq(
"com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion,
"io.grpc" % "grpc-netty" % scalapb.compiler.Version.grpcJavaVersion,
"com.thesamet.scalapb.common-protos" %% "proto-google-common-protos-scalapb_0.11" % "2.5.0-2" % "protobuf",
"com.thesamet.scalapb.common-protos" %% "proto-google-common-protos-scalapb_0.11" % "2.5.0-2",
"io.github.scalapb-json" %% "scalapb-circe" % "0.11.2"
)
)
This gives you full control over dependencies and other aspects of code generation.
Note that this snippet is a drop-in replacement of what sbt-protodep
does.
You don't necessarily need to have a dedicated grpcDeps
sbt project,
these settings can as well be applied to some already existing project.
Also, you may not need all libraryDependencies
that sbt-protodep
used to add.