如何在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设备),因此它知道要选择哪个版本。有什么建议吗?
答案 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,您可以看到您的依赖项存在哪些工件。