Skip to content
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

Merged
merged 3 commits into from
Nov 4, 2022

Conversation

rougsig
Copy link
Collaborator

@rougsig rougsig commented Oct 27, 2022

Background
a75becd adds sourceSet.compileClasspath as dependency to extractInclude task. compileClasspath depends on compile tasks. That means, if we try to resolve compileClasspath configuration compile tasks will be executed. This creates strange behavior described here #624.

Changes
Do not provide proto files via compileClasspath, use processResources. Proto files were in jar via processResources 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.

@ejona86
Copy link
Collaborator

ejona86 commented Oct 27, 2022

a75becd adds sourceSet.compileClasspath as dependency to extractInclude task.

Actually, it didn't. That was pre-existing. I just made it more obvious:
a75becd#diff-3405f98848db3cae29f5eda1db42d03fe57eeedc8191b5bf2dd2bbfd08537240L452

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,
Copy link
Collaborator

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?

Copy link
Collaborator Author

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.

Copy link
Collaborator

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):

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.)

Copy link
Collaborator Author

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.

Copy link
Collaborator

@ejona86 ejona86 Nov 2, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two details:

  1. 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.
  2. 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.

Copy link
Collaborator

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.

Copy link
Collaborator Author

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.

Copy link
Collaborator

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) {

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Collaborator Author

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

@rougsig
Copy link
Collaborator Author

rougsig commented Oct 27, 2022

I think the recent problems are caused by us adding GenerateProtoTask to the source sets.

This cannot be. GenerateProtoTask is added to sourceSets as input, not output. The problem is in the output of the sourceSet. testCompileClasspath contains the output of mainSourceSet as input.

@rougsig
Copy link
Collaborator Author

rougsig commented Oct 27, 2022

Actually, it didn't. That was pre-existing. I just made it more obvious:
a75becd#diff-3405f98848db3cae29f5eda1db42d03fe57eeedc8191b5bf2dd2bbfd08537240L452

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.

Hm, you're right. It takes a bit more research to find a breaking change commit.

@rougsig
Copy link
Collaborator Author

rougsig commented Oct 28, 2022

This cannot be. GenerateProtoTask is added to sourceSets as input, not output. The problem is in the output of the sourceSet. testCompileClasspath contains the output of mainSourceSet as input.

Yes, you was right. The problem can be reproduced after #601. Classes task depends on spotless. Spotless resolves main and test sourceSet at one moment. generateTestProto task resolves main sourceSet. Main sourceSet will be resolved by classes task. Loop found.

@rougsig rougsig merged commit 0521fe7 into google:master Nov 4, 2022
rougsig added a commit to rougsig/protobuf-gradle-plugin that referenced this pull request Nov 6, 2022
rougsig added a commit to rougsig/protobuf-gradle-plugin that referenced this pull request Nov 6, 2022
rougsig added a commit to rougsig/protobuf-gradle-plugin that referenced this pull request Nov 6, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants