2016-12-21 59 views
1

所以,这是我的困境。我正在用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

,我认为它应该工作:

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 
} 
+0

我不得不改变这'命令行= [configurations.protoc.singleFile, “--proto_path” ,“$ {projectDir}/src/main/proto”..]' - 由于某种原因,你写下它的方式失败了(“Missing input file” - 看起来像protoc没有得到args)为什么,我很久以前就放弃了试图找出Gradle语法背后的逻辑,只是使用任何作品:) 否则,工作很棒!谢谢你的帮助! – Dima

+0

嗯...我猜,我说得太快了:( 它对我来说是在当地工作的,但现在我在jenkins上得到了这个:'不能运行程序“/home/jenkins/.gradle/caches/modules-2/files -2.1/com.google.protobuf/protoc/2.6.1/49565269d355231128f9689f0cc050725bcea6fd/protoc-2.6.1-linux-x86_64.exe“:error = 13,Permission denied' 任何想法? – Dima

+0

可能您应该设置可执行标志为这个文件在linux平台上:)尝试添加如下内容: 'doFirst {Runtime.runtime.exec(“chmod + x”+ configurations.protoc.singleFile)}'在任务部分 –

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" 
} 
相关问题