同时使用 lombok 和 protobuf 会导致 gradle 任务没有依赖项,从而导致构建有时失败

Ivo*_*Ivo 3 protocol-buffers gradle lombok

我在gradle中同时使用lombok和protobuf。这会生成独立的任务generateEffectiveLombokConfig和。generateProto然而lombok任务应该依赖于protobuf任务,否则lombok生成的代码引用的是protoc尚未生成的Java代码。

syntax = "proto3";
package my.example.v1;
message Task {
  string id = 1;
  repeated string names_to_print = 2;
}
Run Code Online (Sandbox Code Playgroud)
package org.example;

import lombok.experimental.UtilityClass;
import my.example.v1.*;

@UtilityClass
public class Worker {

    public void work(TaskOuterClass.Task task) {
        // do something
    }

}
Run Code Online (Sandbox Code Playgroud)
plugins {
    id 'java'
    id 'io.freefair.lombok' version '6.4.3'
    id 'com.google.protobuf' version '0.8.18'
}

group 'org.example'

repositories {
    mavenCentral()
}

dependencies {
    implementation "com.google.protobuf:protobuf-java:3.20.1"
    implementation "com.google.protobuf:protobuf-java-util:3.20.1"
}
Run Code Online (Sandbox Code Playgroud)

我尝试将 protobuf 的输出添加为 sourceSet 以确保首先执行 protobuf 任务,但我收到警告:

sourceSets {
    main {
        java {
            srcDir "${projectDir}/build/generated/source/proto/main/java"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

警告:

Execution optimizations have been disabled for task ':generateProto' to ensure correctness due to the following reasons:
  - Gradle detected a problem with the following location: '/build/generated/source/proto/main'. Reason: Task ':generateEffectiveLombokConfig' uses this output of task ':generateProto' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. Please refer to https://docs.gradle.org/7.4.2/userguide/validation_problems.html#implicit_dependency for more details about this problem.
Run Code Online (Sandbox Code Playgroud)

如何确保所有 protobuf 任务都在 lombok 任务之前完成?

小智 8

您将任务依赖关系设置如下

afterEvaluate {
    generateEffectiveLombokConfig.mustRunAfter generateProto
}
Run Code Online (Sandbox Code Playgroud)
Executing 'build -m'...

:extractIncludeProto SKIPPED
:extractProto SKIPPED
:generateProto SKIPPED
:generateEffectiveLombokConfig SKIPPED
:compileJava SKIPPED
:processResources SKIPPED
:classes SKIPPED
:jar SKIPPED
:assemble SKIPPED
:generateTestEffectiveLombokConfig SKIPPED
:extractIncludeTestProto SKIPPED
:extractTestProto SKIPPED
:generateTestProto SKIPPED
:compileTestJava SKIPPED
:processTestResources SKIPPED
:testClasses SKIPPED
:test SKIPPED
:check SKIPPED
:build SKIPPED

BUILD SUCCESSFUL in 299ms
Run Code Online (Sandbox Code Playgroud)