存放區規則

回報問題 查看原始碼 。 。 。 。 夜間。 。 7.3 。 。 7.2 。 。 7.1 。 。 7.0 。 。 6.5

本頁面說明如何建立存放區規則,並提供 瞭解詳情

外部存放區是只能使用 ,並在載入階段啟用非密封的作業WORKSPACE 可在 Bazel 開始進行每項外部存放區規則都會建立自己的工作區, 具備 BUILD 檔案和構件若是依賴第三方 程式庫 (例如 Maven 封裝程式庫),但也會產生 BUILD 檔案 專屬於執行 Bazel 的主機

建立存放區規則

.bzl 檔案中,使用 repository_rule 函式來建立新的篩選條件 並儲存在全域變數中

自訂存放區規則的使用方式與原生存放區規則相同。這項服務 具有必要的 name 屬性,且建構檔案中每個目標 即 @<name>//package:target,其中 <name>name 屬性。

規則會在您明確建立或 建構過程在這種情況下,Bazel 會執行其 implementation 函式。這個 函式說明如何建立存放區、其內容和 BUILD 檔案。

屬性

屬性是做為字典,傳遞至 attrs 規則引數的規則引數。 屬性和其類型會在您定義 存放區規則將 urlsha256 屬性定義為範例 字串:

local_repository = repository_rule(
    implementation=_impl,
    local=True,
    attrs={
        "url": attr.string(mandatory=True)
        "sha256": attr.string(mandatory=True)
    }
)

如要在實作函式中存取屬性,請使用 repository_ctx.attr.<attribute_name>:

def _impl(repository_ctx):
    url = repository_ctx.attr.url
    checksum = repository_ctx.attr.sha256

所有 repository_rule 都有隱含定義的屬性 (就像建構一樣) 規則)。兩個隱含屬性為 name (如同建構規則) repo_mapping。存放區規則名稱可透過以下資源存取: repository_ctx.namerepo_mapping 的含意與 原生存放區規則 local_repositorynew_local_repository

如果屬性名稱的開頭是 _,此為私人屬性,使用者無法設定。

實作函式

每個存放區規則都需要 implementation 函式。這個 SDK 包含 規則的實際邏輯,並嚴格在「載入階段」中執行。

這個函式只有一個輸入參數 repository_ctx。函式 會傳回 None,表示有條件可重現該規則 或是帶有該規則參數的一組參數的字典 會將該規則轉化成可重現的存放區,並產生相同的存放區。適用對象 以追蹤 Git 存放區的規則為例 特定的修訂版本 ID,而不是原先使用的浮動分支版本 。

輸入參數 repository_ctx 可用於 存取屬性值,以及非密封函式 (尋找二進位檔、 執行二進位檔、在存放區建立檔案或下載檔案 來自網際網路)。詳情請參閱程式庫。 相關資訊範例:

def _impl(repository_ctx):
  repository_ctx.symlink(repository_ctx.attr.path, "")

local_repository = repository_rule(
    implementation=_impl,
    ...)

實作函式何時執行?

當 Bazel 需要 目標,例如當另一個目標 (在另一個存放區中) 存放區) 需要的依附元件,或出現在指令列中。 接著,預期函式會在檔案中建立存放區 有些人會將 Cloud Storage 視為檔案系統 但實際上不是這就是所謂的「擷取」存放區

與一般目標相比,在下列情況中,存放區不一定會重新擷取 會造成存放區不同的變更這是 因為 Bazel 無法偵測變更 每次建構作業都會造成過多負擔 (例如擷取的項目 )。因此,只有在其中一個 我們將進行下列變更:

  • 傳遞至 WORKSPACE 檔案。
  • Starlark 程式碼,內含存放區的實作。
  • 傳遞至 repository_ctx 的任何環境變數值 getenv() 方法,或使用 environ 屬性宣告的 repository_rule。設定值 這些環境變數,可以透過指令列使用 --repo_env 標記。
  • 傳遞至 read()execute() 和類似內容的任何檔案內容 由標籤參照的 repository_ctx 方法 (例如 //mypkg:label.txt,但不含 mypkg/label.txt)
  • 執行 bazel sync 時。

repository_rule 有兩個參數可控制存放區的時機 重新擷取:

  • 如果設定了 configure 標記,則只會在 bazel sync,如果 --configure 參數傳遞至該參數 (如果 屬性,這項指令不會重新擷取)
  • 如果設定了 local 旗標,除了上述情況外,存放區也會 當 Bazel 伺服器重新啟動,或有任何會影響 存放區變更的宣告 (例如 WORKSPACE 檔案或檔案) 載入容器時,不論這些變更是否造成 宣告內容

    在這種情況下,系統不會重新擷取非本機存放區。這是因為 這些存放區會假設與網路通訊,或以其他方式 。

重新啟動實作函式

在存放區正在運作時,您可以重新啟動實作函式 在要求的依附元件遺失時擷取。在此情況下, 實作函式會停止運作、解決缺少的依附元件, 依附元件解析完成後,系統就會重新執行該函式。目的地: 避免不必要的重新啟動 (成本高昂,因為網路存取可能 標籤引數則會預先擷取 (前提是所有) 標籤引數可解析為現有檔案。請注意,解決 只在執行期間建構的字串或標籤路徑 可能仍然會造成重新啟動

強制重新擷取外部存放區

外部存放區有時有可能過時,且無須變更 定義或依附元件舉例來說,存放區擷取來源可能 會追蹤第三方存放區的特定分支版本,而新的修訂版本 可在該分支版本上使用在這種情況下,您可以要求 bazel 重新擷取所有 呼叫 bazel sync 以無條件存取外部存放區。

此外,有些規則會檢查本機電腦,且可能會使 但本機機器在升級時 資料仍舊存在你可以請 bazel 來 系統只會重新擷取 repository_rule敬上 定義了 configure 屬性,請使用 bazel sync --configure

範例

  • C++ 自動設定工具鍊: 系統就會使用存放區規則 Bazel 的 C++ 設定檔,方法是尋找本機 C++ 編譯器, 環境和 C++ 編譯器支援的標記。

  • Go 存放區 使用多個 repository_rule 定義依附元件清單 才能使用 Go 規則

  • rules_jvm_external 建立 預設名為 @maven 的外部存放區,用於產生建構目標 針對遞移依附元件樹狀結構中的每個 Maven 構件。