web-dev-qa-db-ja.com

gradleを使用した単純なprotobufのコンパイル

サンプルgradle protobufプロジェクトを探している場合は、 here を参照してください。

私はgradleとprotobufに苦労しています。デフォルトのsrc/main/protosrc/test/protoからprotoファイルを取得し、それに応じてsrc/main/Javasrc/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タスクを実行すると、次のようになります。

enter image description here

gradleが同じクラスディレクトリにテストとメインの両方のプロトをビルドするのを見ることができるように(赤い矢印)、jarに含まれる両方の生成されたクラスを見ることができます(テストはスキップする必要があります).

しかし、主な問題は、プロトファイルを適切なソースディレクトリに直接コンパイルしたいことです(青い矢印)、通常のビルドが正しいことをした後...結局のところ、ビジネスロジックで使用するには、srcのこれらのクラスが必要です...

したがって、protoを適切なsrcディレクトリにコンパイルするタスクが1つだけ必要です。

src/main/proto to src/main/Java
src/test/proto to src/test/Java

現在のプロジェクトはそのまま here にあります。これを設定するのを手伝ってください、私は多くの人々が後でそれを必要とすることをかなり確信しています...

20
vach

あなたの質問を誤解しない限り、解決するのは非常に簡単です。独自のソースと生成されたソースを区別したくない場合は、このような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/main/Java/com/vach/tryout/AddressBookProtos.Java
  • src/main/Java/com/vach/tryout/protobuf/Main.Java

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')

    }   
}

ディレクトリは次のようになります

  • src/main/proto/dtos.proto
  • src/main/Java/com/vach/tryout/protobuf/Main.Java
  • generated-sources/main/Java/com/vach/tryout/AddressBookProtos.Java

素敵な副作用は、git設定でこのgenerated-sourcesdirを無視できることです。生成されたソースコードを公開しないことは常に良い考えです。

17
TobiSH