bazel系列之BUILD文件
1. Functions
https://docs.bazel.build/versions/0.18.1/be/functions.html#workspace
package
package(default_deprecation, default_testonly, default_visibility, features)
这个函数为本package内的后续规则声明元数据(metadata)。在一个package内,至多使用一次。
package()函数应该紧随 load() 语句之后,在文件的顶端,其他规则之前。
参数
属性 | 描述 |
default_visibility |
labels列表,可选参数 设置包内规则的默认可见性 package内每条rule的可见性都由此属性来指定,除非个别rule以其他方式指定可见性。 了解更多细节,可关注visibility属性。此属性不用于 exports_files,因为它默认是public的。 |
default_deprecation |
字符串,可选参数 为包内所有规则设置默认的deprecation信息。 |
default_testonly |
布尔值,可选参数;默认是0 为包内所有规则设置testonly属性。 javatests下的包内,默认值是1. |
features |
字符串列表,可选参数 设置各式各样的能够影响BUILD文件语义的flag。 不推荐使用。 |
例子
下面的声明式声明了包内规则仅对 //foo:target包组的成员可见。规则上独立的可见性声明,如果有的话,将会覆盖此声明。
package(default_visibility = ["//foo:target"])
package_group
package_group(name, packages, includes)
此函数定义了一个package集合,并给它取了一个label。 这个label可以在 visibility属性中引用。
package group常用于可见性控制。你可以把一个rule的访问权授予一个或多个package group、代码数下的每一个rule或者只有同package下的rule。更多详情,请参考下文的visibility系统。
参数
属性 | 描述 |
name |
名字,必须字段 该rule的唯一的名字 |
packages |
package列表,可选参数 package group内所有package的完整枚举。 packages应该以它们的全名引用,以双斜线开始的形式。例如,//foo/bar/main 是此列表的一个有效的元素。 你也可以使用通配符:如//foo/...指定//foo下的所有package,包括//foo自身。 指定package时,可以通过加“-”前缀,表示排除、排斥。如“-//foo/bar/...”意思是排除//foo/bar下的所有package。当和includes一起使用时,package group里的package要一并计算,联合结果:一个package group的排除模式(negative pattern)不会影响包含进来的package group结果。 如果该属性缺失,那么package group就不包含package,但它仍然可以include其他的package group。 |
includes |
标签列表,可选参数 此package_group中包含的其他package group。 includes属性中所列label,必须指向其他package group。引用到的package group里的package,自然作为此package group的一部分。这是有传递性的,如package group a包含b,b包含c,那么c里的所有package都是a的成员了。 |
例子
下面的package_group声明指定了一个叫“tropical”的package group,包含了热带水果(tropical fruits)
package_group( name = "tropical", packages = [ "//fruits/mango", "//fruits/orange", "//fruits/papaya/...", ], )
下面的声明指定了一个虚构app的package group
package_group( name = "fooapp", includes = [ ":controller", ":model", ":view", ], ) package_group( name = "model", packages = ["//fooapp/database"], ) package_group( name = "view", packages = [ "//fooapp/swingui", "//fooapp/webui", ], ) package_group( name = "controller", packages = ["//fooapp/algorithm"], )
licenses
licenses(license_types)
license()函数指定build规则的 license 类型。license指令应该出现在BUILD文件的开头部分,在build rules之前,因为它是设置BUILD文件范围的所有rule的license type。
参数
参数license_types是license-type字符串的一个列表
有效的license types包括:
- restricted
- reciprocal
- notice
- permissive
- unencumbered
licenses(["notice"]) # MIT license exports_files(["jquery-2.1.1.js"])
exports_files
exports_files([label, ...], visibility, licenses)
exports_files()指定一个属于此package的文件列表,导出给其他package使用。这些文件往往未在BUILD文件中提及。
一个package的BUILD文件,一般只会引用其他package的BUILD文件提及到的文件,作为一个rule的输入或输出。其余文件并不与特定的rule相关联,仅仅是“data”。exports_files就可以保证这些文件也可以被其他package引用到(这对于shell脚本之类的数据特别有用)。
参数
参数就是当前package内的文件名字。同时,也可以指定一个visibility声明;如此,文件将对指定target可见。如果没有指定visibility,文件将对每个package可见,即便package的默认可见性已在package函数中指定。licenses也可以指定。
例子
下面的例子导出golden.txt,test_data package里的一个文本文件,以使其他package引用。例如,tests的data属性。
# from //test_data/BUILD exports_files(["golden.txt"])
glob
Glob例子
递归Glob例子
扩展Glob例子
select
例子
workspace
workspace(name = "com_example_project")
此函数只可用在WORKSPACE文件中。
每个仓库的WORKSPACE文件都应该有 workspace(name = "...") 这么一行,为此仓库设立一个全局的名字。
这个名字是用作存储该仓库的runfiles的。例如,有一个foo/bar的runfile在本地仓库,WORKSPACE包含 workspace(name = "baz"),那么runfile将会在 mytarget.runfiles/baz/foo/bar 下可用。如果没有指定workspace name,runfile将会符号链接到 bar.runfiles/foo/bar。
workspace的name必须以字母开始,可以包含字母、数字 、下划线。应该以反向DNS的格式来描述这个project,以下划线区分各元素。例如,一个项目在域名 example.com/some-project,那么你应该使用com_example_some_project作为workspace名。
Remote repository规则的名字必须是有效的workspace名。例如,maven_jar(name = "foo")可以,但是maven_jar(name = "foo.bar")却不行,因为bazel会尝试写一个包含workspace(name = "foo.bar")的WORKSPACE文件。