diff --git a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy index cbf51b5b..cf5084f5 100644 --- a/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy +++ b/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy @@ -88,6 +88,8 @@ public abstract class GenerateProtoTask extends DefaultTask { private final ConfigurableFileCollection includeDirs = objectFactory.fileCollection() // source files are proto files that will be compiled by protoc private final ConfigurableFileCollection sourceFiles = objectFactory.fileCollection() + // descriptor files are proto files that will be passed to protoc as --descriptor_set_in + private final ConfigurableFileCollection descriptorSetFiles = objectFactory.fileCollection() private final NamedDomainObjectContainer builtins = objectFactory.domainObjectContainer(PluginOptions) private final NamedDomainObjectContainer plugins = objectFactory.domainObjectContainer(PluginOptions) private final ProjectLayout projectLayout = project.layout @@ -310,6 +312,14 @@ public abstract class GenerateProtoTask extends DefaultTask { return sourceFiles } + @SkipWhenEmpty + @PathSensitive(PathSensitivity.RELATIVE) + @IgnoreEmptyDirectories + @InputFiles + FileCollection getDescriptorSetFiles() { + return descriptorSetFiles + } + @InputFiles @PathSensitive(PathSensitivity.RELATIVE) FileCollection getIncludeDirs() { @@ -513,6 +523,14 @@ public abstract class GenerateProtoTask extends DefaultTask { sourceFiles.from(files) } + /** + * Add a collection of proto source files to be compiled. + */ + public void addDescriptorSetFiles(FileCollection files) { + checkCanConfig() + descriptorSetFiles.from(files) + } + /** * Returns true if the Java source set or Android variant is test related. */ @@ -677,6 +695,23 @@ public abstract class GenerateProtoTask extends DefaultTask { } } + if(!descriptorSetFiles.isEmpty()){ + StringBuilder descriptorSetInBuilder = new StringBuilder("--descriptor_set_in=") + descriptorSetFiles.eachWithIndex { descriptorSet, index -> + if(!descriptorSet.exists()){ + throw new GradleException("DescriptorSet at ${descriptorSet.absolutePath} does not exist") + } + + if(index != 0){ + descriptorSetInBuilder.append(":") + } + + descriptorSetInBuilder.append(descriptorSet.absolutePath) + } + + baseCmd += descriptorSetInBuilder + } + List> cmds = generateCmds(baseCmd, protoFiles, getCmdLengthLimit()) for (List cmd : cmds) { compileFiles(cmd)