【发布时间】:2021-12-16 20:53:46
【问题描述】:
我有一个多模块 gradle 项目。
我正在尝试为每个子项目(实际上是每个所有项目)运行 DependencyReportTask....然后连接到单个文件。
如果我这样做:
allprojects {
/* create a .txt file for each subproject (and the root project */
task generateSingleProjectDependencies(type: DependencyReportTask) {
outputFile = file('singleproject.dependencies.txt')
}
}
task concatenateAllProjectsDependencyFiles {
doLast {
/* create a FileTree with all the subproject .txt files */
FileTree singleProjectsFileTree = fileTree('.') {
include 'singleproject.dependencies.txt'
}
if (singleProjectsFileTree.empty) {
println 'singleProjectsFileTree was empty'
} else {
copy {
println 'allprojects.dependencies.txt is being created, how many times did I fire?'
/* write out the multiple single-file-txts into a master .txt file */
def outputFileName = "allprojects.dependencies.txt"
def output = new File(outputFileName)
output.write('')
singleProjectsFileTree.each {
f -> output << f.text
}
}
}
}
}
/* use dependsOn to get the sequence correct */
concatenateAllProjectsDependencyFiles.dependsOn generateSingleProjectDependencies
/* now "finalize" the over-all "build" task..with our custom dependency-all task */
build.finalizedBy concatenateAllProjectsDependencyFiles
其中“concatenateAllProjectsDependencyFiles”在“allprojects”之外,我只得到根项目的结果。
(所以这不太对):(
============
如果我将 concatenateAllProjectsDependencyFiles 移动到“allprojects”内部
allprojects {
/* create a .txt file for each subproject (and the root project */
task generateSingleProjectDependencies(type: DependencyReportTask) {
outputFile = file('singleproject.dependencies.txt')
}
task concatenateAllProjectsDependencyFiles {
doLast {
/* create a FileTree with all the subproject .txt files */
FileTree singleProjectsFileTree = fileTree('.') {
include 'singleproject.dependencies.txt'
}
if (singleProjectsFileTree.empty) {
println 'singleProjectsFileTree was empty'
} else {
copy {
println 'allprojects.dependencies.txt is being created, how many times did I fire?'
/* write out the multiple single-file-txts into a master .txt file */
def outputFileName = "allprojects.dependencies.txt"
def output = new File(outputFileName)
output.write('')
singleProjectsFileTree.each {
f -> output << f.text
}
}
}
}
}
/* use dependsOn to get the sequence correct */
concatenateAllProjectsDependencyFiles.dependsOn generateSingleProjectDependencies
/* now "finalize" the over-all "build" task..with our custom dependency-all task */
build.finalizedBy concatenateAllProjectsDependencyFiles
}
我明白了
allprojects.dependencies.txt is being created, how many times did I fire?
显示 N+1 次(N 表示子项目数加上一个根项目)。
(所以这不太对):(
这不仅仅是触发 N+1 次,我得到了好坏参半的结果....可能是创建 singleproject.dependencies.txt 的线程竞争条件。
如何让 concatenateAllProjectsDependencyFiles 只触发一次,并“找到”所有子项目的“singleproject.dependencies.txt”文件?
【问题讨论】:
标签: gradle build.gradle gradlew