-
Notifications
You must be signed in to change notification settings - Fork 275
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Do not use compileClasspath as source of proto files #631
Conversation
Actually, it didn't. That was pre-existing. I just made it more obvious: I think the recent problems are caused by us adding GenerateProtoTask to the source sets. However, we want to keep that, so we can choose to stop using compileClasspath. |
TaskProvider<ProcessResources> mainProcessResources = project.tasks.named( | ||
project.extensions.getByType(SourceSetContainer) | ||
.getByName(SourceSet.MAIN_SOURCE_SET_NAME) | ||
.processResourcesTaskName, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why reference ProcessResources instead of the main proto source set?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ProcessResources contains all sources. source code, jars, zips, gradle dependencies, etc. SourceSet contains only sources from source code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, you are also getting the output of extractProtosTask. So the useful parts are coming from how we plumb ProcessResources from the generateProtoTask (which is proto source set + extractProtos):
protobuf-gradle-plugin/src/main/groovy/com/google/protobuf/gradle/ProtobufPlugin.groovy
Lines 258 to 262 in e20df5b
project.tasks.named(sourceSet.getTaskName('process', 'resources'), ProcessResources).configure { | |
it.from(generateProtoTask.get().sourceDirs) { CopySpec cs -> | |
cs.include '**/*.proto' | |
} | |
} |
I'm not all that confident that is an equivalent change because the resources will be individual .proto files, not the .jars. I am also not trusting now how people may be modifying gradle tasks.
I can live with this change, but I wonder if it'd be better to just copy from generateProtoTask sourceDirs, the same way as we do for processResources, but into test's generateProtoTask (not extractIncludeProtos). That'd prevent future surprises and seems could be done for Android as well. (We could in the future avoid task configuration for generateProtoTask if we wanted, but I don't know if it really matters.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We need pass to test sourceSets from main sourceset: sources, includes. The best way is make singls source of truth. That source should contain all information about sources and includes. In this fix, I did the easiest way.
This fix can be done in the following ways:
1 pass main process Resources task
2 pass main generate proto task
3 pass the combination of, main sourceset and extract tasks.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Two details:
- Option (1) has more files in it than (2) and (3). (2) and (3) seem equivalent behaviorally at the moment. I can accept any of the answers here. I think (2) and (3) are more bug prone in terms of omission (forget to add something) but I think (1) is more prone to issues in user's builds and most easy to accidentally misuse. For example, with (1) if you add a .proto to src/main/java, you can include that proto in src/test/proto.
- Shouldn't we add these files as input to generateProtoTask, not to excludeIncludeProtos? This PR is doing excludeIncludeProtos. I'm surprised it works with excludeIncludeProtos, since we're passing .proto files and not .jars. This part is more important to me, because I don't understand how the PR is working now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I meant extract, not exclude.
If there are no jars, why are these files being passed to setupExtractIncludeProtosTask()? The purpose of that task is to extract proto files from zips. Yes, they shouldn't be a sourceDir for generateProtoTask, but it seems can be an include.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Where it pased to extract task? I think i missed something. Could you please explain a bit more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mainProcessResources
is added to testClassPathConfig
which is passed:
Provider<ProtobufExtract> extractIncludeProtosTask = setupExtractIncludeProtosTask(
sourceSet.name, compileProtoPath, testClassPathConfig) // The last argument here
And setupExtractIncludeProtosTask
creates a protobuf extract:
return project.tasks.register(extractIncludeProtosTaskName, ProtobufExtract) {
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we pass directory, it wont be extracted. Just added to result.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can pass main sources and extractMainProto as includes to generateTestProto and all will works fine. I did this logic in #632
This cannot be. GenerateProtoTask is added to sourceSets as input, not output. The problem is in the output of the sourceSet. |
Hm, you're right. It takes a bit more research to find a breaking change commit. |
Yes, you was right. The problem can be reproduced after #601. |
See details here google#631
See details here google#631
See details here google#631
Background
a75becd adds
sourceSet.compileClasspath
as dependency toextractInclude
task.compileClasspath
depends oncompile
tasks. That means, if we try to resolvecompileClasspath
configuration compile tasks will be executed. This creates strange behavior described here #624.Changes
Do not provide proto files via
compileClasspath
, useprocessResources
. Proto files were in jar viaprocessResources
tasks. Just use it directly, without any proxies.Not the best solution, I'm working on a better solution here #611
Test plan
Green pipelines.
Manual test on temporalio/sdk-java#1484. (no cycle found, but found licences problems. The same problem as here #625)
Fix for #624.