2015-09-28 90 views
11

如果您正在尋找樣本gradle protobuf項目看here簡單protobuf編譯與gradle

我有很難與gradle這個和protobuf的, 我想創建一個簡單的項目的gradle將從默認src/main/protosrc/test/proto據此採取任何原始文件,並將其編譯成src/main/javasrc/test/java,再包變成一隻罐子併發布到本地回購。

不幸的是,我是新來的gradle,不能弄清原始項目是如何組成的。

這是我未完成的build.gradle文件

apply plugin: 'java' 
apply plugin: "com.google.protobuf" 

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.0' 
    } 
} 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'com.google.protobuf:protobuf-java:3.0.0-beta-1' 
} 

sourceSets { 
    main { 
     proto { 
      srcDir 'src/main/proto' 
     } 
     java { 
      srcDir 'src/main/java' 
     } 
    } 
    test { 
     proto { 
      srcDir 'src/test/proto' 
     } 
     proto { 
      srcDir 'src/test/java' 
     } 
    } 
} 

protobuf { 
    // Configure the protoc executable 
    protoc { 
     // Download from repositories 
     artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3' 
    } 
    generateProtoTasks { 
     // all() returns the collection of all protoc tasks 
     all().each { task -> 
      // Here you can configure the task 
     } 

     // In addition to all(), you may get the task collection by various 
     // criteria: 

     // (Java only) returns tasks for a sourceSet 
     ofSourceSet('main') 

    } 
} 

乳寧jar任務後,我們有這樣的:

enter image description here

,你可以看到gradle這個建立測試和主PROTOS相同的classes目錄(紅色箭頭),在jar中我可以看到包含兩個生成的類(而測試應該跳過)。

但主要的問題是,我想使直接編譯原文件到相應的源目錄(藍色箭頭),後普通構建會做正確的事情......畢竟我們需要這些類的SRC來在業務邏輯中使用它們...

所以我們只需要一個任務,將proto編譯到合適的src目錄中......僅此而已。

src/main/proto to src/main/java 
src/test/proto to src/test/java 

當前的項目,因爲它位於here。請幫助配置這一點,我很確定很多人以後會需要它...

+0

請問你能分享一個可運行的例子嗎?我知道這將是未完成的。 – Opal

+0

肯定在一瞬間 – vach

+0

@Opal https://github.com/vach/sample-gradle-protobuf我會留下最後的工作版本供其他人使用 – vach

回答

12

如果我不誤解你的問題,它很容易解決。如果你不想讓自己和所產生的來源進行區分,你只需要添加設置generatedFileBaseDir這樣generateProtoTasks.generatedFilesBaseDir = 'src'

所以整個生成文件的樣子:

// ... 

protobuf { 
// Configure the protoc executable 
protoc { 
    // Download from repositories 
    artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3' 
} 

generateProtoTasks.generatedFilesBaseDir = 'src' // <- that line 

generateProtoTasks { 
    // all() returns the collection of all protoc tasks 
    all().each { task -> 
     // Here you can configure the task 
    } 

比你的文件夾的樣子:

  • 的src /主/ JAVA/COM/vach /試用/ AddressBookProtos.java
  • 的src /主/ JAVA/COM/vach /試用/ protobuf的/ Main.java

但是: 這可能不是混合生成與手工源代碼的最佳主意。所以我的建議是將源代碼生成到自己的目錄中,如generatedSources,並將此目錄添加到java sourceSet。構建文件應該是這樣的:

sourceSets { 
    main { 
     proto { 
      srcDir 'src/main/proto' 
     } 
     java { 
      // include self written and generated code 
      srcDirs 'src/main/java', 'generated-sources/main/java'    
     } 
    } 
    // remove the test configuration - at least in your example you don't have a special test proto file 
} 

protobuf { 
    // Configure the protoc executable 
    protoc { 
     // Download from repositories 
     artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3' 
    } 

    generateProtoTasks.generatedFilesBaseDir = 'generated-sources' 

    generateProtoTasks { 
     // all() returns the collection of all protoc tasks 
     all().each { task -> 
      // Here you can configure the task 
     } 

     // In addition to all(), you may get the task collection by various 
     // criteria: 

     // (Java only) returns tasks for a sourceSet 
     ofSourceSet('main') 

    } 
} 

您的目錄會這個樣子

  • 的src/main /原/ DTOS。原
  • 的src /主/ JAVA/COM/vach /試用/ protobuf的/ Main.java
  • 產生來源/主/​​ JAVA/COM/vach /試用/ AddressBookProtos.java

好用側效果是你可以忽略這個生成源目錄在你的git配置中。不要發佈生成的源代碼總是一個好主意。

+0

我不太明白爲什麼它認爲不好生成的代碼附近手工,即使是默認行爲將它分離到不同的目錄......後來protobuf是一種工具來生成DTOs是有效地序列化和反序列化自己...你在你的手工代碼中使用它們...如果你將它們分開到不同的目錄,你需要配置ide來了解aditional源代碼目錄...我沒有看到足夠好的理由這樣做... – vach

+0

我打算使用protobuf的方式是有一個小項目,其中包含將dtos.jar暴露給本地回購和其他項目的所有DTOs ... – vach

+0

@vach關於您的第一個問題 - 你爲什麼要從'書面代碼'中分離生成的代碼:這是一個有趣的事情。你可以在這裏找到一個討論:[http://stackoverflow.com/questions/893913/should-i-store-generated-code-in-source-control]。除了較小的提交之外,有些可能會意外更改生成的代碼。此外,刪除類型會變得更加困難(您必須刪除原始文件和Java文件)。 – TobiSH