web-dev-qa-db-fra.com

compilation simple de protobuf avec gradle

Si vous cherchez un exemple de projet de projet de protobuf de gradle ici .

J'ai du mal avec gradle et protobuf, je veux créer un projet gradle simple qui prendra tous les fichiers proto par défaut src/main/proto, src/test/proto et les compiler dans src/main/Java, src/test/Java en conséquence, puis mettez-le dans un bocal et publiez-le dans le référentiel local.

Malheureusement, je suis nouveau dans le domaine et je n'arrive pas à comprendre comment le projet original est composé.

Voici mon fichier build.gradle inachevé

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

    }
}

Après avoir exécuté la tâche du pot, nous avons ceci:

enter image description here

comme vous pouvez le voir, gradle construit à la fois le test et les protos principaux dans le même répertoire de classes (flèches rouges), dans le pot, je peux voir les deux classes générées incluses (tandis que les tests doivent être ignorés).

mais le problème principal est que je veux faire compiler les fichiers proto directement dans les répertoires source appropriés (flèches bleues), après que la construction ordinaire fera la bonne chose ... Après tout, nous avons besoin de ces classes en src pour les utiliser dans la logique métier ...

Nous n'avons donc besoin que d'une tâche qui compile la proto dans le répertoire src approprié ... rien de plus.

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

Le projet actuel tel qu'il se trouve ici . Aidez-nous à configurer cela, je suis sûr que beaucoup de gens en auront besoin plus tard ...

20
vach

Si je ne comprends pas mal votre question, elle est assez simple à résoudre. Si vous ne voulez pas faire la distinction entre les vôtres et les sources générées, il vous suffit d'ajouter un ensemble, le générateurFileBaseDir comme ceci generateProtoTasks.generatedFilesBaseDir = 'src'

Ainsi, le fichier de construction entier ressemble à:

// ...

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
    }

Que votre dossier ressemble à:

  • src/main/Java/com/vach/tryout/AddressBookProtos.Java
  • src/main/Java/com/vach/tryout/protobuf/Main.Java

MAIS: Ce n'est peut-être pas la meilleure idée de mélanger générer avec du code source artisanal. Donc, ma suggestion serait de générer le code source dans un propre répertoire comme generatedSources et d'ajouter ce répertoire au Java sourceSet. Le fichier de construction ressemblerait à ceci:

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

    }   
}

Votre répertoire ressemblera à ceci

  • src/main/proto/dtos.proto
  • src/main/Java/com/vach/tryout/protobuf/Main.Java
  • sources-générées/main/Java/com/vach/tryout/AddressBookProtos.Java

Un bon effet secondaire est que vous pouvez ignorer ce répertoire sources générées dans votre configuration git. C'est toujours une bonne idée de ne pas publier le code source généré.

17
TobiSH