本頁面說明如何建立存放區規則,並提供 瞭解詳情
外部存放區是只能使用
,並在載入階段啟用非密封的作業WORKSPACE
可在 Bazel 開始進行每項外部存放區規則都會建立自己的工作區,
具備 BUILD
檔案和構件若是依賴第三方
程式庫 (例如 Maven 封裝程式庫),但也會產生 BUILD
檔案
專屬於執行 Bazel 的主機
建立存放區規則
在 .bzl
檔案中,使用
repository_rule 函式來建立新的篩選條件
並儲存在全域變數中
自訂存放區規則的使用方式與原生存放區規則相同。這項服務
具有必要的 name
屬性,且建構檔案中每個目標
即 @<name>//package:target
,其中 <name>
是
name
屬性。
規則會在您明確建立或
建構過程在這種情況下,Bazel 會執行其 implementation
函式。這個
函式說明如何建立存放區、其內容和 BUILD
檔案。
屬性
屬性是規則引數,例如 url
或 sha256
。您必須列出
定義存放區規則時的屬性和類型。
local_repository = repository_rule(
implementation=_impl,
local=True,
attrs={"path": attr.string(mandatory=True)})
如要存取屬性,請使用 repository_ctx.attr.<attribute_name>
。
所有 repository_rule
都有隱含定義的屬性 (就像建構一樣)
規則)。兩個隱含屬性為 name
(如同建構規則)
repo_mapping
。存放區規則名稱可透過以下資源存取:
repository_ctx.name
。repo_mapping
的含意與
原生存放區規則
local_repository
和
new_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,
...)
實作函式何時執行?
如果存放區宣告為 local
,請在依附元件中變更
依附元件圖表中 (包括 WORKSPACE
檔案本身) 會顯示
就會執行實作函式。
如果實作函式有依附元件,可重新啟動 要求遺失。實作函式的開頭 依附元件解析後,就會重新執行。為了避免 非必要的重新啟動動作,成本高昂,因為網路存取可能 標籤引數則會預先擷取 (前提是所有) 標籤引數可解析為現有檔案。請注意,解決 只在執行期間建構的字串或標籤路徑 可能仍然會造成重新啟動
最後,針對非 local
存放區,只有下列項目發生變化:
依附元件可能會導致重新啟動:
- 需要
.bzl
檔案才能定義存放區規則。 WORKSPACE
檔案中的存放區規則宣告。- 使用
environ
宣告的任何環境變數值 屬性的repository_rule
函式。這些環境變數的值可在以下位置強制執行: 指令列--action_env
敬上 旗標 (但這個標記會使該建構作業的所有動作失效)。 - 使用標籤參照的任何檔案內容 (例如
//mypkg:label.txt
,不是mypkg/label.txt
)。
強制重新擷取外部存放區
外部存放區有時有可能過時,且無須變更
定義或依附元件舉例來說,存放區擷取來源可能
會追蹤第三方存放區的特定分支版本,而新的修訂版本
可在該分支版本上使用在這種情況下,您可以要求 bazel 重新擷取所有
呼叫 bazel sync
以無條件存取外部存放區。
此外,有些規則會檢查本機電腦,且可能會使
但本機機器在升級時
資料仍舊存在你可以請 bazel 來
系統只會重新擷取
repository_rule
敬上
定義了 configure
屬性,請使用 bazel sync --configure
。
範例
C++ 自動設定工具鍊: 系統就會使用存放區規則 Bazel 的 C++ 設定檔,方法是尋找本機 C++ 編譯器, 環境和 C++ 編譯器支援的標記。
Go 存放區 使用多個
repository_rule
定義依附元件清單 才能使用 Go 規則rules_jvm_external 建立 預設名為
@maven
的外部存放區,用於產生建構目標 針對遞移依附元件樹狀結構中的每個 Maven 構件。