如何访问文件复制过滤器任务中的行号?

时间:2014-11-23 13:34:12

标签: gradle

这就是我需要的:

我的javascript文件中有日志语句,它们看起来像这样:

log.d("这里有一些日志消息")

我想在复制任务期间为这些动态添加精细名称和行号。 好的,所以添加文件名可能很容易,但如何获取行号?奇怪的是,我找不到任何关于如何做到这一点的信息。

复制任务的filter()方法只是传递实际的行,如果传递2个参数 - 行号和行号,那就太好了。

这是我的任务模板。我添加了我需要实现的评论。

我知道我可以使用fileCpyDetails.getSourceName()从fileCopyDetails获取文件名,但我被卡住了 关于如何使用具有行号的新log.d语句替换以log.d()开头的行 我真的希望有人可以帮助我。

task addLineNumbers(type: Copy) {
  into 'build/deploy'
  from 'source'
  eachFile { fileCopyDetails ->
    // Here I need to add line number to log.d("message")
    // to become log.d("[$fileName::$line] + $message")
    // for example, if original line in userdetails.js file was log.d("something logged here")
    // replace with log.d("[userdetails.js::43] something logged here")
  }

}

2 个答案:

答案 0 :(得分:0)

复制任务只是复制文件(它可以使用Ant filters或Groovy SimpleTemplateEngine过滤/扩展文件)。您正在寻找各种预处理器。我认为使用自定义Ant过滤器可以做到这一点,但它看起来很多工作。

我认为人们通常在运行时使用类似的东西来查找文件/行号:How can I determine the current line number in JavaScript?

答案 1 :(得分:0)

不是最优雅的解决方案,但对我有用:

task addLineNumbers(type: Copy) {
    into 'build/deploy'
    from 'source'

    def currentFile = ""
    def lineNumber = 1

    eachFile { fileCopyDetails ->
        currentFile = fileCopyDetails.getSourceName()
        lineNumber = 1
    }

    filter { line ->
        if (line.contains('log.d("')) {
            line = line.replace('log.d("', "log.d(\"[${currentFile}::${lineNumber}]")
        }

        lineNumber++
        return line
    }
}