本頁內容適用於打算開放規則的規則撰寫者 供他人參考。
建議您從範本存放區啟動新的規則集: https://github.com/bazel-contrib/rules-template 這個範本遵循下列建議,而且包含產生 API 說明文件 並設定 CI/CD 管道,以便輕鬆發布規則集。
代管和命名規則
新規則應傳送至貴機構專屬的 GitHub 存放區。 在 GitHub 上建立討論串 如果您認為您的規則已應用於 bazelbuild 並根據貴機構的使命 價值觀和目標進行調整
Bazel 規則的存放區名稱會以下列格式標準化:
$ORGANIZATION/rules_$NAME
。
查看 GitHub 上的範例。
為保持一致性,發布 Bazel 規則時,請遵循相同的格式。
請務必使用描述性的 GitHub 存放區說明和 README.md
標題,範例如下:
- 存放區名稱:
bazelbuild/rules_go
- 存放區說明:Bazel 的 Go 規則
- 存放區標記:
golang
、bazel
README.md
標頭:Bazel 的 Go 規則 (請注意 前往 https://bazel.build 的連結為不熟悉的使用者 並在適當位置搭配使用 Bazel)
規則可以按照語言 (例如 Scala)、執行階段平台分組 (例如 Android) 或架構 (例如 Spring)。
存放區內容
每個規則存放區都應有特定的版面配置,讓使用者可以快速 瞭解新規則
例如,為 (make-believe) 編寫新規則時
mockascript
語言,規則存放區的結構如下:
/
LICENSE
README
MODULE.bazel
mockascript/
constraints/
BUILD
runfiles/
BUILD
runfiles.mocs
BUILD
defs.bzl
tests/
BUILD
some_test.sh
another_test.py
examples/
BUILD
bin.mocs
lib.mocs
test.mocs
MODULE.bazel
在專案的 MODULE.bazel
中,您應定義使用者要使用的名稱
來參照您的規則如果您的規則屬於
bazelbuild 建立的所有專案,才能在下列情況中使用:
rules_<lang>
(例如 rules_mockascript
)。否則,您應該為
存放區 <org>_rules_<lang>
(例如 build_stack_rules_proto
)。請
在 GitHub 上發起討論串
如果您認為規則應該遵循
Bazelbuild 的機構建立。
在以下各節中,假設存放區屬於 bazelbuild 的機構。
module(name = "rules_mockascript")
README
頂層應有一個包含簡短說明的 README
以及 API 使用者的需求
規則
存放區通常會提供多項規則。撰寫
並提供進入點 - defs.bzl
檔案,以語言命名。
匯出所有規則 (同時包含 BUILD
檔案,因此目錄為套件)。
如果是 rules_mockascript
,代表有名為
mockascript
,以及內含 BUILD
檔案和 defs.bzl
檔案:
/
mockascript/
BUILD
defs.bzl
限制
如果您的規則定義了
toolchain 規則時
您可能需要定義自訂 constraint_setting
和/或
constraint_value
。將這些內容放入 //<LANG>/constraints
套件中。您的
目錄結構看起來會像這樣:
/
mockascript/
constraints/
BUILD
BUILD
defs.bzl
敬請詳閱
github.com/bazelbuild/platforms
瞭解最佳做法,並且瞭解目前有哪些限制條件,
如果兩者無關聯,請思考有哪些限制。
請務必導入自訂限制條件,讓規則的所有使用者
用於在 BUILD
檔案中執行平台專屬邏輯 (例如
使用 selects)。
透過自訂限制,您可以定義整個 Bazel 生態系統的語言
開始說話。
Runfiles 程式庫
如果您的規則提供用於存取執行檔案的標準程式庫,
格式為程式庫目標,格式為 //<LANG>/runfiles
(縮寫為
(共 //<LANG>/runfiles:runfiles
個)。需要存取使用者資料的使用者目標
依附元件通常會將這個目標新增至其 deps
屬性。
存放區規則
依附元件
規則可能具有外部依附元件,您需要在 您的 MODULE.bazel 檔案。
正在註冊工具鍊
您的規則可能會註冊工具鍊,您也可以直接在 MODULE.bazel 檔案。
請注意,為解決分析階段中的工具鍊,Bazel 必須
分析所有已註冊的 toolchain
個目標。Bazel 不需要
分析 toolchain.toolchain
屬性參照的所有目標。如果順序正確
註冊必要工具鍊,以便在叢集中執行複雜運算
請考慮將含有 toolchain
目標的存放區從
目標為 <LANG>_toolchain
個存放區系統一律會擷取前者,
只有在使用者實際需要建構 <LANG>
程式碼時,系統才會擷取後者。
版本程式碼片段
版本公告中會提供程式碼片段,讓使用者可以複製貼上
並貼到 MODULE.bazel
檔案中。程式碼片段大致如下:
bazel_dep(name = "rules_<LANG>", version = "<VERSION>")
測試命名空間
您應先進行測試,確認規則運作正常。這個
可以是目標語言的標準位置,也可以是
位於頂層的 tests/
目錄。
範例 (選填)
examples/
目錄會向使用者顯示數個項目,對使用者來說會很有幫助
認識規則的基本使用方式
CI/CD
許多規則集都使用 GitHub Actions。查看 rules-template 存放區中使用的設定,這會透過「可重複使用的工作流程」來簡化。託管於 bazel-contrib
機構。ci.yaml
會在每次 PR 和 main
基準上執行測試,而 release.yaml
會在您將標記推送至存放區時執行。
詳情請參閱 Rules-template 存放區中的註解。
如果您的存放區位於 bazelbuild 機構下, 您可以要求新增 將其新增至 ci.bazel.build。
說明文件
如需相關資訊,請參閱 Stardoc 文件 說明如何為規則加註 。
rules-template docs/ 資料夾
簡單說明如何確保 docs/
資料夾中的 Markdown 內容一律是最新版本
更新該檔案
常見問題
為何無法將規則新增至主要的 Bazel GitHub 存放區?
我們希望盡可能將規則與 Bazel 版本分離。天氣清楚。 來降低 Bazel 開發人員的負載對使用者來說 分離功能可讓您輕鬆修改、升級、降級和取代規則。 影響規則的權重可能比影響 Bazel 還低 - ,包括取得相應規則的完整存取權 GitHub 存放區需要提交 Bazel 本身的存取權,相當耗時 上傳資料集之後,您可以運用 AutoML 自動完成部分資料準備工作
這對使用者來說是個比較複雜的一次性安裝程序:
必須在 MODULE.bazel
檔案中的規則集新增依附元件。
我們過去將 Bazel 存放區中的所有規則
//tools/build_rules
或 //tools/build_defs
)。我們還有一些規則
但我們正在努力將其餘規則移出。