使用存储库中的工件作为构建工具的Gradle任务

时间:2018-01-06 22:00:19

标签: gradle

如何在Gradle任务中执行托管在托管服务器上的工具?

在我的具体情况下,我使用Gradle构建Android应用程序。我添加了一个任务来将一些protobuf数据从文本编码为二进制格式:

task encodeData {
    ext.resDir = file("$buildDir/binary_proto")
    def inputDir = 'text_pb'
    def outputDir = "$resDir/raw"
    inputs.dir inputDir
    outputs.dir outputDir

    doLast {
        file(outputDir).mkdirs()
        file(inputDir).eachFile { inputFile ->
            exec {
                commandLine 'sh', '-c', "protoc --encode=MyMessage src/main/proto/my_proto.proto < \
                  \"$inputFile\" > \"$outputDir/$inputFile.name\""
            }
        }
    }
}

android {
    applicationVariants.all { variant ->
        variant.registerResGeneratingTask(encodeData, encodeData.resDir)
    }
}

上述方法有效但仅在手动安装protoc时。我想改为使用pre-compiled protoc on Maven Central(就像recommended configuration of the protobuf plugin)。我从this thread进行货物拣选并抵达:

repositories { mavenCentral() }

configurations {
    proto_encode
}

dependencies {
    proto_encode 'com.google.protobuf:protoc:3.0.0'
}

println configurations['proto_encode'].singleFile

然而,这会产生错误Expected configuration ':app:proto_encode' to contain exactly one file, however, it contains no files.(我也尝试向依赖项添加artifact子句但不确定如何设置参数)。据推测,我需要以某种方式告诉Gradle这个工具将在主机上运行(作为构建过程的一部分)而不是目标(即Android设备),因此它知道要选择哪个版本。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

使用com.google.protobuf:protoc:3.0.0,您告诉Gradle您希望JAR工件具有默认(缺席)限定符。

相反,你必须告诉Gradle wich限定符和你想要的神器。如果你e。 G。想要64位Windows版本,您需要windows-x86_64作为限定符,exe作为工件类型,这将是com.google.protobuf:protoc:3.0.0:windows-x86_64@exe

因此,您需要确定当前正在构建的系统,然后相应地确定限定符。然后,您可以在依赖关系字符串中使用该确定的限定符。

http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.google.protobuf%22%20AND%20a%3A%22protoc%22,您可以看到您的依赖项存在哪些工件。