Каков текущий путь в многомодульном проекте Gradle?

#gradle

#Gradle

Вопрос:

У меня есть многомодульный проект, который в конечном итоге выводит каталог с именем logs в корне каждого модуля, включая корневой проект.

Я расширил задачу очистки следующим образом, но она удаляет только каталог журналов в корневом проекте, а не в подмодулях.

 allprojects {
  clean {
    delete 'logs'
  }
}
  

Я думал, что это означает «добавить задачу очистки во все проекты и удалить каталог журналов в каждом проекте».

Похоже, что, несмотря на то, что delete вызывается в каждом подмодуле, он использует корневой каталог в качестве относительного пути для поиска каталога журналов.

Однако, если я изменю его на следующий, он удалит каталог в каждом модуле.

 allprojects {
  clean {
    delete file('./logs')
  }
}
  

Для меня это выглядит функционально идентично, поскольку, если путь каждой задачи очистки file('./logs') относится к корню, он также должен быть относительно корня.

Однако объект file, похоже, относится к каталогу модуля, а не к корню.

  • Почему файловый объект разрешается правильно, а строка, переданная в задачу очистки, нет?
  • Как разрешаются пути для каждого модуля при запуске многомодульного проекта?
  • Есть ли лучший способ сделать это, чем использовать файловый объект?

Ответ №1:

Не удалось выполнить репликацию — Gradle 6.7 / jdk 11

Структура директории

 .
|____a
| |____b
| |____c
  

обычная задача удаления

 allprojects {
    apply plugin: 'java'

    task deleteLogs(type: Delete) {
        delete 'logs'
    }

    clean {
        delete 'logs'
    }

    task printcd {
        println 'project    : '   project.name
        println 'rootDir    : '   project.rootDir
        println 'prjDir     : '   project.projectDir
        println '-------------'
        println 'file       : '   file('logs').absolutePath
        println 'file ./    : '   file('./logs').absolutePath
        println '-------------'
        print   'deletePath : ' 
        project.tasks.getByName('deleteLogs').targetFiles.each {file -> println file.absolutePath }
        println '-------------'
        print   'clean      : ' 
        project.tasks.getByName('clean').targetFiles.each {file -> print file.absolutePath   "  ,  " }
        println ''
        println '============='
    }

    repositories {
        mavenCentral()
    }
}
  

Вывод

 
-bash$ gradle printcd

> Configure project :
project    : a
rootDir    : /Users/xyz/a
prjDir     : /Users/xyz/a
-------------
file       : /Users/xyz/a/logs
file ./    : /Users/xyz/a/logs
-------------
deletePath : /Users/xyz/a/logs
-------------
clean      : /Users/xyz/a/build  ,  /Users/xyz/a/logs  ,  
=============
project    : b
rootDir    : /Users/xyz/a
prjDir     : /Users/xyz/a/b
-------------
file       : /Users/xyz/a/b/logs
file ./    : /Users/xyz/a/b/logs
-------------
deletePath : /Users/xyz/a/b/logs
-------------
clean      : /Users/xyz/a/b/build  ,  /Users/xyz/a/b/logs  ,  
=============
project    : c
rootDir    : /Users/xyz/a
prjDir     : /Users/xyz/a/c
-------------
file       : /Users/xyz/a/c/logs
file ./    : /Users/xyz/a/c/logs
-------------
deletePath : /Users/xyz/a/c/logs
-------------
clean      : /Users/xyz/a/c/build  ,  /Users/xyz/a/c/logs  ,  
=============

BUILD SUCCESSFUL in 578ms

-bash$ gradle --version
------------------------------------------------------------
Gradle 6.7
------------------------------------------------------------
JVM:          11.0.8 (Oracle Corporation 11.0.8 10-LTS)