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

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

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

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

Задний план

В данном конкретном случае цель состоит в том, чтобы собрать все файлы уценки для выполнения некоторых проверок и создания из них статического сайта.

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

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

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

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

1 ответ

Вы можете написать аспект для этого, чтобы агрегировать файлы уценки снизу вверх и создавать действия над этими файлами. Вот пример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
Другие вопросы по тегам