Подтвердить что ты не робот

Простая сборка protobuf с помощью gradle

Если вы ищете образец проекта gradle protobuf, посмотрите здесь.

Мне сложно с gradle и protobuf, Я хочу создать простой проект gradle, который будет принимать любые прото файлы по умолчанию src/main/proto, src/test/proto и скомпилировать их в src/main/java, src/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 мы имеем следующее:

введите описание изображения здесь

как вы можете видеть, gradle строит как тестовые, так и основные протосы в один и тот же каталог классов (красные стрелки), в банке я могу видеть, что оба сгенерированных класса включены (в то время как тесты должны быть пропущены).

но главная проблема заключается в том, что я хочу сделать файлы компилировать proto напрямую в соответствующие исходные каталоги (синие стрелки), после чего обычная сборка сделает правильную вещь... В конце концов, нам нужны эти классы в src, чтобы использовать их в бизнес-логике...

Поэтому нам нужна только одна задача, которая компилирует proto в соответствующий каталог src... ничего более.

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

Текущий проект, так как он находится здесь. Пожалуйста, помогите настроить это, я уверен, что многие люди будут нуждаться в нем позже...

4b9b3361

Ответ 1

Если я не неправильно понимаю ваш вопрос, это довольно просто решить. Если вы не хотите различать свои собственные и сгенерированные источники, вам просто нужно добавить set generateFileBaseDir, как этот 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/главная/Java/COM/вак/проба/Protobuf/Main.java

НО: Это может быть не самая лучшая идея для смешивания генерации с исходным кодом ручной работы. Поэтому мое предложение состояло в том, чтобы сгенерировать исходный код в собственный каталог, например generateSources, и добавить этот каталог в 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/Основной/прото/dtos.proto
  • SRC/главная/Java/COM/вак/проба/Protobuf/Main.java
  • сгенерированные-источники/Основной/Java/COM/Вак/проба/AddressBookProtos.java

Хорошим побочным эффектом является то, что вы можете игнорировать этот источник сгенерированных источников в конфигурации git. Это всегда хорошая идея не публиковать сгенерированный исходный код.