gradle:查找文件属于哪个项目

时间:2017-12-07 09:12:03

标签: gradle

让我们考虑一下这个样本多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是否提供开箱即用的功能(例如,提供文件名,获取最近的项目)?谷歌搜索没有帮助,但也许问题是错误的。

我知道我可以将文件系统放在树形结构中并遍历它

4 个答案:

答案 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变更集/更改日志中看到它。