使用 gradle 进行简单的 protobuf 编译

2024-04-25

如果您正在寻找示例 gradle protobuf 项目,请查看here https://github.com/google/protobuf-gradle-plugin/tree/master/examples/exampleProject.

我在 gradle 和 protobuf 上遇到了困难, 我想创建一个简单的 gradle 项目,它将采用默认的任何原始文件src/main/proto, src/test/proto并将它们编译为src/main/java, src/test/java相应地,然后将其打包到 jar 中并发布到本地存储库。

不幸的是,我是 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 中我可以看到两个生成的类都包含在内(而测试应该被跳过)。

但主要问题是我想做直接将 proto 文件编译到适当的源目录(蓝色箭头),之后普通构建将执行正确的操作...毕竟我们需要 src 中的这些类才能在业务逻辑中使用它们...

所以我们只需要一项任务,将 proto 编译到适当的 src 目录......仅此而已。

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

当前项目所在位置here https://github.com/vach/sample-gradle-protobuf。请帮助配置这个,我很确定很多人稍后会需要它......


如果我没有误解你的问题,解决起来很简单。如果您不想区分自己的源和生成的源,您只需添加设置 generatedFileBaseDir ,如下所示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:将生成与手工制作的源代码混合起来可能不是最好的主意。所以我的建议是将源代码生成到自己的目录中,例如生成的源并将该目录添加到 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 配置中的 dir。不发布生成的源代码始终是一个好主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 gradle 进行简单的 protobuf 编译 的相关文章

随机推荐

  • 是否可以同时从多个 Mercurial 存储库中提取数据?

    我希望能够做这样的事情 hg pull http server repo1 http server repo2 http otherserver repo 并让所有变更集立即下来 添加了 x 变更集 并对 z 文件进行了 y 更改 消息聚合
  • 如何在java中使用布尔值对ArrayList进行排序?

    我有一个带有自定义对象的 ArrayList 它们包含一个我想要排序的复选框对象 我正在使用这个比较器函数对其进行排序 我使用 XOR 运算符来检查它们是否彼此相等 然后将其取反 然而 这不起作用 并且列表保持相同的顺序 有谁知道出了什么问
  • 适用于 Littler 或 Rscript 的外部图形设备

    我真的很喜欢 Littler 对于使用 R 编写脚本非常有用 但我不知道如何使用 gnuplot 中的外部图形设备 例如使用 Octave 我能够生成所需的图表 但我必须使用 Sys sleep 并且我不想这样做 因为我想以交互方式自行关闭
  • 如果图像尺寸太大,在 SQL Server 中存储图像的最佳方式是什么?

    是否可以在 SQL Server 中存储大小为 3GB 的图像 我知道这似乎是不切实际的场景 但我很好奇是否可以以任何方式将图像保存在数据库中 微软建议您使用文件流 https msdn microsoft com en GB librar
  • 在 GCC 中启用严格浮点模式

    我还没有创建一个程序来查看 GCC 是否需要它通过 当我这样做时 我想知道如何启用严格的浮点模式 这将允许在运行和计算机之间重现结果 谢谢 编译用 msse2在支持它的 Intel AMD 处理器上 您几乎就可以实现这一目标 不要让任何库将
  • Selenium WebDriver jQuery

    我对 Selenium WebDriver 非常陌生 我正在学习如何使用 jQuery 选择器来处理元素 而不是使用 XPath 表达式 ID 等 您能否提供一个链接来帮助我 在该链接中我可以找到有关如何在 Selenium WebDriv
  • Linux 中的 C 聊天室 / Socket 编程

    我有一个简单的服务器和客户端 C 代码来使用线程 pthread 库 为多客户端创建一个聊天室 我一直遇到的问题是 我无法想出一种方法让服务器将客户端通过套接字发送到所有其他客户端的每条消息写入 我在这里读过其他类似的帖子 但很无奈 请帮助
  • 使用 JavaScript/AngularJS 将数组转换为对象

    我需要将父数组内的数组转换为对象以匹配我的数据库模型数据 我有这样的数组 emails Array 2 0 email protected cdn cgi l email protection 1 email protected cdn c
  • 多个挑选事件干扰

    我有几个数据系列分散在一个图中 并且希望能够为它们切换注释 问题是 有时会触发两个拾取事件 当用户单击注释和点内的点时 注释 拾取事件会清除注释 但 点 拾取事件会将其放回原处 因此效果是切换不起作用 df pd DataFrame a n
  • R 使用值列表作为色标

    我想将变量的值表示为 R 中散点中的点的颜色 x lt rnorm 100 5 y lt rnorm 100 5 plot x y 在这里 我想使用一个变量作为着色的输入 但如果我尝试 plot x y col x 我得到了一些奇怪的东西
  • 递归算法无法在指定时间内完成测试

    我正在进行一项测试 需要二进制断层扫描算法 提供了一组 38 个测试值来测试正确性 但完成所有测试也有 1 CPU 秒的时间限制 问题如下 如果存在 m n 矩阵 A 且每个元素为 0 或 1 则输出 Yes 使得 否则输出 否 对于每个测
  • 在以下任何来源中均未找到插件 [id: 'org.jetbrains.kotlin.jvm', 版本: '1.2.71']

    我全新安装了 IntelliJ 使用以下设置创建了一个新的 kotlin gradle 项目 这会生成以下 build gradle kts 完全相同的文件在我的 Windows 计算机上运行 import org jetbrains ko
  • 创建可以传递参数而无需创建新组件的函数

    我的问题与这个问题有关React用于渲染函数中的绑定函数 以下不是好的做法 render div 因为每次重新渲染都会向页面添加一个新功能 最终导致浏览器内存不足 解决方案是这样做 constructor this callFunction
  • Google Chrome 中 array.splice() 的时间复杂度是多少?

    如果我使用 splice 从数组中删除一个元素 如下所示 arr splice i 1 这会是O n 在最坏的情况下 因为它会移动 i 之后的所有元素 或者它是常数时间 下面有一些链表魔法 最坏的情况下should be O n 复制所有n
  • .NET:属性何时实例化?我可以获得它们所修饰的类型的引用吗?

    关于属性的两个问题 属性类什么时候实例化 当第一次访问类型时 还是在开始执行时 从属性类中 我可以找出该属性是为哪种类型实例化的吗 我的想法是 我想列出程序集中应用了我的属性的所有类的列表 我当然可以通过反射和检查来迭代所有这些 但如果该属
  • r中的模糊字符串匹配

    我有 2 个数据集 每个数据集超过 100K 行 我想根据匹配一列 电影标题 的模糊字符串以及使用发布日期来合并它们 我提供了下面两个数据集中的样本 数据集 1 itemid userid rating time title release
  • 更改 UISearchBar 的大小

    无法找到答案 也无法做我想做的事 CGSize searchBarSize self searchDisplayController searchBar frame size searchBarSize width
  • 如何使用 URLSession 从 url 获取 JSON 数据?

    我正在开发一个 iOS 应用程序 我必须从中获取数据this url https dl dropboxusercontent com s 2iodh4vg0eortkl facts json 我可以看到这个 url 包含 JSON 数据 所
  • Android FloatingActionButton 带有片段和底部导航栏

    我正在创建一个具有以下结构的 Android 应用程序 主要活动有一个底部导航栏 可在 3 个不同的片段之间切换 其中 2 个片段将显示项目列表 并使用浮动操作按钮 FAB 添加新项目 第三个片段将显示不同的内容 不需要 FAB 基于此 F
  • 使用 gradle 进行简单的 protobuf 编译

    如果您正在寻找示例 gradle protobuf 项目 请查看here https github com google protobuf gradle plugin tree master examples exampleProject