当前位置: 首页 > 知识库问答 >
问题:

如何在Gradle中执行或构建子项目之前执行任务?

郎正初
2023-03-14
apply plugin: 'java'
apply plugin: 'com.google.protobuf'

protobuf {

   protoc {
    // Download from repositories
    artifact = 'com.google.protobuf:protoc:3.10.0'
   }

   plugins {
      grpc {
        artifact = 'io.grpc:protoc-gen-grpc-java:1.23.0'
      }
   }

   generateProtoTasks {
      ofSourceSet('main')*.plugins {
        grpc {}
      }
   }
}

tasks.withType(JavaCompile) {
  dependsOn 'protobuf'
}

allprojects {

}

subprojects {

}

我希望在编译任何子项目之前先执行protobuf任务,因为我的子项目依赖于从protobuf任务生成的java文件。那么我怎样才能做到这一点呢?我不想在每个子项目中都有protobuf任务,相反,我只想在根项目中同时完成它,但在编译子项目之前。

共有1个答案

葛成济
2023-03-14

我为此创建了一个示例项目。根项目称为'Protobuffer',它有两个子项目,如下所示:

  • java-project
  • 原图

proto项目包含java项目的proto文件。proto项目的build.gradle.kts文件如下:

import com.google.protobuf.gradle.*

plugins {
    id ("com.google.protobuf")
}

tasks.check { dependsOn("generateProto") }

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.6.1"
    }

    generatedFilesBaseDir = File(project(":java-project").projectDir.toString(), "src").toString()
}

dependencies {
    implementation("com.google.protobuf:protobuf-java:3.6.1")
}
import com.google.protobuf.gradle.GenerateProtoTask
plugins {
    java
    id ("com.google.protobuf") version ("0.8.8") apply false
}

allprojects {
    repositories {
        mavenCentral()
        maven {
            url = uri("https://plugins.gradle.org/m2/")
        }
    }
}

subprojects {
    apply(plugin="java")
    apply(plugin="idea")

    if (name != "proto") {
        tasks.withType<JavaCompile> {
            dependsOn(project(":proto").tasks.withType<GenerateProtoTask>())
        }
    }
}
rootProject.name = "protobuffer"
include("proto")
include("java-project")


pluginManagement {
    repositories {
        mavenLocal()
        maven {
            url = uri("https://plugins.gradle.org/m2/")
        }
    }

    resolutionStrategy {
        eachPlugin {
            if (requested.id.id == "com.google.protobuf") {
                useModule("com.google.protobuf:protobuf-gradle-plugin:${requested.version}")
            }
        }
    }
}
 类似资料:
  • 我已经设置了一个Gradle任务来自动生成Gradle构建中的一个子项目,另一个子项目依赖于该子项目(这样做的原因:涉及Apache Cordova的故事很长!)。因此,根构建。gradle包含此自动生成任务,该任务创建“CordovaLib”子项目。构建。另一个子项目(非自动生成)中的gradle依赖于CordovaLib: 有没有办法在评估未生成的子项目的build.gradle之前执行自动生

  • 我有一个gradle多项目构建,每个子项目都在单独的git存储库中。在根项目的build.gradle,我试图为所有子项目定义一个任务,它将为每个项目执行一些git命令。但是,任务的工作目录始终是根项目的工作目录。 如何根据当前执行任务的子项目更改workingDir?

  • 我正在使用以下项目结构 子模块包含在设置中。gradle,并在内部版本中配置。根项目的渐变。 我有3个任务要做 (每个子项目都有这个) (这是每个子项目都需要自己工作的打包机制) (这只需要调用一次) 我想能够打电话 $gradle部署 build.gradle

  • 我的WAR文件应该包含来自组件的Java源文件。在我的根项目构建中。gradle我正在以编程方式执行子项目中的任务: 在子项目中,我有一个任务: 控制台输出: ,这意味着collectFilesFromCopyTask()将执行4次。从WAR任务开始,只能执行一次。

  • 我知道我能做到 但这也会得到projA和projB,我只想在c,d,E上运行任务...请让我知道实现这一点的最佳方法。

  • 我有一个这样的多项目构建 现在,在项目中,我已经为所有子项目声明了一个任务,如下所示: 当我运行时,我得到的输出类似于以下内容(其他内容): 现在,我尝试像这样为简单项目运行该任务 我得到的输出是: 失败:构建失败,但有一个异常。 > 哪里出错了:在项目中找不到任务你好:例子:简单项目。一些候选人是:帮助。 尝试:运行gradle任务以获取可用任务的列表。使用--stack跟踪选项来获取堆栈跟踪。