Какая связь между DefaultInfo и PyInfo

Мне непонятно, в чем разница между transitive_files из исполняемых файлов DefaultInfo и Transitive_sources PyInfo. Они избыточны или есть важное отличие?

Например, у меня есть настраиваемое правило starlark, которому я хочу соответствовать как поставщик PyInfo, но я хочу добавить дополнительного поставщика, поэтому я не могу использовать собственное правило py_library.

    transitive_sources = [dep[PyInfo].transitive_sources for dep in ctx.attr.deps]
    return struct(providers = [
        DefaultInfo(
            files = depset(sources + outs),
            runfiles = ctx.runfiles(files = sources + outs, transitive_files = transitive_sources)
        ),
        PyInfo(
            transitive_sources = depset(direct = sources + outs, transitive = transitive_sources),
            imports = depset(
                direct = [_path_join(ctx.workspace_name, ctx.label.package, im) for im in ctx.attr.imports],
                transitive = [dep[PyInfo].imports for dep in ctx.attr.deps]
            )
        ),
        _EggLibraryInfo(aditional_info="other stuff"),
    ])

Я создаю избыточные депеты, чтобы удовлетворить этих поставщиков, что заставляет меня думать, что, возможно, я делаю это неправильно.

Я также пробовал другой метод перебора всех default_runfilesиз deps и использование runfiles.merge для DefaultInfo. В простых случаях эти методы кажутся эквивалентными, но я не знаю, есть ли другие сценарии, в которых подходы разошлись бы.

В документации PyInfo можно было бы использовать раздел о том, как transitive_sources вписывается в DefaultInfo и почему необходимо предоставить дополнительные механизмы за пределами runfiles. https://docs.bazel.build/versions/master/skylark/lib/PyInfo.html

1 ответ

DefaultInfo Базель знает тип:

  • files контролирует, какие файлы создаются, когда вы bazel build цель,
  • runfiles определяет, какие файлы должны присутствовать в песочнице при выполнении цели.

PyInfo используется исключительно правилами Python и используется для передачи метаданных потребителям.

Я предполагаю, что дублирование необходимо, потому что значения могут отличаться, поэтому удаление дублирования будет либо означать, что Bazel не создает / не включает нужные файлы, либо в правилах Python отсутствует информация.

Другие вопросы по тегам