是否有办法在每次bazel调用时执行local=True的存储库_规则?

是否有办法在每次bazel调用时执行local=True的存储库_规则?,bazel,Bazel,我有一个repository_规则,它正在查询本地系统是否有一个数据库正在运行,并且是否已完全迁移 # impl result = ctx.execute(["mysql", "-u", "root", "--protocol", "tcp", "-e", "select * from %s.flyway_schema_history" % ctx.attr.dbname]) ctx.file( "local_checksum", """

我有一个repository_规则,它正在查询本地系统是否有一个数据库正在运行,并且是否已完全迁移

# impl
    result = ctx.execute(["mysql", "-u", "root", "--protocol", "tcp", "-e", "select * from %s.flyway_schema_history" % ctx.attr.dbname])

    ctx.file(
        "local_checksum",
        """
             {RETURN_CODE}
             {STDERR}
             {STDOUT}
             """.format(
            RETURN_CODE = result.return_code,
            STDERR = result.stderr,
            STDOUT = result.stdout,
        ),
    )
...

# Rule Def
local_database = repository_rule(
    implementation = _local_database,
    local = True,
    configure=True,
    attrs = {
        "datasource_configuration": attr.label(providers = [DataSourceConnectionInfo]),
        "dbname": attr.string(doc = """
        If omitted, will be the name of the repository.
        """),
        "migrations": attr.label_list(allow_files = True),
    },
)
本地_校验和会重新计算,并在依赖关系图发生变化时执行其工作(如文档中所述)


但是,由于数据库不是由bazel管理的,有没有办法在每次调用bazel时强制运行此特定规则,以确保所有依赖项都可用?

经过一些睡眠后,我拼凑了一些东西。仍然在寻找更好的答案,我认为有一个一流的方法来解决这个问题

我在tools/bazel创建了一个bazel包装器

#/bin/bash
set-e
回声“`日期`
由tools/bazel“>.bazelexec.stamp生成
#从https://github.com/grpc/grpc/blob/master/tools/bazel
exec-a“$0”${BAZEL_REAL}”$@
然后我在规则中添加了一个用于读取该文件的属性:

local\u database=repository\u规则(
实现=\u本地\u数据库,
本地=真,
configure=True,
属性={
“datasource_配置”:属性标签(提供程序=[DataSourceConnectionInfo]),
“dbname”:属性字符串(doc=”“”
如果省略,将是存储库的名称。
"""),
“迁移”:属性标签列表(允许文件=True),
“重新计算时”:属性标签列表(允许文件=True,doc=”“”
要监视的文件在更改时将触发存储库运行。
您可以将tools/bazel脚本添加到本地存储库,并编写带有日期的文件
每次执行bazel时,为了让迁移器检查每个bazel运行,如果
有人更改了数据库。
"""),
},
最后,我在规则中为这些文件创建路径,以便存储库认为其图形已更改

#如果不处理文件,则规则不会重新计算。
[ctx.attr.recompute\u中文件的ctx.path(文件)何时重新计算]
#总mysql黑客现在…需要java工具转储不同数据库的表的内容
结果=ctx.execute(
[“mysql”、“-u”、“root”、“--protocol”、“tcp”、“-e”、“show databases”],
)
ctx.xml文件(
“本地数据库校验和”,
"""
{RETURN_CODE}
{STDERR}
{STDOUT}
“”格式(
RETURN\u CODE=result.RETURN\u CODE,
STDERR=result.STDERR,
STDOUT=result.STDOUT,
),
)
现在,每当我运行build时,如果数据库发生变化,本地校验和文件也会发生变化,并且可以触发其他规则来重新构建(在我的例子中,我生成的是jooq类,所以我的查询进入到表中),如果数据库和表是稳定的,那么它不会触发重建