Не удалось создать код Kotlin с прототипами с использованием Bazel - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь использовать скомпилированные прототипы в моем коде kotlin. Проектом управляет Базель. Поэтому я воспроизвожу проблему с простым проектом «HelloWorld».

WORKSPACE

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

RULES_KOTLIN_VERSION = "9051eb053f9c958440603d557316a6e9fda14687"

http_archive(
    name = "io_bazel_rules_kotlin",
    sha256 = "c36e71eec84c0e17dd098143a9d93d5720e81b4db32bceaf2daf939252352727",
    strip_prefix = "rules_kotlin-%s" % RULES_KOTLIN_VERSION,
    url = "https://github.com/bazelbuild/rules_kotlin/archive/%s.tar.gz" % RULES_KOTLIN_VERSION,
)

load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains")

kotlin_repositories()
kt_register_toolchains()


http_archive(
    name = "com_google_protobuf",
    strip_prefix = "protobuf-master",
    urls = ["https://github.com/protocolbuffers/protobuf/archive/master.zip"],
)

load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")

protobuf_deps()

BUILD

load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library")

load("@rules_java//java:defs.bzl", "java_binary", "java_lite_proto_library", "java_proto_library")
load("@rules_proto//proto:defs.bzl", "proto_library")

package(default_visibility = ["//visibility:public"])

proto_library(
    name = "clicklocation_proto",
    srcs = ["ClickLocation.proto"],
)

java_proto_library(
    name = "clicklocation_java_lite_proto",
    deps = [":clicklocation_proto"],
)

kt_jvm_library(
    name = "app_lib",
    srcs = ["Main.kt"],
    deps = [":clicklocation_java_lite_proto"]
)

java_binary(
    name = "myapp",
    main_class = "MyApp",
    runtime_deps = [":app_lib"],
)

Proto file

syntax = "proto2";

package objectrecognition;
option java_package = "com.kshmax.objectrecognition.proto";
option java_outer_classname = "ClickLocationProtos";
message ClickLocation {
    required float x = 1;
    required float y = 2;
}

Main. kt

import com.kshmax.objectrecognition.proto.ClickLocationProtos

class MyApp {
  companion object {
    @JvmStatic
    fun main(args: Array<String>) {
        val location = ClickLocationProtos.ClickLocation.newBuilder()
        location.x = 0.1f
        location.y = 0.2f
        location.build()
    }
  }
}

Я сделал это, как описано в примерах репозитория protocolbuffers / protobuf. Но я получил ошибку:

ошибка: не могут быть разрешены супертипы следующих классов. Убедитесь, что у вас есть требуемые зависимости в classpath: класс com.kshmax.objectrecognition.proto.ClickLocationProtos.ClickLocation, неразрешенные супертипы: com.google.protobuf.GeneratedMessageV3, класс com.kshmax.objectrecognition.proto.ClickLocationProtosOrced.lick : com.google.protobuf.MessageOrBuilder class com.kshmax.objectrecognition.proto.ClickLocationProtos.ClickLocation.Builder, неразрешенные супертипы: com.google.protobuf.GeneratedMessageV3.Builder

Что я делаю

1 Ответ

0 голосов
/ 21 февраля 2020

Код, который использует protobuf, должен зависеть от самой библиотеки protobuf. * ​​1001 *

Теоретически это можно экспортировать по правилу, но, поскольку оно не работает, я бы добавил dep напрямую к protobuf. аналогично BuildEventServiceTest

deps= [
  "@com_google_protobuf//:protobuf_java",
  "my_foo_java_proto",
]

или java_lite_proto_library / "@com_google_protobuf//:protobuf_java_lite", где удаленный репозиторий определен в WORKSPACE как

http_archive(
    name = "com_google_protobuf",
    patch_args = ["-p1"],
    patches = ["@io_bazel//third_party/protobuf:3.11.3.patch"],
    patch_cmds = EXPORT_WORKSPACE_IN_BUILD_FILE,
    patch_cmds_win = EXPORT_WORKSPACE_IN_BUILD_FILE_WIN,
    sha256 = "cf754718b0aa945b00550ed7962ddc167167bd922b842199eeb6505e6f344852",
    strip_prefix = "protobuf-3.11.3",
    urls = [
        "https://mirror.bazel.build/github.com/protocolbuffers/protobuf/archive/v3.11.3.tar.gz",
        "https://github.com/protocolbuffers/protobuf/archive/v3.11.3.tar.gz",
    ],
)

(я не уверен, что вам нужен патч, и может быть более свежая версия; посмотрите на пример )

...