AIP-191 文件和目录结构

news2025/3/30 15:40:45
编号191
原文链接https://google.aip.dev/191
状态批准
创建日期2019-07-25
更新日期2019-07-25

统一的文件和目录结构,虽然在技术上差别不大,但可以让用户和审查者更容易阅读API界面定义。

指南

注意 以下指南适合于使用protobuf定义的API,例如Google内部使用的API。本指南的主要思想同样适合于使用其他规范性语言或格式定义的API,但有些具体建议可能无效。

语法

使用protocol buffer定义API时 必须 使用 proto3 语法。

同一个包

使用protocol buffer定义的API, 必须 在同一个包中定义独立的API,包名 必须 以版本号结尾。例如:

syntax = "proto3";

package google.cloud.translation.v3;

Google API 必须 位于和protocol buffer package 指令一致的目录中。例如,上述包对应的目录为 google/cloud/translation/v3 。

文件名

将API定义分拆成多个文件通常很有用。文件名 必须 使用 snake_case 。

API 应当 有一个显著的“入口”文件,通常以API本身命名。具有少量接口的API(例如Google Cloud Pub/Sub的 Publisher 和 Subscriber ) 可以 为每个服务设置独立的入口文件。

只有一个文件的API 应当 使用与API名字一致的文件名。

API service 和远程过程调用请求及应答 message 应当 在同一文件中定义。

请记住,文件名通常会成为客户端库中的模块名,客户会在 import 或 use 语句中使用它们。因此,选择一个描述性强,并且不包含语言关键字的文件名非常重要。例如名为 import.proto 的文件在Python中可能会遇到问题。

注意 版本 不得 用作文件名,这会在客户端库中产生奇怪的导入语句。禁止使用诸如 v3.proto 或 v1beta1.proto 的文件名。

文件布局

在文件中,高级别和重要定义 应当 放在低级别和次要定义之前。

在proto文件中,组件 应当 按以下顺序排列。每个部分之间 应当 用空行分隔:

  • 版权和许可证声明(如果需要)。
  • proto syntax 语句。
  • proto package 语句。
  • 任何 import 语句,按字母序排列。
  • 文件级别的 option 语句。
  • 服务 service 定义。
    • 方法 应当 按照所使用的资源分组,标准方法 应当 放在自定义方法之前。
  • 资源 message 定义。上级资源 必须 在下级资源之前定义。
  • 远程过程调用请求和应答 message 定义,按相应方法的顺序排列。每个请求消息 必须 在其对应的应答消息(如果有)之前。
  • 其他 message 定义。
  • 顶级 enum 定义。

包选项

protocol buffer可以包含选项,声明生成代码的包或名字空间(取决于目标编程语言)。例如,声明 go_package 或 csharp_namespace 将会覆盖自动推断的包名。

定义API时,遵守以下规则:

  • Java
    • 必须 设置 java_package 。正确的值通常是带有顶级域名前缀的proto包名。例如 com.google.example.v1 。
    • 必须 将 java_multiple_files 设置为 true 。
    • 必须 设置 java_outer_classname , 应当 将其设置为proto文件名,使用 PascalCase 并添加后缀 Proto 。例如 LibraryProto 。
  • 其他语言
    • 对于其他语言的包或名字空间指令, 必须 要么在proto包的每个文件中都设置,要么全都不设置。如果设置了,每个文件中的值 必须 相同。
    • 如果proto包的某部分是复合名字(例如accessapproval), 必须 指定C#、Ruby和PHP选项,以处理 PascalCase 分词位置。例如:
      option csharp_namespace = "Google.Cloud.AccessApproval.V1";
      option php_namespace = "Google\\Cloud\\AccessApproval\\V1";
      option ruby_package = "Google::Cloud::AccessApproval::V1";
      
    • go_package 值直接取决于Go代码的管理方式,即模块名字是基于VCS还是使用远程导入路径。但二者通常具有相同结构。
      • 模块 可能 因产品领域而异,例如 google.cloud.accessapproval.v1 出现在模块 cloud.google.com/go/accessapproval 中。
      • 包导入路径 应当 从proto包派生。
      • proto包名中的API版本 应当 以 api 为前缀,例如proto包名中的 v1 变为 apiv1 。
      • 导入路径末端 应当 基于proto包名中的产品名字,并且 必须 以 pb 为后缀,例如 accessapproval 变为 accessapprovalpb 。
      • 具体值 应当 由管理生成代码的团队决定。

所有包选项 应当 按名字的字母序排列。关于语言包选项的更多信息,请参考Protocol Buffer文档。

重要 虽然Java之外的其他语言对于没有复合名字的API有合理的默认值,但请注意, 添加 选项(值不等于默认值)将对该语言客户端产生破坏性更改。在发布proto时,请确认省略选项是有意为之的。

理由

Java包选项

将选项 java_multiple_files 设置为 true 可以获得更清晰的文件结构。它让 protoc 为每个Protocol Buffer类型创建独立的输出文件,从而允许更细粒度的导入。选项 java_outer_classname 必须配合 java_multiple_files 选项使用。它让 protoc 将每个Protocol Buffer类型包装在Java类中,类名字是选项值。这可以防止生成的类之间存在名字冲突。

Go包选项

Go包选项由管理生成代码的团队决定,因为它与团队的源代码管理实践有直接关系。允许每个proto包自行决定其Go包,将导致代码管理出现不一致和摩擦。在Go客户端团队内部,保持统一的Go包名字结构对于统一的用户体验至关重要。

修订记录

  • 2024-06-13 添加Go包选项指南。
  • 2024-06-05 添加Java包选项理由。
  • 2023-02-24 添加关于protocol buffer语法的指南。
  • 2022-10-18 添加关于Ruby/PHP/C#选项的指南。
  • 2019-11-18 添加关于包选项的指南。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql结尾加刷题

找了一下mysql对extractvalue()、updatexml()函数的官方介绍https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html#function_extractvalue ExtractValue(xml_frag, xpath_expr) 知识点 解释一下这两个参数xml_frag,是xml标记片段,第二个参数…

Linux学习笔记(应用篇三)

基于I.MX6ULL-MINI开发板 LED学习GPIO应用编程输入设备 开发板中所有的设备(对象)都会在/sys/devices 体现出来,是 sysfs 文件系统中最重要的目录结构 /sys下的子目录说明/sys/devices这是系统中所有设备存放的目录,也就是系统中…

【redis】事务详解,相关命令multi、exec、discard 与 watch 的原理

文章目录 什么是事务原子性一致性持久性隔离性 优势与 MySQL 对比用处 事务相关命令开启事务——MULTI执行事务——EXEC放弃当前事务——DISCARD监控某个 key——WATCH作用场景使用方法实现原理 事务总结 什么是事务 MySQL 事务: 原子性:把多个操作&am…

数据库基础知识点(系列七)

视图和索引相关的语句 1.引入视图的主要目的是什么? 答:数据库的基本表是按照数据库设计人员的观点设计的,并不一定符合用户的需求。SQL Server 2008可以根据用户需求重新定义表的数据结构,这种数据结构就是视图。视图是关系数据…

3.3 Taylor公式

1.定义 1.1 taylor公式 1.2 麦克劳林公式 1.3 推论 1.4 拉格朗日余项和皮亚诺型余项 2. 例题 3.几种特殊函数的麦克劳林展开

2000-2019年各省地方财政行政事业性收费收入数据

2000-2019年各省地方财政行政事业性收费收入数据 1、时间:2000-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政行政事业性收费收入 4、范围:31省 5、指标说明:地方财政行政事业…

Ftrans飞驰云联受邀参加“2025汽车零部件CIO年会“并荣获智象奖

2025年3月6日,由栖观汽车、栖观资讯和飞羽商务主办的“2025第二届中国汽车&零部件CIO年会暨智象奖颁奖盛典”于上海盛大召开,Ftrans飞驰云联作为国内领先的企业文件传输与数据交换解决方案提供商,受邀出席了年会,并凭借卓越的…

oracle查询归档日志使用量

1.统计最近30天的数据 SELECT TRUNC(first_time, DD) "日期", SUM(blocks * block_size) / 1024 / 1024 / 1024 "大小(GB)" FROM v$archived_log WHERE first_time > SYSDATE - 30 -- 统计最近30天的数据 GROUP BY TRUNC(first_time, DD) ORDER BY 1 D…

2025-03-26 学习记录--C/C++-PTA 6-3 求链式表的表长

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 6-3 求链式表的表长 本题要求实现一个函数,求链式表的表长。 函数接口定义: &…

PHP框架 ThinkPHP 漏洞探测分析

目录 1. PHP历史利用最多的漏洞有哪些? 2. 如何在信息收集的过程中收到框架信息?有什么根据? 3. ThinkPHP框架漏洞扫描有哪些工具?红队攻击有哪些方式? 漏洞扫描工具 红队攻击方式 4. TPscan工具的主要作用及实际…

SylixOS 中 select 原理及使用分析

1、select接口简介 1.1 select接口使用用例 select 是操作系统多路 I/O 复用技术实现的方式之一。 select 函数允许程序监视多个文件描述符,等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指:文件描述符不再是阻塞状…

软考笔记——软件工程基础知识

第五章节——软件工程基础知识 软件工程基础知识 第五章节——软件工程基础知识一、软件工程概述1. 计算机软件2. 软件工程基本原理3. 软件生命周期4. 软件过程 二、软件过程模型1. 瀑布模型2. 增量模型3. 演化模型(原型模型、螺旋模型)4. 喷泉模型5. 基于构建的开发…

FastGPT原理分析-数据集创建第二步:处理任务的执行

概述 文章《FastGPT原理分析-数据集创建第一步》已经分析了数据集创建的第一步:文件上传和预处理的实现逻辑。本文介绍文件上传后,数据处理任务的具体实现逻辑。 数据集创建总体实现步骤 从上文可知数据集创建总体上来说分为两大步骤: &a…

STM32学习笔记之存储器映射(原理篇)

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

如何通过数据可视化提升管理效率

通过数据可视化提升管理效率的核心方法包括清晰展示关键指标、及时发现和解决问题、支持决策优化。其中,清晰展示关键指标尤为重要。通过数据可视化工具直观地呈现关键绩效指标(KPI),管理者能快速、准确地理解业务现状&#xff0c…

数据结构:利用递推式计算next表

next 表是 KMP 算法的核心内容,下面介绍一种计算 next 表的方法:利用递推式计算 如图 6.3.1 所示,在某一趟匹配中,当对比到最后一个字符的时候,发现匹配失败(s[i] ≠ t[j])。根据 BF 算法&…

每日算法-250326

83. 删除排序链表中的重复元素 题目描述 思路 使用快慢指针遍历排序链表。slow 指针指向当前不重复序列的最后一个节点,fast 指针用于向前遍历探索。当 fast 找到一个与 slow 指向的节点值不同的新节点时,就将 slow 的 next 指向 fast,然后 …

trino查询mysql报Unknown or incorrect time zone: ‘Asia/Shanghai‘

问题 trino查询mysql时报Error listing schemas for catalog mysql: java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.,trino的日志中看到Unknown or incorrect time zone…

java学习笔记7——面向对象

关键字:static 类变量 静态变量的内存解析: 相关代码: public class ChineseTest {public static void main(String[] args) {System.out.println(Chinese.nation); //null 没赋值前System.out.println(Chinese.nation); //中国 静态变量赋值…