このページでは、Starlark の概要について説明します。 (Bazel で使用されている言語、旧称 Skylark)。Google 広告ヘルプセンターの Bazel API リファレンスをご覧ください。
言語の詳細については、Starlark の GitHub リポジトリをご覧ください。
Starlark 構文の信頼できる仕様と Starlark 言語仕様をご覧ください。
構文
Starlark の構文は Python3 に基づいています。これは Starlark の有効な構文です。
def fizz_buzz(n):
"""Print Fizz Buzz numbers from 1 to n."""
for i in range(1, n + 1):
s = ""
if i % 3 == 0:
s += "Fizz"
if i % 5 == 0:
s += "Buzz"
print(s if s else i)
fizz_buzz(20)
Starlark のセマンティクスは Python と異なりますが、動作の違いは Starlark がエラーを返す場合を除きます。次の Python 次のタイプがサポートされています。
可変性
Starlark は不変性を好みます。次の 2 つの変更可能なデータ構造を使用できます。 list と dicts。可変への変更 リストへの値の追加や ディクショナリは、現在のコンテキストで作成されたオブジェクトに対してのみ有効です。アフター その値は不変になります。
これは、Bazel ビルドが並列実行を使用するためです。ビルド中に、各 .bzl
が
ファイルと各 BUILD
ファイルは、独自の実行コンテキストを取得します。また、各ルールは
独自のコンテキストで分析できます。
foo.bzl
ファイルを使用した例を見てみましょう。
# `foo.bzl`
var = [] # declare a list
def fct(): # declare a function
var.append(5) # append a value to the list
fct() # execute the fct function
foo.bzl
が読み込まれると、Bazel は var
を作成します。したがって、var
は foo.bzl
の一部です。
説明します。fct()
が実行されると、foo.bzl
のコンテキスト内で実行されます。変更後
foo.bzl
の評価が完了すると、環境に不変のエントリが含まれます。
var
(値は [5]
)。
別の bar.bzl
が foo.bzl
からシンボルをロードしても、ロードされた値はそのまま残ります。
不変。このため、bar.bzl
の次のコードは無効です。
# `bar.bzl`
load(":foo.bzl", "var", "fct") # loads `var`, and `fct` from `./foo.bzl`
var.append(6) # runtime error, the list stored in var is frozen
fct() # runtime error, fct() attempts to modify a frozen list
bzl
ファイルで定義されたグローバル変数は、
その変数を定義している bzl
ファイル。bzl
ファイルを使用した上記の例と同様に、
値は変更できません。
BUILD ファイルと .bzl ファイルの違い
BUILD
ファイルは、ルールを呼び出してターゲットを登録します。.bzl
ファイルが提供するもの
定数、ルール、マクロ、関数の定義。
ネイティブ関数とネイティブ ルールは、
BUILD
ファイル。bzl
ファイルは、native
モジュールを使用して読み込む必要があります。
BUILD
ファイルには、次の 2 つの構文上の制限があります。1)関数の宣言
不正、2)*args
引数と **kwargs
引数は使用できません。
Python との違い
グローバル変数は変更できません。
for
ステートメントはトップレベルには使用できません。関数内で使用する してください。BUILD
ファイルでは、リストの理解を使用できます。if
ステートメントはトップレベルには使用できません。ただし、if
式はfirst = data[0] if len(data) > 0 else None
を使用できます。ディクショナリを反復処理する決定論的な順序。
再帰は許可されていません。
int 型は 32 ビット符号付き整数に制限されています。オーバーフローするとエラーがスローされます。
反復処理中にコレクションを変更すると、エラーになります。
等式テストを除き、比較演算子
<
、<=
、>=
、>
などは 定義されません。要するに、5 < 'foo'
はエラーをスローし、5 == "5"
は false を返します。タプルの場合、末尾のカンマはタプルが かっこ -
1,
ではなく(1,)
と指定した場合。辞書リテラルで重複するキーを含めることはできません。たとえば、これは エラー:
{"a": 4, "b": 7, "a": 1}
。文字列は二重引用符で表します( repr)。
文字列は反復処理できません。
次の Python 機能はサポートされていません。