サンプルgradle protobufプロジェクトを探している場合は、 here を参照してください。
私はgradleとprotobufに苦労しています。デフォルトのsrc/main/proto
、src/test/proto
からprotoファイルを取得し、それに応じてsrc/main/Java
、src/test/Java
にコンパイルし、それをjarにパックしてローカルリポジトリに公開する簡単なgradleプロジェクトを作成したいです。
残念ながら、私は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タスクを実行すると、次のようになります。
gradleが同じクラスディレクトリにテストとメインの両方のプロトをビルドするのを見ることができるように(赤い矢印)、jarに含まれる両方の生成されたクラスを見ることができます(テストはスキップする必要があります).
しかし、主な問題は、プロトファイルを適切なソースディレクトリに直接コンパイルしたいことです(青い矢印)、通常のビルドが正しいことをした後...結局のところ、ビジネスロジックで使用するには、srcのこれらのクラスが必要です...
したがって、protoを適切なsrcディレクトリにコンパイルするタスクが1つだけ必要です。
src/main/proto to src/main/Java
src/test/proto to src/test/Java
現在のプロジェクトはそのまま here にあります。これを設定するのを手伝ってください、私は多くの人々が後でそれを必要とすることをかなり確信しています...
あなたの質問を誤解しない限り、解決するのは非常に簡単です。独自のソースと生成されたソースを区別したくない場合は、このような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
}
あなたのフォルダは次のようになります:
BUT:これは、生成と手作りのソースコードを混在させるのに最適なアイデアではないかもしれません。したがって、私の提案は、ソースコードを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')
}
}
ディレクトリは次のようになります
素敵な副作用は、git設定でこのgenerated-sourcesdirを無視できることです。生成されたソースコードを公開しないことは常に良い考えです。