#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)