Bazel: как использовать правило nodeJS_binary для запуска запуска npm

Как использовать правило 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 не работает должным образом. это указывает на неполное использование команды.

В настоящее время я могу сделать это в WORKSPACE

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 не был найден. Я изменил правило a кусочек. После тщательного изучения... я понимаю, что существует зависимость от babel-node, которая не выполняется в момент запуска запуска пряжи. Следующее сработало после того, как я запустил 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" решает проблему зависимости от узла babel. Таким образом, вышеприведенное правило не работает само по себе... мне нужно выполнить bazel run @nodejs//:bin/yarn (больше похоже на установку npm/yarn, чтобы сделать node_modules, которые содержат зависимости babel-node, доступными при запуске npm/yarn start)

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


person flexxxit    schedule 18.09.2018    source источник
comment
Привет, я знаю Bazel, но не знаю Node. Можете ли вы успешно построить правило и просто запустить его неправильно? Как именно происходит сбой команды npm, есть ли сообщение об ошибке, или она просто запускается с неправильными аргументами, или Bazel запускает что-то другое, чем вы ожидаете?   -  person László    schedule 18.09.2018
comment
@László Вы можете проверить мой обновленный вопрос. Но чтобы ответить на ваш вопрос... в настоящее время я могу создавать и запускать, но только при определенных условиях. Я надеюсь, что мои обновления к вопросу имеют больше смысла.   -  person flexxxit    schedule 18.09.2018


Ответы (1)


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

# 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",
)
person flexxxit    schedule 28.09.2018