我正在尝试使用 Gradle 构建一个 war 文件,但遇到了一个问题,即排除一个目录并包含另一个恰好具有相同名称但父目录不同的目录。
请注意,在下面的第一个代码示例中,最终的
css/
文件中都没有包含 war
目录 - 我认为是因为 Gradle 认为我想排除名为 css/
的任何目录,无论其名称如何绝对路径。基本上我想排除
src/main/webapp/css
并包含
build/tmp/css
因为后者包含缩小的代码。我怎样才能实现这个目标?我尝试过以各种方式指定绝对路径,但没有取得任何成功。
war {
dependsOn minify
from('build/tmp/') { include ('css/') }
exclude('WEB-INF/classes/', 'css/')
}
如果我不像这样排除
css/
:
war {
dependsOn minify
from('build/tmp/') { include ('css/') }
exclude('WEB-INF/classes/')
}
然后结果是缩小和非缩小的代码都包含在内。
WEB-INF/classes/css
而不是
src/main/webapp/css
,但是复制缩小的 CSS 文件而不是原始文件是通过以下方式实现的:
apply plugin: 'war'
war {
// dependsOn 'minify'
from 'src/main/webapp'
exclude 'css' // or: "exclude 'WEB-INF/classes/css'"
from('build/tmp/css') {
include '**/*.css'
into 'css' // or: "into 'WEB-INF/classes/css'"
}
}
使用简单的包含+排除导致从war文件中排除所有.ftlh文件。
解决方案是使用带有回调的排除函数,精确检查每个文件: (如果是 build.gradle.ktx 文件)
tasks.named<War>("war") {
from("build/processed_templates") {
include("**/*") // including processed template files
}
// exclude files that match certain criteria
exclude { fileTreeElement ->
// get absolute path and replace windows-dir-separator with slash
val absPath = fileTreeElement.file.absolutePath.replace("\\", "/")
// return true if file should be filtered out
!fileTreeElement.isDirectory
&& fileTreeElement.name.endsWith(".ftlh")
&& absPath.contains("/src/main/webapp/WEB-INF")
}
}