AIP-191 文件和目录结构
| 编号 | 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 添加关于包选项的指南。
相关文章:
AIP-191 文件和目录结构
编号191原文链接https://google.aip.dev/191状态批准创建日期2019-07-25更新日期2019-07-25 统一的文件和目录结构,虽然在技术上差别不大,但可以让用户和审查者更容易阅读API界面定义。 指南 注意 以下指南适合于使用protobuf定义的API,例如…...
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这是系统中所有设备存放的目录,也就是系统中…...
LLM动态Shape实现原理与核心技术
LLM动态Shape实现原理与核心技术 目录 LLM动态Shape实现原理与核心技术1. **动态Shape核心原理**2. **实现方法与关键技术**3. **示例:vLLM处理动态长度输入**4. **动态Shape vs 静态Shape对比**5. **性能优化案例**总结`SamplingParams` 是什么常见参数及作用使用示例1. 动态…...
MyBatis 语法不支持 having 节点
MyBatis 不支持 having 节点 比如在 GROUP BY 之后添加了 HAVING 子句,其内容为SUM(vsbsad.business_income) > 0,该子句会对分组后的 SUM(vsbsad.business_income) 结果进行过滤,仅保留求和结果不为负数的分组记录。但是试过不支持。可把…...
【redis】事务详解,相关命令multi、exec、discard 与 watch 的原理
文章目录 什么是事务原子性一致性持久性隔离性 优势与 MySQL 对比用处 事务相关命令开启事务——MULTI执行事务——EXEC放弃当前事务——DISCARD监控某个 key——WATCH作用场景使用方法实现原理 事务总结 什么是事务 MySQL 事务: 原子性:把多个操作&am…...
数据库基础知识点(系列七)
视图和索引相关的语句 1.引入视图的主要目的是什么? 答:数据库的基本表是按照数据库设计人员的观点设计的,并不一定符合用户的需求。SQL Server 2008可以根据用户需求重新定义表的数据结构,这种数据结构就是视图。视图是关系数据…...
FreeRTOS 队列结构体 xQUEUE 深度解析
一、核心成员与功能设计 FreeRTOS 的队列结构体 xQUEUE 是任务间通信(IPC)的核心数据结构,通过统一的设计支持队列、信号量、互斥量等多种同步机制。其设计体现了 **"数据拷贝 结构复用"** 的理念,兼顾轻量化与扩展…...
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飞驰云联作为国内领先的企业文件传输与数据交换解决方案提供商,受邀出席了年会,并凭借卓越的…...
C++vector常用接口和模拟实现
C中的vector是一个可变容量的数组容器,它可以像数组一样使用[]进行数据的访问,但是又不像C语言数组空间是静态的,它的空间是动态可变的。 在日常中我们只需要了解常用的接口即可,不常用的接口查文档即可。 1.构造函数 //空构造…...
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…...
计算机二级WPS Office第七套WPS演示
解题过程...
2025-03-26 学习记录--C/C++-PTA 6-3 求链式表的表长
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 6-3 求链式表的表长 本题要求实现一个函数,求链式表的表长。 函数接口定义: &…...
【Mysql】事务管理:原理、操作与应用
文章目录 一、事务概述二、事务的特性(ACID)原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability) 三、事务的操作事务的提交方式查看和…...
PHP框架 ThinkPHP 漏洞探测分析
目录 1. PHP历史利用最多的漏洞有哪些? 2. 如何在信息收集的过程中收到框架信息?有什么根据? 3. ThinkPHP框架漏洞扫描有哪些工具?红队攻击有哪些方式? 漏洞扫描工具 红队攻击方式 4. TPscan工具的主要作用及实际…...
A Brief History: from GPT-1 to GPT-3
This is my reading notes of 《Developing Apps with GPT-4 and ChatGPT》. In this section, we will introduce the evolution of the OpenAI GPT medels from GPT-1 to GPT-4. GPT-1 In mid-2018, OpenAI published a paper titled “Improving Language Understanding …...
大模型在支气管肺癌预测及临床决策中的应用研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 二、大模型预测支气管肺癌的原理与技术基础 2.1 大模型简介 2.2 数据收集与预处理 2.3 模型训练与优化 三、术前预测 3.1 病情评估 3.1.1 肿瘤大小、位置及分期预测 3.1.2 转移风险预测 3.2 手术风险预测 3.2.1 患…...
SylixOS 中 select 原理及使用分析
1、select接口简介 1.1 select接口使用用例 select 是操作系统多路 I/O 复用技术实现的方式之一。 select 函数允许程序监视多个文件描述符,等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指:文件描述符不再是阻塞状…...
软考笔记——软件工程基础知识
第五章节——软件工程基础知识 软件工程基础知识 第五章节——软件工程基础知识一、软件工程概述1. 计算机软件2. 软件工程基本原理3. 软件生命周期4. 软件过程 二、软件过程模型1. 瀑布模型2. 增量模型3. 演化模型(原型模型、螺旋模型)4. 喷泉模型5. 基于构建的开发…...
FastGPT原理分析-数据集创建第二步:处理任务的执行
概述 文章《FastGPT原理分析-数据集创建第一步》已经分析了数据集创建的第一步:文件上传和预处理的实现逻辑。本文介绍文件上传后,数据处理任务的具体实现逻辑。 数据集创建总体实现步骤 从上文可知数据集创建总体上来说分为两大步骤: &a…...
基于Python的3D贴图制作技术研究与实践
摘要:本文深入探讨了利用Python进行3D贴图制作的技术,介绍了Python在3D图形领域的应用优势,阐述了3D贴图的基本原理和常见类型。详细讲解了借助Python的相关库,如Pillow、OpenCV、PyTorch3D开展3D贴图制作的流程,包括纹…...
【MySQL数据库】视图 + 三范式
视图 视图的基本介绍 MySQL中的视图(View)是一种虚拟的表,其内容是从一个或多个基本表中检索出来的。视图可以简化复杂的查询操作,提高查询效率,同时也可以对敏感数据进行安全性控制。下面是关于MySQL视图的一些基本…...
STM32学习笔记之存储器映射(原理篇)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
如何通过数据可视化提升管理效率
通过数据可视化提升管理效率的核心方法包括清晰展示关键指标、及时发现和解决问题、支持决策优化。其中,清晰展示关键指标尤为重要。通过数据可视化工具直观地呈现关键绩效指标(KPI),管理者能快速、准确地理解业务现状,…...
数据结构:利用递推式计算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); //中国 静态变量赋值…...
