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 添加关于包选项的指南。

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

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

相关文章

Win11+VS2022+CGAL5.6配置

1. CGAL库简介 CGAL(Computational Geometry Algorithms Library)是一个开源的计算几何算法库,主要用于处理几何问题和相关算法的实现。它提供了丰富的几何数据结构和高效算法,覆盖点、线、多边形、曲面等基本几何对象的表示与操…

手搓全自动文章多平台发布系统:5、跨页面接入playwright类,修改ui_components.py,整合到main.py

昨天已经要多上下文,单上下文的模块中测试成功了,今天要想法接入。 整理完成的所有代码如下: 结构如图: main.py import sys from PyQt6 import QtWidgets from modules.ui_components import TableManager # 导入界面类 import asyncio# 在主函数中使用 qasync 整合事…

涨薪技术|使用Dockerfile创建镜像

上次的推文内容中介绍了如何使用docker commit的方法来构建镜像,相反推荐使用被称为Dockerfile的定义文件和docker build命令来构建镜像。Dockerfile使用基本的基于DSL语法的指令来构建一个Docker镜像,之后使用docker build命令基于该Dockerfile中的指令…

rkipc的h265设置

资料的位置 源代码在luckfox-pico/project/app/rkipc/rkipc/src/rv1106_ipc/video/video.c中,使用了rkmpi库,参考资料为"doc/zh/media/Rockchip_Developer_Guide_MPI.pdf" 通道设置设置 H265的通道设置主要由rkipc_pipe_0_init完成&#xf…

成都国际数字影像产业园:打造数字影像产业新高地

成都国际数字影像产业园:打造数字影像产业新高地 成都国际数字影像产业园正致力于构筑数字影像产业的新高地,成为推动区域数字经济发展的重要引擎。 核心定位与目标 该园区精准定位于数字影像文创产业,旨在打造集内容创作、技术研发、人才…

各类神经网络学习:(三)RNN 循环神经网络(中集),同步多对多结构的详细解释

上一篇下一篇RNN(上集)RNN(下集) 同步多对多结构 1)结构详解 ①图解: ②参数含义: x t x_t xt​ :表示每一个时刻的输入; o t o_t ot​ :表示每一个时刻的输…

Perl 环境安装指南

Perl 环境安装指南 引言 Perl是一种广泛使用的解释型、动态编程语言,以其强大的文本处理能力和灵活性著称。本文将为您详细介绍Perl环境的安装过程,包括系统要求、安装步骤以及注意事项。 系统要求 在安装Perl之前,请确保您的计算机满足以下基本要求: 操作系统:Window…

【嵌入式学习2】C语言 - VScode环境搭建

目录 ## 语言分类 ## c语言编译器 ## VScode相关配置 ## 语言分类 编译型语言:C,C解释型语言:python,JS ## c语言编译器 分类GCC 系列MinGWCygwinMSVC系列一套编程语言编译器将GCC编译器和GNU Binutils移植到Win32平台下的产物…

qt+opengl 加载三维obj文件

1前面我们已经熟悉了opengl自定义顶点生成一个立方体,并且我们实现了立方体的旋转,光照等功能。下面我们来用opengl来加载一个obj文件。准备我们首先准备一个简单的obj文件(head.obj)。资源在本页下载 2 在obj文件里面&#xff0c…

0326-Java 字符串方法

package com.qc.字符串;import java.util.Arrays;public class Test {public static void main(String[] args) { // String x"hello";//字符串 char[] // x x"demo";//字符串拼接 // xx2450; // xxtrue; // System.out.println(x);//hellodemo2450t…

<command-line>:0:1: error: macro names must be identifiers m

报错::0:1: error: macro names must be identifiers 排查类很久 原来是: add_compile_definitions(_GLIBCXX_USE_CXX11_ABI$ABI_VERSION)写成了 add_compile_definitions(-D_GLIBCXX_USE_CXX11_ABI$ABI_VERSION)多了个 -D。

风光互补智慧路灯的灯杆设计有哪些要求?

嘿,朋友们!叁仟风光互补智慧路灯的灯杆设计那可是超级重要的事儿,得全方位综合考量各种因素,就是为了确保咱们的路灯能兼具超棒的功能性、绝对的安全性、无敌的美观性以及超厉害的耐用性!下面就来看看这些超赞的常见要…

06、RAG

LLM的知识仅限于它所接受到的训练数据。如果我们希望让它了解特定领域的专有知识,则可以使用下面的方式操作: 使用RAG使用专有数据对LLM进行微调RAG与数据微调方式结合使用 什么是RAG 简单地说,RAG就是把数据发送给LLM之前从数据中查找相关…

自然语言处理:第一百零二章 如何去掉DeepSeek R1思考过程

本人项目地址大全:Victor94-king/NLP__ManVictor: CSDN of ManVictor 写在前面: 笔者更新不易,希望走过路过点个关注和赞,笔芯!!! 写在前面: 笔者更新不易,希望走过路过点个关注和赞,笔芯!!! 写在前面: 笔者更新不易…

flink 安装与访问 ui

官方文档:First steps | Apache Flink 版本:v2.0.0 下载Flink Flink运行在所有类UNIX环境中,即Linux,Mac OS X和Cygwin(适用于Windows)。您需要安装Java 11。要检查安装的Java版本,请在终端中…

WPF TextBox实现键盘enter后实时读取TextBox中的值

代码 <TextBox Grid.Column"0" x:Name"textBox" Margin"10,5,0,5" TextWrapping"Wrap" Text"{Binding SendMessage,UpdateSourceTriggerPropertyChanged}" VerticalContentAlignment"Center" CaretBrush&qu…

PyTorch实现Transformer模型

首先&#xff0c;我得回顾一下Transformer的基本结构&#xff0c;确保自己没有记错。Transformer由编码器和解码器组成&#xff0c;每个编码器层包含多头自注意力机制和前馈网络&#xff0c;解码器层则还有编码器-解码器注意力。 接下来&#xff0c;用户需要的是手把手的代码解…

详细介绍sentinel的使用,并列举经常出的面试题以及答案

Sentinel 是一款由阿里巴巴开源的分布式系统的流量防卫系统&#xff0c;能够实时响应并满足高并发的流量控制需求。它提供了流量监控、流量控制、熔断降级、系统保护等核心功能&#xff0c;可帮助开发人员实时发现系统的流量异常并快速做出相应的限流策略。 Sentinel 的使用步…

mysql-connector-java-5.1.37.jarJava连接器

mysql-connector-java-5.1.37.jar是MySQL官方提供的Java连接器&#xff0c;用于在Java应用程序中与MySQL数据库进行通信。具体来说&#xff0c;这个JAR文件是MySQLJDBC驱动程序的一个版本&#xff0c;允许Java程序通过JDBC&#xff08;JavaDatabaseConnectivity&#xff09;接口…

Python基于Django的智能旅游推荐系统(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…