Bazel: создайте js_library с другой связанной зависимостью JS (рабочие области пряжи)

У меня есть проект, который включает несколько пакетов JS и организован с помощью рабочих пространств Yarn:

      <root>
├── WORKSPACE
├── package.json
├── workspaces
│   ├── foo
│   │   ├── package.json
│   │   ├── BUILD.bazel
│   │   ├── src
    │
    ├── bar
    │   ├── package.json
    │   ├── BUILD.bazel
    │   ├── src

FOO пакет зависит от BAR пакет и он определен в FOO/package.json:

      workspaces/foo/package.json

{
  "name": "FOO",
  "dependencies": {
     "BAR": "link:../bar",
  }

workspaces/bar/BUILD.bazel выглядит так

      load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
js_library(
    name = "bar",
    package_name = "BAR",
    srcs = [
        "package.json",
        "index.js",
    ],
    visibility = ["//visibility:public"],
)

и здесь workspaces/foo/BUILD.bazel

      load("@build_bazel_rules_nodejs//:index.bzl", "js_library")

js_library(
    name = "foo",
    package_name = "FOO",
    srcs = [
        "package.json",
        "index.js",
    ],
    deps = [
         "//workspaces/bar:bar", 
         "@npm//:node_modules"    # <-- this line causes an error because linked package couldn't be found in node_modules
    ], 
    visibility = ["//visibility:public"],
)

а также WORKSPACE файл включает:

      yarn_install(
    name = "npm_foo",
    package_json = "//workspaces/foo:package.json",
    yarn_lock = "//workspaces/foo:yarn.lock",
    package_path = "workspaces/foo",
    strict_visibility = False,
    # links = {
    #     "bar": "//workspaces/bar",
    # },
    # generate_local_modules_build_files = True,
)

yarn_install(
    name = "npm",
    package_json = "//:package.json",
    yarn_lock = "//:yarn.lock",
)

yarn_install(
    name = "npm_bar",
    package_json = "//workspaces/bar:package.json",
    yarn_lock = "//workspaces/bar:yarn.lock",
    package_path = "workspaces/bar",
)

со всей этой настройкой я запускаю bazel build //workspaces/foo:fooи это не удается. Мне нужно настроить links или же generate_local_modules_build_files атрибуты в yarn_install? Или какие изменения необходимы для совместной работы связанных пакетов?

1 ответ

Поскольку рабочие области пряжи не поддерживаются rules_nodejs, у меня сработал следующий обходной путь:

здесь изменено workspaces/foo/BUILD.bazel

      load("@build_bazel_rules_nodejs//:index.bzl", "js_library")

# this list contains all dependencies from the top level `package.json` file
# do not include linked `bar` package!
DEPENDENCIES = [
  "@npm//react",
  "@npm//react-dom",
  ...
]

# node_modules filegroup includes all dependencies from workspaces/foo/node_modules
filegroup(
    name = "node_modules",
    srcs = glob(
        include = [
            "node_modules/**",
        ],
    ),
)

js_library(
    name = "foo",
    package_name = "FOO",
    srcs = [
        "package.json",
        "index.js",
    ],
    deps = [
         "//workspaces/bar:bar", 
         ":node_modules"
    ] + DEPENDENCIES, 
    visibility = ["//visibility:public"],
)

а также WORKSPACEфайл имеет только один yarn_installправило для верхнего уровня package.jsonпоскольку вложенные рабочие пространства рассматриваются как self-managed:

      yarn_install(
    name = "npm",
    package_json = "//:package.json",
    yarn_lock = "//:yarn.lock",
)
Другие вопросы по тегам