rule

rule就是规则,一般分为bazel系统内置规则和用户自定义规则。
内置规则可在BUILD文件中通过load加载后直接使用。
自定义规则一般在.bzl扩展文件中实现,在BUILD文件同样适用load加载后调用。

内置规则(以c为例子)

规则说明
cc_library用于构建 C 或 C++ 库的规则。它接受源代码文件、头文件、编译选项等作为输入,并生成静态库或动态库文件作为输出。
cc_binary用于构建 C 或 C++ 可执行文件的规则。它接受源代码文件、头文件、依赖库等作为输入,并生成可执行文件作为输出。
cc_test用于构建 C 或 C++ 测试的规则。它接受测试源代码文件、头文件、依赖库等作为输入,并生成可执行的测试程序。
cc_import用于导入外部的 C 或 C++ 库的规则。它用于引入已经存在的库文件或第三方库,以便在项目中使用。
filegroup用于将一组文件打包为单个逻辑组,并在构建过程中一起处理。
exports_files用于将指定的文件或目录导出到目标的运行时环境中。
genrule用于执行任意命令并生成文件作为输出的规则。
data用于将文件或目录复制到目标的输出目录中,以供其他目标使用。
sh_binary用于构建和运行Shell脚本的规则。
container_image用于构建和管理容器镜像的规则。
setting_group用于将一组构建设置(如编译选项、宏定义、环境变量等)组织在一起,并在构建文件中使用。
string_flag用于接受命令行标志的字符串值作为输入。然后在构建文件中使用这个标志的值来配置不同的规则、目标或构建操作。

自定义规则

使用Starlark语言自定义规则函数,自定义规则一般放入.bzl文件中。

自定义规则分为三步:定义规则函数、注册规则、使用规则

定义规则函数

使用Starlark语言定义规则函数

custom_rules.bzl中

def rule_impl(ctx):   # ctx为上下文对象,可以调用上下文中的参数
	# 规则函数实现
	input_file = ctx.attr.input_file
	

注册规则

custom_rules.bzl中

my_rule = rule(
	implementation = rule_impl,
    attrs = {
        "input_file": attr.string(),
        "output_file": attr.string(),
    },	
)

使用规则

在BUILD文件中,通过load()函数,加载自定义规则。然后可以直接使用函数调用的方式使用规则。

# ":custom_rules.bzl"为规则文件的标签, my_rule是需要加载的自定义规则
load(":custom_rules.bzl", "my_rule")
# 调用规则
my_rule(
    name = "my_rule_target", 		# 指定调用规则后生成的目标名
    input_file= "input.txt",		# 自定义参数传递,将值“input.txt”传递给参数input_file
    output_file= "output.txt",
)
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐