让我们考虑一下这个样本多gradle项目结构
build.gradle
|-- project-a
| |-- build.gradle
| +-- project-a-b
| |-- src
| | |
| | +-- test.java
| |
| +-- build.gradle
+-- project-c
|-- build.gradle
+-- src
+-- test2.java
让我们说从git changelog我改变了文件:
project-a/project-a-b/src/test.java
project-c/src/test2.java
我需要了解他们属于哪个项目
project-a/project-a-b/src/test.java -> project-a-b
project-c/src/test2.java -> project-c
Gradle是否提供开箱即用的功能(例如,提供文件名,获取最近的项目)?谷歌搜索没有帮助,但也许问题是错误的。
我知道我可以将文件系统放在树形结构中并遍历它
答案 0 :(得分:0)
以下应该做你想做的事:
def file = file('your/path')
def project
while (file.parentFile != null) {
file = file.parentFile
project = rootProject.allprojects.findAll { it.projectDir == file }
if (project) {
break;
}
}
答案 1 :(得分:0)
我遍历文件的父层次结构,直到找到项目目录匹配
public Project getOwningProject(File findMe) {
Map<String, Project> map = [:]
allprojects.each { Project p ->
map[p.projectDir.absolutePath] = p
}
File dir = findMe.directory ? findMe : findMe.parentFile
while (dir != null) {
Project p = map[dir.absolutePath]
if (p) return p
dir = dir.parentFile
}
return null
}
答案 2 :(得分:0)
以下为每个项目定义findFile
任务(使用sourceSets
),并在根build.gradle
(完整example here)中合并。
subprojects { project ->
apply plugin: 'java'
task findFile() {
doLast {
def targetFile = project.targetFile
project.sourceSets.main.java.each { file ->
if (file.absolutePath.contains(targetFile)) {
println "TRACER found ${targetFile} in project: ${project.name}"
}
}
}
}
}
它目前只搜索一个文件,但可以轻松采用更多文件。用法示例:
gradle findFile -PtargetFile=project-a/project-a-b/src/main/java/TestAB.java
TRACER found project-a/project-a-b/src/main/java/TestAB.java in project: project-a-b
答案 3 :(得分:0)
如上所述,它可能取决于belongs to
...
在上面的示例中,拥有项目由src
目录的父目录命名。即你可以直接在你的Git变更集/更改日志中看到它。