Базель: Как использовать правило nodeJS_binary для выполнения npm run start? - PullRequest
0 голосов
/ 18 сентября 2018

Как использовать правило nodejs_binary для стандартного запуска npm. Я могу запустить типичный проект узла, используя это правило. Однако я хочу запустить скрипт запуска в package.json. Пока у меня есть следующее в моем файле сборки

load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary")

nodejs_binary(
    name = "app",
    data = [":app_files"],
    node="@nodejs//:bin/npm",
    entry_point = "workspace_name/src/server.js",
    node_modules = "@npm_deps//:node_modules",
    args=["start"]
)

Это не запускает сервер .. как-то команда npm работает неправильно. это указывает на использование команды в неполной.

В настоящее время я могу сделать это в РАБОЧЕМ ПРОСТРАНСТВЕ

bazel run @nodejs//:bin/yarn (запускает установку пряжи и устанавливает все узлы-модули)

bazel run @nodejs//:bin/npm start (запускается сервер)

В моем package.json у меня есть

{
  "scripts": {
    "start": "babel-node src/server.js",
   ...
  }
...
}

Мне нужно, чтобы это работало с правилом nodejs_binary и впоследствии node_image

Я перешел от использования npm к использованию yarn..workspace_name / src / server.js .. сейчас вызывается, но потом у меня возник другой набор проблем, babel-node не был найден. Я немного изменил правило. После тщательного изучения ... я понимаю, что существует зависимость от babel-узла, которая не удовлетворяется во время вызова запуска пряжи. Следующее сработало после того, как я запустил bazel run @nodejs//:bin/yarn до запуска правила.

nodejs_binary(
    name = "app",
    args = ["start"],
    data = [
        ":app_files",
        "@//:node_modules",
    ],
    entry_point = "workspace_name/src/server.js",
    node = "@nodejs//:bin/yarn",
    node_modules = "@npm_deps//:node_modules",
)

Похоже, что "@//:node_modules" решает проблему зависимости вавилонского узла. Таким образом, вышеприведенное правило не работает само по себе ... мне нужно сделать bazel run @nodejs//:bin/yarn (больше похоже на установку npm / yarn, чтобы сделать node_modules, которые содержат зависимость babel-node, доступными при запуске запуска npm / yarn)

Так что моя проблема в том, что я не хочу вручную запускать bazel run @nodejs//:bin/yarn перед выполнением моего правила. Как мне это сделать. Я полагаю, что это сработало бы, если бы я перестал зависеть от babel-узла ... но тогда мне пришлось бы изменить свой код, чтобы не использовать синтаксис es6 (что является суетой). Есть ли способ, которым я могу сделать это с помощью genrule? или что-то ...

1 Ответ

0 голосов
/ 28 сентября 2018

Я закончил тем, что сделал правило babel nodejs_binary. Затем использовал это для компиляции моих исходных файлов в генеральном правиле

# Make babel binary
nodejs_binary(
    name = "babel",
    entry_point = "npm_deps/node_modules/babel-cli/bin/babel",
    install_source_map_support = False,
    node_modules = "@npm_deps//:node_modules",
)

# Compile source files with babel
genrule(
    name = "compiled_src",
    srcs = [
        ":src_files",
    ],
    outs = ["src"],
    cmd = "$(location babel) src  --out-dir $@",
    tools = [":babel"],
)

Обратите внимание, что в этом случае src в cmd = "$(location babel) src --out-dir $@" является папкой в ​​файловой группе :src_files.

filegroup(
    name = "src_files",
    srcs = glob([
        "src/**/*",
        ...
    ]),
)

После этого было не нужно использовать npm start, просто использовал узел по умолчанию. Я мог бы просто сделать

nodejs_binary(
    name = "app",
    data = [":compiled_src"],
    entry_point = "workspace_name/src/server.js",
    node_modules = "@npm_deps//:node_modules",
)
...