Все пакеты 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