Чтобы иметь возможность генерировать классы из .proto-файлов, в моей системе должен быть установлен 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>
Поэтому каждый раз, когда я запускаю сборку, плагин генерирует мои классы. Все хорошо и хорошо. Но если мы посмотрим на плагин, то все еще остается жестким требованием, чтобы протокол был установлен в системе, вызывающей сборку: <protocExecutable>protoc</protocExecutable>
.
Теперь вопрос:
Для того, чтобы это «заработало», все наши разработчики, системы сборки, ... должны иметь одну и ту же версию буферов протокола в своей системе, иначе сгенерированный код может отличаться (или даже сломаться). Это также означает, что по мере того, как код стареет, мы, возможно, не сможем построить его на всех наших системах сборки, поскольку установленная версия протокола будет более новой (ну, я думаю, вы могли бы поспорить, чтобы установить один протокол для каждой версии и вызвать его, например, protocv3
), что потребует дополнительного обслуживания.
Есть ли что-то для протокола, например, система сборки gradle с их gradlew
, то есть сценарий, который попытается установить конкретный протокол в системе, которая запускает сборку до вызова компилятора? Таким образом, мы храним этот "protow" в нашей VCS вместе с исходным кодом, так же, как и в случае с gradlew. Всегда используете "правильную" версию протокола для текущего проекта?