|
1 | 1 | ## 文件结构
|
2 |
| - gRPC APIs 应在`.proto`文件里用proto3 IDL定义。 |
| 2 | +gRPC APIs应使用proto3 IDL定义在`.proto`文件中。 |
3 | 3 |
|
4 |
| - 文件结构应该将高层级和更重要的定义放在其他项目之前。proto文件中每部分须按照以下顺序排列: |
5 |
| - * 版权和许可证,如果需要。 |
6 |
| - * `syntax`、`package`、`option`、`import`语句,他们要以此顺序排列。 |
7 |
| - * 让读者准备好阅读文件剩余内容的API概述文档。 |
8 |
| - * API proto文件的`service`定义要按照其重要性降序排列。 |
9 |
| - * RPC请求和响应`消息`的定义顺序应该和相关方法定义的顺序一致。若有请求消息,则其要优先于它的响应消息被定义。 |
10 |
| - * 资源`消息`定义。在子资源定义之前,其父资源必须先完成定义。 |
| 4 | +文件结构应该将更高层级和更重要的定义放在其它项目之前。在每个proto文件中,每个适用的部分应该遵循以下顺序: |
| 5 | +* 版权和许可证提示,如果需要。 |
| 6 | +* Proto的`syntax`、`package`、`option`和`import`语句,顺序分先后。 |
| 7 | +* API概述文档以供读者为阅读文件剩余内容做好准备。 |
| 8 | +* API proto的`service`定义,按其重要性降序排列。 |
| 9 | +* 用于RPC请求和响应的`message`定义,遵照与对应方法一致的顺序。若有请求消息,则其必须在它对应的响应消息之前。 |
| 10 | +* 资源`message`定义。父资源的定义必须在子资源之前。 |
11 | 11 |
|
12 |
| - 若一个proto文件包含了整个API的定义,则它的命名要与API一致: |
| 12 | +若一个proto文件包含了完整的API接口,则它应该以该API来命名: |
13 | 13 |
|
14 |
| -| API | Proto | |
15 |
| -|----------|:-------------:| |
16 |
| -| Library | Library.proto | |
17 |
| -| Calendar | Calendar.proto| |
| 14 | +API | Proto |
| 15 | +---------|--------------- |
| 16 | +Library | library.proto |
| 17 | +Calendar | calendar.proto |
18 | 18 |
|
19 |
| - 若.proto文件较大则可能会被分成多个文件。其中的服务、资源信息、请求/响应消息应该按需放至不同的文档里去。 |
| 19 | +大型.proto文件可以被分成多个文件。服务、资源信息、请求/响应消息应该按需被放到不同的文件里。 |
20 | 20 |
|
21 |
| - 我们建议将同一个服务的请求和响应放在同一个文件里。文件可命名为`<enclosed service name>.proto`。只包含资源的proto文件可命名为`resources.proto`。 |
| 21 | +我们建议将同一个服务的请求和响应放在同一个文件里。可以考虑将该文件命名为`<enclosed service name>.proto`。对只包含资源的proto文件,可以考虑将其命名为`resources.proto`。 |
22 | 22 |
|
23 |
| -### proto文件的名称 |
24 |
| - proto文件的名称最好使用`小写单词下划线互相分隔`的方式定义,且必须使用.proto的扩展名。例如:service_controller.proto。 |
| 23 | +### Proto文件名 |
| 24 | +proto文件名应该使用lower_case_underscore_separated_names并且必须使用`.proto`的扩展名。举个例子:service_controller.proto。 |
| 25 | + |
| 26 | +### Proto可选项 |
| 27 | +为了能跨APIs生成一致的的客户端库,API开发者必须在他们的`.proto`文件中使用一致的proto可选项。遵循本份指南的API定义必须使用以下文件级别的proto可选项: |
25 | 28 |
|
26 |
| -### proto选项 |
27 |
| - 为了能在不同API中生成一致的的客户端库,API开发者必须在`.proto`文件中使用一致的proto选项。遵循本份指导定义的API须使用以下proto选项: |
28 | 29 | ```
|
29 | 30 | syntax = "proto3";
|
30 | 31 |
|
31 |
| -// 包的名称应该以公司名称开头,以主版本号结尾 |
| 32 | +// 包的名称应该以公司名称开头,以主版本号结尾。 |
32 | 33 | package google.abc.xyz.v1;
|
33 | 34 |
|
34 |
| -// 该选项规定了使用在C#代码里的命名空间。一般proto包默认使用PascalCased版本,当包名的每个部分都由单个单词组成时PascalCased版本能正常使用。 |
35 |
| -// 例如,一个包名`google.shopping.pets.v1`在使用C#命名空间时会转换为`Google.Shopping.Pets.V1` |
36 |
| -// 如果包名某个部分由多个单词组成,就需要指定该选项,以免第一个字母变成大写。例如,谷歌宠物中心的API若有包叫做`google.shopping.petstore.v1`,在C#命名空间下包名是`Google.Shopping.Petstore.V1`。所以需要指定该选项将包名改为`Google.Shopping.PetStore.V1` |
| 35 | +// 该选项规定了将C#代码里使用的命名空间。一般proto包默认使用PascalCased版本,当包名的每个部分都由单个单词组成时PascalCased版本能正常使用。 |
| 36 | +// 例如,一个名为`google.shopping.pets.v1`的包会使用名为`Google.Shopping.Pets.V1`的C#命名空间。 |
| 37 | +// 但是,如果包名某个部分由多个单词组成,就需要指定该选项,以免只有首字母大写。例如,谷歌宠物中心的API若有包叫做`google.shopping.petstore.v1`则意味着在C#中命名空间将是`Google.Shopping.Petstore.V1`。相反的,应该使用该选项将它正确大写化为`Google.Shopping.PetStore.V1`。 |
37 | 38 | //
|
38 |
| -// 更多关于C#或.NET的信息,可在[框架设计指南](https://msdn.microsoft.com/en-us/library/ms229043)中查看。 |
| 39 | +// 更多关于C#或.NET字母大写规则的细节,请参阅[框架设计指南](https://msdn.microsoft.com/en-us/library/ms229043)。 |
39 | 40 | //
|
40 |
| -// 有个特殊情况:当使用了缩略词时,需要将缩略词全部大写。例如,`IOStream` 和 `OSVersion`, 而不能写成 `IoStream` 和 `OsVersion`。在API里要谨慎使用这些词,因为proto并不知道哪个词是缩写、哪个不是。比如命名空间中有`OSLogin` ,要是在同名信息里生成一个叫做`OsDetails`的类,就会导致不一致。若能确保消息或字段名中不会出现缩略词,那么使用常规的PascalCase是安全的。 |
| 41 | +// 关于字母大写有个特殊情况:当使用了缩略词时,需要将缩略词全部大写。例如,`IOStream` 和 `OSVersion`, 而不能写成 `IoStream` 和 `OsVersion`。在API里要谨慎使用这些词,因为proto并不知道哪个词是缩写、哪个不是。比如命名空间中有`OSLogin` ,要是在同名信息里生成一个叫做`OsDetails`的类,就会导致不一致。若能确保消息或字段名中不会出现缩略词,那么使用常规的PascalCase是安全的。 |
41 | 42 | //
|
42 |
| -// 对于预发布版本,Alpha/Beta应该以大写字母开头,举个例子应该是"V1Beta1",而不是"V1beta1"。 |
| 43 | +// 对于预发布版本,Alpha/Beta应该以大写字母开头,例如应该是"V1Beta1",而不是"V1beta1"。 |
43 | 44 | option csharp_namespace = "Google.Abc.Xyz.V1";
|
44 | 45 |
|
45 |
| -// 该选项让proto编译器能在包名而不是外部类中生成Java代码(见下)。通过减少一层名称嵌套能简化开发,并且可以和大多数不支持外部类的编程语言保持一致。 |
| 46 | +// 该选项让proto编译器能在包名而不是外部类中生成Java代码(见下)。通过减少一层名称嵌套能简化开发体验,并且可以和大多数不支持外部类的编程语言保持一致。 |
46 | 47 | option java_multiple_files = true;
|
47 | 48 |
|
48 |
| -// Java外部包类名应该是大写驼峰式。该类只用于保存proto的描述符,所以开发者无需直接使用它。 |
| 49 | +// Java外部类的名称应该是大写驼峰式。该类只用于保存proto的描述符,所以开发者无需直接使用它。 |
49 | 50 | option java_outer_classname = "XyzProto";
|
50 | 51 |
|
51 | 52 | // Java包名称必须是带有合适前缀的proto包名。
|
52 | 53 | option java_package = "com.google.abc.xyz.v1";
|
53 | 54 |
|
54 |
| -// 包生成的合理的Objective-C前缀。最短3个字符、全部大写并且惯例是使用包名的缩写。使用简短但独一无二的名称确保不会和将来可能出现的名称冲突。'GPB'作为保留字代表protocol buffer本身。 |
| 55 | +// 包生成的合理的Objective-C前缀。它应该最少有3个字符、全部大写并且约定使用包名的缩写。使用简短但足够独特的名称以确保不会和将来可能出现的名称冲突。'GPB'作为保留字代表protocol buffer本身。 |
55 | 56 | option objc_class_prefix = "GABCX";
|
56 | 57 |
|
57 |
| -// 该选项指定使用PHP代码里的命名空间。proto包默认使用PascalCased版本,若包名由单个单词组成时能正常使用。 |
| 58 | +// 该选项指定将会在PHP代码里使用的命名空间。proto包默认使用PascalCased版本,若包名由单个单词组成时能正常使用。 |
58 | 59 | // 例如,包名为"google.shopping.pets.v1",在PHP命名空间下会变成"Google\\Shopping\\Pets\\V1"。
|
59 |
| -// 然而,若包名某个部分由多个单词组成,就需要指定该选项,以免第一个字母变成大写。例如,谷歌宠物中心的API可能有一个包叫做`google.shopping.petstore.v1`,其在PHP命名空间下会变成`Google\\Shopping\\Petstore\\V1`。所以需要指定该选项使包名变成`Google\\Shopping\\PetStore\\V1` |
60 |
| -// 对于预发布版本,Alpha/Beta不该是以大写开头,举个例子应该是"V1beta1",而不是"V1Beta1"。注意这和C#命名空间中的预发布版本不同。 |
| 60 | +// 然而,若包名某个部分由多个单词组成,就需要指定该选项,以免只有首字母大写。例如,谷歌宠物中心的API可能有一个包叫做`google.shopping.petstore.v1`,其在PHP命名空间下会变成`Google\\Shopping\\Petstore\\V1`。相反的,应该使用该选项将它正确大写化为`Google\\Shopping\\PetStore\\V1`。 |
| 61 | +// |
| 62 | +// 对于预发布版本,Alpha/Beta不该是以大写开头,例如应该是"V1beta1",而不是"V1Beta1"。注意这和C#命名空间中的预发布版本不同。 |
61 | 63 | //
|
62 | 64 | option php_namespace = "Google\\Abc\\Xyz\\V1";
|
63 | 65 | ```
|
0 commit comments