Как добавить зависимости Maven (например, Volley, Gson) в Bazel для проекта Android? - PullRequest
0 голосов
/ 29 мая 2018

Прямо сейчас я делаю вот так

deps = [
   ":tensorflow_native_libs",
   "//tensorflow/contrib/lite/java:tensorflowlite",
   "@androidsdk//com.android.support:appcompat-v7-25.0.0",
   "@androidsdk//com.android.volley:volley:1.1.0",
   "@androidsdk//com.google.code.gson:gson:2.6.2"
],

внутри android_binary.Но я получаю эту ошибку:

ОШИБКА: / home / abhi / Рабочий стол / Git / SENA-28 / tenenflow / SenDetect / BUILD: 24: 1: // SenDetect: sendetect: неверная метка '@ androidsdk // com.android.volley: volley: 1.1.0 'в элементе 3 атрибута' deps 'в' android_binary 'правило: недопустимое имя цели' volley: 1.1.0 ': имена целей могут не содержать': '

1 Ответ

0 голосов
/ 29 мая 2018

По состоянию на апрель 2019 года:

Обновление: rules_jvm_external - это новый набор правил, разработанный командой Bazel для транзитивного извлечения и разрешения артефактов.

В этом случаефайл WORKSPACE будет содержать что-то вроде этого:

load("@rules_jvm_external//:defs.bzl", "maven_install")

maven_install(
    artifacts = [
        "com.android.volley:volley:1.1.0",
        "com.google.code.gson:gson:2.6.2",
        "com.android.support:design:27.0.2",
        "com.android.support:support_annotations:jar:27.0.2",
    ],
    repositories = [
        "https://jcenter.bintray.com",
        "https://maven.google.com",
    ]
)

Затем в файле BUILD вы можете напрямую зависеть от Volley и Gson следующим образом:

android_library(
    name = "my_lib",
    srcs = # ...
    deps = [
        "@maven//:com_android_volley_volley",
        "@maven//:com_google_code_gson_gson",
        "@maven//:com_android_support_design",
        "@maven//:com_android_support_support_annotations",
    ],
)

По состоянию на май 2018 года:

И gmaven_rules, и maven_jar устарели.Пожалуйста, не используйте их больше.

Из документации docs.bazel.build , отредактированной с дополнительными соответствующими инструкциями:

Зависимости Maven, размещенные в Центральном репозитории Maven

Используйте правило хранилища maven_jar для зависимостей Maven, не размещенных в Google Maven.Например, чтобы использовать Volley 1.1.0 и Gson 2.6.2, добавьте следующие строки в файл WORKSPACE на верхнем уровне каталога проекта:

maven_jar(
    name = "com_android_volley_volley",
    artifact = "com.android.volley:volley:1.1.0",
)

maven_jar(
    name = "com_google_code_gson",
    artifact = "com.google.code.gson:gson:2.6.2",
)

Затем вы можете зависеть от нихв ваших BUILD файлах:

android_library(
    name = "my_app_lib",
    srcs = [..],
    deps = [
        "@com_android_volley_volley//jar",
        "@com_google_code_gson//jar",
    ],
)

Обратите внимание, что maven_jar является не переходным, поэтому он не загружает зависимости указанного jar.Вам нужно будет вручную указать дополнительные правила maven_jar для транзитивных зависимостей или использовать инструмент, подобный bazel-deps, для их автоматического создания.

Зависимости Maven, размещенные в репозитории Google Maven (https://maven.google.com)

Для зависимостей, размещенных в Репозиторий Google Maven , @gmaven_rules предоставляет простой способ извлечения зависимостей, размещенных в gmaven_artifact, путем указания артефактакоординаты напрямую.

Чтобы использовать @gmaven_rules, добавьте эти строки в файл WORKSPACE:

# Google Maven Repository
GMAVEN_TAG = "20180513-1"    
http_archive(
    name = "gmaven_rules",
    strip_prefix = "gmaven_rules-%s" % GMAVEN_TAG,
    url = "https://github.com/bazelbuild/gmaven_rules/archive/%s.tar.gz" % GMAVEN_TAG,
)
load("@gmaven_rules//:gmaven.bzl", "gmaven_rules")
gmaven_rules()

Затем загрузите макрос gmaven_artifact в начале файла BUILD виспользуйте его:

load("@gmaven_rules//:defs.bzl", "gmaven_artifact")

android_library(
    name = "my_app_lib",
    srcs = glob(["java/**/*.java"]),
    deps = [
        gmaven_artifact("com.android.support:design:aar:27.0.2"),
        gmaven_artifact("com.android.support:support_annotations:jar:27.0.2"),
    ]
    # ...
)

В отличие от maven_jar, gmaven_artifact является транзитивным, поэтому вам нужно только указать координату артефакта, а @gmaven_rules разрешитзависимости автоматически.

...