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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM