2016-12-21 57 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" 
} 
相關問題