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:
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 ...
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 à:
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
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é.