Все пакеты Bazel должны предоставлять свои файлы документации (или любой файл с заданным расширением) - PullRequest
0 голосов
/ 06 мая 2020

Bazel в последнее время отлично работает для меня, но я наткнулся на вопрос, на который еще не нашел удовлетворительного ответа:

Как можно собрать все файлы с определенным расширением из рабочей области ?

Другой способ сформулировать вопрос: как можно получить функциональный эквивалент выполнения glob() во всем рабочем пространстве Bazel?

Фон

Цель в частный случай - собрать все файлы уценки, чтобы запустить некоторые проверки и сгенерировать из них stati c сайт.

На первый взгляд, glob() звучит как хорошая идея, но остановится, как только запустится в файл BUILD.

Текущие подходы

Текущий подход состоит в том, чтобы запускать журнал сбора / генерации c вне песочницы, но это немного грязно, и мне интересно если есть способ, который является одновременно "правильным" и простым (ie, не требующим, чтобы каждый файл BUILD явно предоставлял свои файлы уценки.

Есть ли способ указать Если в рабочей области какие-то правила по умолчанию, которые будут добавлены ко всем файлам BUILD?

1 Ответ

2 голосов
/ 07 мая 2020

Вы можете написать аспект , чтобы агрегировать файлы уценки снизу вверх и создавать действия для этих файлов. Вот пример file_collector аспекта здесь . Я изменил аспект extensions для вашего варианта использования. Этот аспект объединяет все файлы .md и .markdown по целям на краях атрибута deps.

FileCollector = provider(
    fields = {"files": "collected files"},
)

def _file_collector_aspect_impl(target, ctx):
    # This function is executed for each dependency the aspect visits.

    # Collect files from the srcs
    direct = [
        f
        for f in ctx.rule.files.srcs
        if ctx.attr.extension == f.extension
    ]

    # Combine direct files with the files from the dependencies.
    files = depset(
        direct = direct,
        transitive = [dep[FileCollector].files for dep in ctx.rule.attr.deps],
    )

    return [FileCollector(files = files)]

markdown_file_collector_aspect = aspect(
    implementation = _file_collector_aspect_impl,
    attr_aspects = ["deps"],
    attrs = {
        "extension": attr.string(values = ["md", "markdown"]),
    },
)

Другой способ - выполнить запрос по целевым файлам (входным и выходным файлам, известным Bazel график действий) и обрабатывать эти файлы отдельно. Вот пример запроса .bzl файлов в репозитории rules_jvm_external:

$ bazel query //...:* | grep -e ".bzl$"
//migration:maven_jar_migrator_deps.bzl
//third_party/bazel_json/lib:json_parser.bzl
//settings:stamp_manifest.bzl
//private/rules:jvm_import.bzl
//private/rules:jetifier_maven_map.bzl
//private/rules:jetifier.bzl
//:specs.bzl
//:private/versions.bzl
//:private/proxy.bzl
//:private/dependency_tree_parser.bzl
//:private/coursier_utilities.bzl
//:coursier.bzl
//:defs.bzl
...