本頁面說明如何定義存放區規則,並提供 瞭解詳情
「外部存放區」是一種目錄樹狀結構
包含可在 Bazel 建構作業中使用的來源檔案
執行相應的存放區規則。您可以用很多方式定義調整
但最後,每個存放區是由叫用存放區規則來定義,就像
建構目標是由叫用建構規則所定義。這類函式的用途是
第三方程式庫 (例如 Maven 套件程式庫) 時,也會產生
正在執行主機 Bazel 專用的 BUILD
檔案。
存放區規則定義
在 .bzl
檔案中,使用
repository_rule 函式來定義
新的存放區規則,並將其儲存在全域變數中定義存放區規則後
這可做為函式叫用,以便定義存放區。這個叫用通常是
從模組擴充功能實作中執行
函式。
存放區規則定義的兩個主要元件是屬性結構定義 實作函式。屬性結構定義會決定 屬性,而實作函式是 會在需要擷取存放區時執行。
屬性
屬性是傳遞至存放區規則叫用的引數。結構定義
存放區規則接受的屬性是在下列情況下使用 attrs
引數指定:
系統會使用對 repository_rule
的呼叫來定義存放區規則。定義範例
url
和 sha256
屬性做為字串:
http_archive = repository_rule(
implementation=_impl,
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
。這是
這個字串屬性的行為有點神奇:當指定做為輸入內容的輸入內容時
存放區規則叫用時,會採用明顯的存放區名稱;但從 Container Registry 中
存放區規則使用 repository_ctx.attr.name
的實作函式,會傳回
標準存放區名稱
實作函式
每個存放區規則都需要 implementation
函式。這個 SDK 包含
規則的實際邏輯,並嚴格在「載入階段」中執行。
這個函式只有一個輸入參數 repository_ctx
。函式
會傳回 None
,表示有條件可重現該規則
或是帶有該規則參數的一組參數的字典
會將該規則轉換為可重現的規則,進而產生相同存放區。適用對象
以追蹤 Git 存放區的規則為例
特定的修訂版本 ID,而不是原先使用的浮動分支版本
。
輸入參數 repository_ctx
可用於
存取屬性值,以及非密封函式 (尋找二進位檔、
執行二進位檔、在存放區建立檔案或下載檔案
來自網際網路)。請參閱 API 說明文件
更多背景資訊範例:
def _impl(repository_ctx):
repository_ctx.symlink(repository_ctx.attr.path, "")
local_repository = repository_rule(
implementation=_impl,
...)
實作函式何時執行?
當 Bazel 需要 目標,例如當另一個目標 (在另一個存放區中) 存放區) 需要的依附元件,或出現在指令列中。 接著,預期函式會在檔案中建立存放區 有些人會將 Cloud Storage 視為檔案系統 但實際上不是這就是所謂的「擷取」存放區
與一般目標不同,在下列情況下,不一定會重新擷取存放區 會造成存放區不同的變更這是 因為 Bazel 無法偵測變更 每次建構作業都會造成過多負擔 (例如擷取的項目 )。因此,只有在其中一個 我們將進行下列變更:
- 傳送至存放區規則叫用的屬性。
- Starlark 程式碼包含存放區規則的實作。
- 傳遞至
repository_ctx
的任何環境變數值getenv()
方法,或使用environ
屬性宣告的repository_rule
。設定值 這些環境變數,可以透過指令列使用--repo_env
標記。 - 傳遞至
read()
、execute()
和類似內容的任何檔案內容 由標籤參照的repository_ctx
方法 (例如//mypkg:label.txt
,但不含mypkg/label.txt
) - 執行
bazel fetch --force
時。
repository_rule
有兩個參數可控制存放區的時機
重新擷取:
- 如果設定了
configure
標記,則只會在bazel fetch
,如果--configure
參數傳遞至該參數 (如果 屬性,這項指令不會重新擷取) - 如果設定了
local
旗標,除了上述情況外,存放區也會設為 也能在 Bazel 伺服器重新啟動時重新擷取。
重新啟動實作函式
在存放區中,您可以重新啟動實作函式 在要求的依附元件遺失時擷取。在此情況下, 實作函式會停止運作、解決缺少的依附元件, 依附元件解析完成後,系統就會重新執行該函式。目的地: 避免不必要的重新啟動 (成本高昂,因為網路存取可能 標籤引數則會預先擷取 (前提是所有) 標籤引數可解析為現有檔案。請注意,解決 只在執行期間建構的字串或標籤路徑 可能仍然會造成重新啟動
強制重新擷取外部存放區
外部存放區有時可能過時,且完全不會變更
定義或依附元件舉例來說,存放區擷取原始碼可能
會追蹤第三方存放區的特定分支版本,而新的修訂版本
可在該分支版本上使用在這種情況下,您可以要求 bazel 重新擷取所有
呼叫 bazel fetch --force --all
來部署外部存放區
此外,部分存放區規則會檢查本機電腦,且可能會使
但本機機器在升級時
資料仍舊存在您可以在此要求 Bazel 執行以下動作
系統只會重新擷取
repository_rule
敬上
定義了 configure
屬性,請使用
bazel fetch --all --configure
。
範例
C++ 自動設定工具鍊: 系統就會使用存放區規則 Bazel 的 C++ 設定檔,方法是尋找本機 C++ 編譯器, 環境和 C++ 編譯器支援的標記。
Go 存放區 使用多個
repository_rule
定義依附元件清單 才能使用 Go 規則rules_jvm_external 建立 預設名為
@maven
的外部存放區,用於產生建構目標 針對遞移依附元件樹狀結構中的每個 Maven 構件。