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