このページは、ルールを他のユーザーに公開することを計画しているルール作成者を対象としています。
テンプレート リポジトリ(https://github.com/bazel-contrib/rules-template)から新しいルールセットを開始することをおすすめします。このテンプレートは以下の推奨事項に沿っており、API ドキュメントの生成を含み、ルールセットの配布を容易にする CI/CD パイプラインを設定します。
ホスティングと命名規則
新しいルールは、組織の独自の GitHub リポジトリに配置する必要があります。ルールが bazelbuild 組織に属していると思われる場合は、GitHub でスレッドを開始してください。
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 など)でグループ化できます。
リポジトリのコンテンツ
ユーザーが新しいルールをすばやく理解できるように、すべてのルール リポジトリには特定のレイアウトが必要です。
たとえば、架空の mockascript 言語の新しいルールを作成する場合、ルール リポジトリは次の構造になります。
/
LICENSE
README
WORKSPACE
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
Workspace
プロジェクトの WORKSPACE で、ユーザーがルールを参照するために使用する名前を定義する必要があります。ルールが bazelbuild 組織に属している場合は、rules_<lang>(rules_mockascript など)を使用する必要があります。それ以外の場合は、リポジトリに <org>_rules_<lang>(build_stack_rules_proto など)という名前を付ける必要があります。ルールが bazelbuild 組織のルールの慣例に従う必要があると思われる場合は、GitHub でスレッドを開始してください。
以降のセクションでは、リポジトリが bazelbuild 組織に属していることを前提としています。
workspace(name = "rules_mockascript")
README
最上位には、ユーザーがルールを使用するために WORKSPACE ファイルにコピー&ペーストする必要がある(少なくとも)内容を含む README が必要です。通常、これは GitHub リリースを指す http_archive と、ルールに必要なツールをダウンロード/構成するマクロ呼び出しになります。たとえば、Go ルールの場合、次のようになります。
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_go",
urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.18.5/rules_go-0.18.5.tar.gz"],
sha256 = "a82a352bffae6bee4e95f68a8d80a70e87f42c4741e6a448bec11998fcc82329",
)
load("@rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
go_rules_dependencies()
go_register_toolchains()
ルールが別のリポジトリのルールに依存している場合は、ルール ドキュメントでそのことを指定し(たとえば、Sass ルールに依存する Skydoc ルールを参照)、すべての依存関係をダウンロードする WORKSPACE マクロを提供します(上記の rules_go を参照)。
ルール
多くの場合、リポジトリから複数のルールが提供されます。言語で名前が付けられたディレクトリを作成し、すべてのルールをエクスポートするエントリ ポイント(defs.bzl ファイル)を指定します(ディレクトリがパッケージになるように BUILD ファイルも追加します)。rules_mockascript の場合、mockascript という名前のディレクトリと、その中に BUILD ファイルと defs.bzl ファイルが作成されます。
/
mockascript/
BUILD
defs.bzl
制約
ルールでツールチェーン ルールを定義している場合は、カスタム constraint_setting や constraint_value を定義する必要がある可能性があります。これらを //<LANG>/constraints パッケージに入れます。ディレクトリ構造は次のようになります。
/
mockascript/
constraints/
BUILD
BUILD
defs.bzl
ベスト プラクティスについては github.com/bazelbuild/platforms をご覧ください。また、すでに存在する制約を確認し、言語に依存しない制約があれば、そちらに投稿することを検討してください。カスタム制約を導入する際は、ルールを使用するすべてのユーザーが、BUILD ファイルでプラットフォーム固有のロジックを実行するために使用することに注意してください(選択の使用など)。カスタム制約を使用すると、Bazel エコシステム全体で使用される言語を定義できます。
Runfiles ライブラリ
ルールでランファイルにアクセスするための標準ライブラリが提供されている場合、それは //<LANG>/runfiles(//<LANG>/runfiles:runfiles の略)にあるライブラリ ターゲットの形式になります。データ依存関係にアクセスする必要があるユーザー ターゲットは、通常、このターゲットを deps 属性に追加します。
リポジトリ ルール
依存関係
ルールに外部依存関係がある可能性があります。ルールへの依存を簡単にするため、これらの外部依存関係への依存を宣言する WORKSPACE マクロを提供してください。テストの依存関係は宣言しないでください。ルールが動作するために必要な依存関係のみを宣言してください。開発依存関係を WORKSPACE ファイルに配置します。
<LANG>/repositories.bzl という名前のファイルを作成し、rules_<LANG>_dependencies という名前の単一のエントリ ポイント マクロを指定します。ディレクトリは次のようになります。
/
mockascript/
constraints/
BUILD
BUILD
defs.bzl
repositories.bzl
ツールチェーンの登録
ルールでツールチェーンを登録することもできます。これらのツールチェーンを登録する別の WORKSPACE マクロを提供してください。これにより、ユーザーは以前のマクロを省略して依存関係を手動で制御しながら、ツールチェーンを登録できます。
そのため、<LANG>/repositories.bzl ファイルに rules_<LANG>_toolchains という名前の WORKSPACE マクロを追加します。
分析フェーズでツールチェーンを解決するには、登録されているすべての toolchain ターゲットを Bazel で分析する必要があります。Bazel は、toolchain.toolchain 属性で参照されるすべてのターゲットを分析する必要がなくなります。ツールチェーンを登録するためにリポジトリで複雑な計算を行う必要がある場合は、toolchain ターゲットを含むリポジトリを <LANG>_toolchain ターゲットを含むリポジトリから分割することを検討してください。前者は常に取得され、後者はユーザーが実際に <LANG> コードをビルドする必要がある場合にのみ取得されます。
リリース スニペット
リリースのお知らせで、ユーザーが WORKSPACE ファイルにコピー&ペーストできるスニペットを提供します。このスニペットは一般的に次のようになります。
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_<LANG>",
urls = ["<url_to_the_release.zip"],
sha256 = "4242424242",
)
load("@rules_<LANG>//<LANG>:repositories.bzl", "rules_<LANG>_dependencies", "rules_<LANG>_toolchains")
rules_<LANG>_dependencies()
rules_<LANG>_toolchains()
テスト
ルールが想定どおりに機能していることを検証するテストが必要です。これは、ルールの対象となる言語の標準の場所か、最上位の tests/ ディレクトリのいずれかに配置できます。
例(省略可)
ユーザーがルールを使用できる基本的な方法をいくつか示す examples/ ディレクトリがあると便利です。
CI / CD
多くのルールセットで GitHub Actions が使用されています。bazel-contrib 組織でホストされている「再利用可能なワークフロー」を使用して簡略化された rules-template リポジトリで使用されている構成をご覧ください。ci.yaml は各 PR と main コミットでテストを実行し、release.yaml はリポジトリにタグを push するたびに実行されます。詳細については、rules-template リポジトリのコメントをご覧ください。
リポジトリが bazelbuild 組織にある場合は、ci.bazel.build への追加をリクエストできます。
ドキュメント
ドキュメントを自動的に生成できるようにルールにコメントを追加する方法については、Stardoc のドキュメントをご覧ください。
rules-template docs/ フォルダには、Starlark ファイルが更新されたときに docs/ フォルダ内の Markdown コンテンツを常に最新の状態に保つ簡単な方法が示されています。
よくある質問
ルールをメインの Bazel GitHub リポジトリに追加できないのはなぜですか?
ルールを Bazel リリースからできるだけ切り離したいと考えています。個々のルールを所有するユーザーが明確になり、Bazel デベロッパーの負担が軽減されます。ユーザーにとって、ルールを切り離すことで、ルールの変更、アップグレード、ダウングレード、置換が容易になります。ルールへの投稿は、対応する GitHub リポジトリへの完全な送信アクセス権限を含め、ルールによっては Bazel への投稿よりも軽量になる可能性があります。Bazel 自体への送信アクセス権を取得するには、より複雑なプロセスが必要です。
欠点は、ユーザー向けの 1 回限りのインストール プロセスが複雑になることです。上記の README.md セクションに示すように、ユーザーはルールを WORKSPACE ファイルにコピー&ペーストする必要があります。
以前は、すべてのルールが Bazel リポジトリ(//tools/build_rules または //tools/build_defs の下)にありました。現在もいくつかのルールが残っていますが、残りのルールを移動する作業を進めています。