我有一个包含许多子项目的项目。
在父项目中,我需要为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中的静态属性,即。它可供所有子项目使用,不会被重置。
答案 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
的访问。