Правило Linting / формата для всего проекта - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь создать правило, которое связывает весь мой код (все языки, которые я использую в этом проекте). Но мне трудно это сделать.

Как я уже сказал, лучшая идея, которая пришла мне в голову, чтобы ограничить весь проект, - создать правило lint и поместить в него все правила обработки ( eslint для js & ts, golang/lint для go, et c ...).

Вот мое текущее правило:

# //:rules/lint.bzl

load("@npm//eslint:index.bzl", "eslint")

def _lint(ctx):
  # js / ts
  eslint(
    name = "eslint",
    args = [
      "\"**/*.{ts, js}\"", # I don't think this is going to work, maybe with `location`?
    ],
  )

lint = rule(
  implementation = _lint,
)

И в моем root s BUILD.bazel:

# //:BUILD.bazel

load("//:rules/lint.bzl", "lint")

lint(name = "lint")

Если я попытаюсь bazel run //:lint, то получится следующее:

ERROR: Cannot run target //:lint: Not executable

И с bazel build:

ERROR: /home/anatole/dev/Iris/BUILD.bazel:12:1: in lint rule //:lint:
Traceback (most recent call last):
        File "/home/anatole/dev/Iris/BUILD.bazel", line 12
                lint(name = 'lint')
        File "/home/anatole/dev/Iris/rules/lint.bzl", line 4, in _lint
                eslint(name = "eslint", <1 more arguments>)
        File "/home/anatole/.cache/bazel/_bazel_anatole/dea21c474582f8d9afdfb2cbf2e414cf/external/npm/eslint/index.bzl", line 11, in eslint
                nodejs_binary(<5 more arguments>)
rule() can only be called during the loading phase
ERROR: Analysis of target '//:lint' failed; build aborted: Analysis of target '//:lint' failed; build aborted

И я понятия не имею, почему, потому что, если я непосредственно добавлю правило eslint в мои root BUILD.bazel, оно не выдаст никакой ошибки (но все еще есть эта проблема **/*.{ts, js}).

Может быть, есть лучший способ сделать все это, я начинаю с Базеля.

1 Ответ

1 голос
/ 08 января 2020

Похоже, вы больше ищете макрос, который может собрать кучу правил, а не пользовательское правило звездного знака.

Попробуйте сначала заставить eslint работать так, как вам нужно в файле BUILD.bazel, который может выглядеть следующим образом:

load("@npm//eslint:index.bzl", "eslint")

eslint(
  name = "eslint",
  srcs = glob(["**/*.js", "**/*.ts"]),
)

Затем, когда это сработает, вы можете переместить это в макрос в отдельном файле bzl:

lint.bzl:

load("@npm//eslint:index.bzl", "eslint")

def lint():

  eslint(
    name = "eslint",
    srcs = glob(["**/*.js", "**/*.ts"]),
  )

Тогда ваш eslint вызов в исходном файле BUILD.bazel может стать:

load("//lint:lint.bzl", "lint")

# other rules

lint()
...