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文件。

2. Common rule definitions

3. "Make" variables

4. BUILD style guide

posted @ 2020-04-26 00:47  不写诗的诗人小安  阅读(4509)  评论(0编辑  收藏  举报