Какая связь между DefaultInfo и PyInfo - PullRequest
2 голосов
/ 01 мая 2020

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

Например, у меня есть пользовательское правило 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. В простых случаях эти методы выглядят эквивалентно, но я не знаю, существуют ли другие сценарии ios, в которых подходы расходятся.

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

1 Ответ

1 голос
/ 03 мая 2020

DefaultInfo - это известный тип Bazel:

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

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

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

...