所以,这是我的困境。我正在用gradle构建,需要生成一些protobuf类。我知道有一个插件,但它只适用于gradle 2.12+,这使得我的构建比我使用的那个(2.8)慢两倍,所以我不想升级。
我做了这样的任务:
task protoc << {
exec {
commandLine = ['protoc', "--proto_path", "${projectDir}/src/main/proto", "--java_out", "src/gen/main/java"] + protoFiles
}
}
并且它有效...但现在我必须告诉所有想要构建的人先安装protoc
。
这里有一个maven工件:https://mvnrepository.com/artifact/com.google.protobuf/protoc
显然提供了可执行文件,但我无法弄清楚如何告诉gradle下载然后执行。我知道如何为javaexec
而不是非java可执行文件执行此操作。
我可以在这里使用一些神奇的咒语吗?
答案 0 :(得分:2)
我认为它应该有效:
plugins {
id "com.google.osdetector" version "1.3.1"
}
repositories {
jcenter()
}
configurations {
protoc
}
dependencies {
protoc "com.google.protobuf:protoc:3.1.0:${osdetector.classifier}@exe"
}
task executeProtoc(type: Exec) {
executable configurations.protoc.singleFile
args "--proto_path", "${projectDir}/src/main/proto"
args "--java_out", "src/gen/main/java"
args protoFiles
}
答案 1 :(得分:0)
您可以使用以下内容:
import org.gradle.internal.os.OperatingSystem
apply plugin: 'java'
repositories {
mavenCentral()
}
configurations {
protoc
}
dependencies {
Map platformMapping = [
(OperatingSystem.WINDOWS) : 'windows-x86_32',
(OperatingSystem.MAC_OS) : 'osx-x86_32'
].withDefault { 'linux-x86_32' }
protoc "com.google.protobuf:protoc:3.1.0:${platformMapping.get(OperatingSystem.current())}@exe"
}
task copyProtoc(type: Copy) {
from configurations.protoc
into "$buildDir/protoc"
}