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",
)