Упаковка и доставка протокола, поэтому в наших средах сборки не требуется предварительно установленный протокол.

Чтобы иметь возможность генерировать классы из .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. Всегда используете "правильную" версию протокола для текущего проекта?


person Nikolas    schedule 20.12.2018    source источник


Ответы (1)


Стоит отметить, что сгенерированный Java-код для protobuf также привязан к конкретной версии JAR protobuf-java, и двоичная версия protoc также должна соответствовать ей. Так что учитывайте это при разработке своего процесса.

Если вы можете использовать Docker, вы можете использовать / сделать что-то вроде этого: https://github.com/namely/docker-protoc

Это решает проблему согласованной версии, локальной разработки, ветвей и т. Д. Вы можете легко создать свою собственную версию инструмента, на который есть ссылки, в соответствии с вашими потребностями.

Если это не вариант, вы можете рассмотреть возможность публикации артефакта protobuf в вашей системе сборки. Это решает вашу проблему согласованности, но это проблема для локальных разработчиков и ветвей. Это очень неприятно, но работает в крайнем случае.

person Nino Walker    schedule 20.12.2018