Skip to content

Commit 7c9595a

Browse files
committed
Add package-scoped options and manifest attribute.
See scalapb/scalapb-validate#70
1 parent 3b697e1 commit 7c9595a

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

build.sbt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def commonProtos =
1212
ProtosProject(
1313
"com.google.api.grpc" % "proto-google-common-protos" % "1.18.1",
1414
grpc = true,
15+
protoPackage = "google",
1516
buildNumber = 0
1617
)
1718
lazy val commonProtos09 = commonProtos.scalapb09
@@ -21,6 +22,7 @@ lazy val commonProtos11 = commonProtos.scalapb11
2122
val cloudPubSub = ProtosProject(
2223
"com.google.api.grpc" % "proto-google-cloud-pubsub-v1" % "1.92.3",
2324
grpc = true,
25+
protoPackage = "google",
2426
buildNumber = 0
2527
).dependsOn(commonProtos)
2628
lazy val cloudPubSub09 = cloudPubSub.scalapb09
@@ -30,6 +32,7 @@ lazy val cloudPubSub11 = cloudPubSub.scalapb11
3032
val pgvProto = ProtosProject(
3133
"io.envoyproxy.protoc-gen-validate" % "pgv-java-stub" % "0.4.1",
3234
grpc = false,
35+
protoPackage = "validate",
3336
packageName = Some("pgv-proto"),
3437
buildNumber = 0
3538
)

project/BuildHelpers.scala

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ object NoProcessLogger extends ProcessLogger {
1515
final case class ProtosProject(
1616
module: ModuleID,
1717
grpc: Boolean,
18+
protoPackage: String,
1819
buildNumber: Int = 0,
1920
packageName: Option[String] = None,
2021
dependencies: Seq[ProtosProject] = Seq.empty
@@ -27,6 +28,8 @@ final case class ProtosProject(
2728

2829
val projectName = module.name + scalapbMajorMinor.replace('.', '_')
2930

31+
val optionsFile = protoPackage.replace('.', '/') + "/scalapb-options.proto"
32+
3033
sbt
3134
.Project(projectName, new File(projectName))
3235
.settings(
@@ -67,7 +70,38 @@ final case class ProtosProject(
6770
publish / skip := (sys.env
6871
.getOrElse("PUBLISH_ONLY", basePackageName) != basePackageName),
6972
sonatypeBundleDirectory := (ThisBuild / baseDirectory).value / "target" / "sonatype-staging",
70-
publishArtifact in (Compile, packageDoc) := scalaVersion.value != Scala3
73+
publishArtifact in (Compile, packageDoc) := scalaVersion.value != Scala3,
74+
Compile / resourceGenerators += Def.task {
75+
76+
val packageOptionsFile =
77+
(Compile / resourceManaged).value / optionsFile
78+
IO.write(
79+
packageOptionsFile,
80+
s"""|// This file is generated by ScalaPB/common-protos project/BuildHelpers.scala.
81+
|// It is added as an input in user's builds to ensure the protos shipped with
82+
|// this jar are interpreted with the original generator options, and not influenced
83+
|// by generator options in the user's build.
84+
|
85+
|syntax = "proto3";
86+
|package $protoPackage;
87+
|
88+
|import "scalapb/scalapb.proto";
89+
|option (scalapb.options) = {
90+
| scope: PACKAGE
91+
| flat_package: false
92+
| lenses: true
93+
| // java_conversions as a file-level option is only introduced in 0.10.11
94+
| // so it is not yet included here for backwards-compatiblity.
95+
| // java_conversions: true
96+
| preserve_unknown_fields: true
97+
|};
98+
""".stripMargin
99+
)
100+
Seq(packageOptionsFile)
101+
}.taskValue,
102+
Compile / packageBin / packageOptions += {
103+
Package.ManifestAttributes("ScalaPB-Options-Proto" -> optionsFile)
104+
}
71105
)
72106
}
73107

@@ -77,7 +111,7 @@ final case class ProtosProject(
77111
)
78112

79113
val scalapb10: Project =
80-
protoProject("0.10.10").dependsOn(
114+
protoProject("0.10.11").dependsOn(
81115
dependencies.map(d => ClasspathDependency(d.scalapb10, None)): _*
82116
)
83117

0 commit comments

Comments
 (0)