云雀 - 一条规则可以从其标签访问另一条规则的属性吗?

Skylark - can a rule access the attributes of another rule from its label?

这个问题搭载this github issue。但是,我 运行 在另一个上下文中讨论了这个问题。

上下文

在 Bazel 中,有两个存储库规则,maven_jar 和 maven_server。

maven_jar(name, artifact, repository, server, sha1)

maven_server(name, repository, settings)

maven_jar 规则的服务器属性是指向某个 maven_server 目标的标签。

目前,只要提供服务器属性,maven_jar 规则就会出错。

我想完成的事情

在maven_jar的实现函数中,我想访问maven_server的属性。具体来说,我想按照以下方式做一些事情:

def _impl(rtx):
     settings_attr = rtx.attr.server.getSettings()

     # alternatively
     settings_attr = rtx.attr.server.getAttributes().settings

是否支持这种行为?如果没有,我有什么办法可以近似吗?

服务器属性是一个标签,所以我不确定是否可以使用其providers/aspects获得这些值。

存储库规则是宏,因此它们没有像 "normal" 规则那样的提供者。因此,如果您指定一个标签属性,它基本上必须是一个源文件。

由于 settings.xml 不应该是特定于项目的,我认为 maven_jar 使用 users/system 的 settings.xml 更有意义,如 Maven docs:

中所述

There are two locations where a settings.xml file may live:

  • The Maven install: ${maven.home}/conf/settings.xml
  • A user’s install: ${user.home}/.m2/settings.xml

The former settings.xml are also called global settings, the latter settings.xml are referred to as user settings. If both files exists, their contents gets merged, with the user-specific settings.xml being dominant.