有没有办法将`Exec`作为依赖工件?

时间:2016-12-21 23:35:32

标签: java gradle

所以,这是我的困境。我正在用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可执行文件执行此操作。

我可以在这里使用一些神奇的咒语吗?

2 个答案:

答案 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"
}