使用Gradle存档时,是否可以从某些文件中删除一些行?

时间:2017-03-30 08:06:24

标签: gradle groovy

我有一项任务要在Gradle配置中存档一些必需的文件:

task zip4BuildServer(type: Zip) {
    classifier = 'src'
    from projectDir
    include 'src/**/*'
    include 'lib/**/*'
    include 'gradle/**/*'
    include 'build.gradle'
    include 'settings.gradle'
    include 'data_source.xml'
    include 'gradlew'
    include 'gradlew.bat'
    archiveName "${baseName}-${getDate()}-${revision}.${extension}"
}

我想从存档中的build.gradle中删除一些行(不在源位置)。

怎么做?

如果我这样写

    from projectDir
    {
        eachFile { FileCopyDetails details ->
            if(details.file.text.contains("some word")) {
            }
        }
    }

它说

212: Ambiguous expression could be a parameterless closure expression, an isolated open code block, or it may continue a previous statement;
   solution: Add an explicit parameter list, e.g. {it -> ...}, or force it to be treated as an open block by giving it a label, e.g. L:{...}, and also either remove the previous newline, or add an explicit semicolon ';' @ line 212, column 5.
       {
       ^

1 error

如何解决?我不明白错误信息。

2 个答案:

答案 0 :(得分:0)

它应该以这种方式工作:

A

答案 1 :(得分:0)

from projectDir
{
    eachFile { FileCopyDetails details ->
        if(details.file.text.contains("some word")) {
        }
    }
}

不起作用,因为这是两个表达式,from projectDir后面跟着Groovy不确定你想要什么,一个未使用的闭包,一个代码块,......就像错误描述的那样。在Groovy中,换行符可以在表达式完成时终止它。 (没有未公开的括号,没有未公开的引号,......)。所以,如果你愿意写

from(projectDir) {
    eachFile { FileCopyDetails details ->
        if(details.file.text.contains("some word")) {
        }
    }
}

它实际上应该可以工作,但我会这样做:

from projectDir
eachFile { FileCopyDetails details ->
    if(details.file.text.contains("some word")) {
    }
}

或者在我看来更像这样:

from projectDir
filter { it.contains('some word') ? null : it }

但请注意,您应该只过滤文本文件。如果将过滤器应用于二进制文件,则可能会破坏该过程中的二进制文件。这不仅适用于最后的解决方案,也适用于eachFile解决方案。

如果你的副本规范中也有二进制文件,你可能会这样。 G。想要使用filesMatching之类的

from projectDir
filesMatching(['build.gradle', '**/*.java']) {
    filter { it.contains('some word') ? null : it }
}