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

配置子项目后执行梯度任务

宋嘉懿
2023-03-14

我有一个多项目的Gradle构建,其中子项目被分配了独立于根项目的版本号。我想将这个版本号注入每个子项目中的几个资源文件中。通常,我会通过为根构建中的每个子项目配置processResources任务来实现这一点。然而,问题是Gradle似乎在加载子项目的构建文件之前执行processResources任务,并且正在注入“unspecified”作为版本。

目前,我的项目如下所示:

/设置。格拉德尔

include 'childA' // ... and many others

/构建。格拉德尔

subprojects {
    apply plugin: 'java'
    apply plugin: 'com.example.exampleplugin'
}

subprojects {
    // This has to be configured before processResources
    customPlugin {
        baseDir = "../common"
    }

    processResources {
        // PROBLEM: version is "unspecified" here
        inputs.property "version", project.version

        // Inject the version:
        from(sourceSets.main.resources.srcDirs) {
            include 'res1.txt', 'res2.txt', 'res3.txt'
            expand 'version':project.version
        }
        // ...
    }
}

/儿童/构建。格拉德尔

version = "0.5.424"

我研究了在root的构建开始时添加evaluationDependsOnChildren()。gradle,但这会导致一个错误,因为childA/build。gradle在customPlugin{…}之前运行 。我尝试过使用dependsOn、mustRunAfter和其他技术,但似乎都没有达到预期效果。(也许我不完全了解生命周期,但似乎根项目是在子项目之前配置和执行的。它不应该配置根项目,然后配置子项目,然后执行吗?)

如何将每个子项目的版本注入到适当的资源文件中,而不需要大量的复制/粘贴或样板文件?


共有3个答案

子车宏浚
2023-03-14

试着这样做:

subprojects { project ->
    // your code
}

否则,project将引用未指定版本的根项目。

郝修为
2023-03-14

这是我自己弄明白的。我正在使用初始化。gradle文件将某些内容应用于rootProject,但我需要来自子项目的数据

第一个选择是在我修改它之前评估每个子项目:

rootProject {
    project.subprojects { sub ->
        sub.evaluate()
        //Put your code here

但我不确定强迫子项目评估会有什么副作用,因此我做了以下工作:

allprojects {
    afterEvaluate { project ->
         //Put your code here
陈文景
2023-03-14

您可以尝试使用此方法,使用挂钩:

gradle.projectsEvaluated({
   // your code
})
 类似资料:
  • 我知道我能做到 但这也会得到projA和projB,我只想在c,d,E上运行任务...请让我知道实现这一点的最佳方法。

  • 配置子项目 到目前为止你已经把ToDo项目根据功能拆分成多个模块,接下来可以用之前的方法来定义构建逻辑,下面有几点需要主要: 根目录和子目录使用相同的group和version属性值 所有的子目录都是Java项目需要Java插件来正常工作,所以你只需要在子项目中应用Java插件 web子项目是唯一一个依赖外部库的项目,它需要打包成WAR而不是JAR 子项目之间可以定义模块依赖 接下来你将学习如何定

  • 我面临以下问题。我有一个多模块的Gradle项目。一个模块是我的根项目,第二个模块是集成测试。 为了让我的集成测试运行,复制任务需要首先运行,以便将一些资产移动到项目根目录上的文件夹中。 我已经在我的根项目上定义了这样一个任务,当我试图调用它时,它什么也不做(我尝试了几种不同的调用方式)。 由于失败,我继续在子项目本身上创建了以下任务: 这是我的另一个任务。我的目标是让它将根项目类以及在下生成的j

  • 问题内容: 如果您曾经参与过Salesforce项目的部署或为SF项目设置持续集成,那么您应该知道,在部署元数据组件(类,页面等)之后,您通常还需要执行一些手动任务,例如填充自定义设置值或设置配置文件的字段级安全性。有很多这样无聊的动作。 在我当前的项目中,我再次面对它,我正在寻找如何最大程度地自动化它的方法。为了将项目部署到Org,我们使用Jenkins + Git。因此,我希望例如在每次部署后

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