为了能够从 .proto 文件生成类,我必须在我的系统上安装protoc 。然后我可以手动指示 protoc 编译我的 .proto 文件。然后我可能会想到利用我们的构建系统来实现这一点,例如有一个 maven 插件可以很好地完成这项工作,我会像这样添加它:
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
<configuration>
<protocExecutable>protoc</protocExecutable>
</configuration>
</execution>
</executions>
</plugin>
所以每次我触发构建时,插件都会生成我的类。一切都很好。但是如果我们看一下插件,在调用 build: 的系统上安装 protoc 仍然是一个硬性要求<protocExecutable>protoc</protocExecutable>
。
现在的问题是
为了让它“工作”,我们所有的开发人员、构建系统……必须在他们的系统上拥有完全相同的协议缓冲区版本,否则生成的代码可能会有所不同(甚至中断)。这也意味着,随着代码变旧,我们可能无法在所有构建系统上构建它,因为安装的 protoc 版本会更新(我猜你可能会争辩为每个版本安装一个 protoc 并使用 eg 调用它protocv3
)这将需要额外的维护。
protoc 是否有一些东西,比如 gradle 构建系统对它们的gradlew
, 所以基本上是一个脚本,它会尝试在调用编译器之前在运行构建的系统上安装特定的 protoc?这样我们就可以将“protow”与源代码一起冷存储在我们的 VCS 中,就像使用 gradlew 一样。总是为当前项目使用“正确”的协议版本?