创建一个我可以在子项目中增加的静态全局变量

时间:2015-04-09 05:04:24

标签: gradle

我有一个包含许多子项目的项目。

在父项目中,我需要为port定义一个变量。每次子项目执行特定任务时,我都需要增加端口(从而确保端口号从未使用过两次 - 因为我在 - 并行运行)。

我该怎么做?

为了清晰起见而更新

对于像这样的项目结构

parent -
       |->sub-project-1
       |  
       |->sub-project-2

父项目应定义初始端口号。

  project.ext.portNumber = 4200 //set a global port number somehow

在每个子项目中,我想使用此端口号

  project.portNumber++; //increment in some way
  println "${project.name} is using port: ${project.portNumber}"

因此,在gradlew build项目上运行parent将输出:

sub-project-1 is using port: 4201
sub-project-2 is using port: 4202

如果我在gradlew build内运行parent/sub-project-2我会得到

sub-project-2 is using port: 4201

随着每个项目的构建,我需要portNumber像java中的静态属性,即。它可供所有子项目使用,不会被重置。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么无论您是从根项目还是从某个子项目中运行完整版本,都需要为每个子项目分配一个端口号。

因此,您必须在每次执行gradle时计算所有项目的端口号。

以下代码:

ext.portNumber = 4200
gradle.projectsEvaluated { g ->
    g.rootProject.subprojects { p ->
        p.ext.portNumber = gradle.rootProject.portNumber++
        println "$p.name [$p.portNumber]"
    }
}

针对以下项目结构执行

parent -
       |->projA -
                |->projA1
                |->projA2
       |->projB

产生以下输出,无论是从根项目执行还是从子项目中执行:

projA [0]
projB [1]
projA1 [2]
projA2 [3]

一个注意事项 - 我承认我没有使用--parallel标记广泛检查此解决方案。但是,由于在填充任务图之前调用projectsEvaluated挂钩,因此--parallel可能不会影响此配置。如果它确实存在,那么我相信您可以使用任何java标准同步机制来同步对根项目portNumber的访问。