Bazel
Bazel BUILD files + LSP support (starpls or bazel-lsp)
Developer tools for writing, debugging, and maintaining Starlark code.
Language servers provide IDE features like completion, diagnostics, and navigation.
Starpls is a standalone Starlark language server.
Features:
Installation:
brew install starplscargo install starplsDownload from GitHub Releases
VS Code Setup:
Starpls integrates with VS Code through the vscode-bazel extension (v0.10.0+):
{ "bazel.lsp.command": "starpls"}bazel-lsp is based on Facebook’s Starlark language server with Bazel-specific extensions.
VS Code Setup:
{ "bazel.lsp.command": "bazel-lsp"}Buck2 includes a built-in language server for its Starlark dialect.
buck2 lspFeatures:
VS Code Setup:
See Buck2 VS Code extension for integration.
Buck2 provides Debug Adapter Protocol support for stepping through Starlark:
buck2 starlark debug-attachFeatures:
VS Code launch.json:
{ "version": "0.2.0", "configurations": [ { "type": "buck2-starlark", "request": "attach", "name": "Attach to Buck2 Starlark", "port": 4567 } ]}Bazel
Bazel BUILD files + LSP support (starpls or bazel-lsp)
Buck2
Buck2 integration
Kurtosis
Kurtosis Starlark
| Plugin | IDE | Features |
|---|---|---|
| Bazel | IntelliJ, CLion | BUILD syntax, completion |
| Buck | IntelliJ | Buck file support |
Using nvim-lspconfig:
require('lspconfig').starpls.setup({ cmd = { 'starpls' }, filetypes = { 'starlark', 'bzl', 'star' },})Or with Mason:
require('mason-lspconfig').setup({ ensure_installed = { 'starpls' },})The official formatter for Bazel BUILD files:
# Installgo install github.com/bazelbuild/buildtools/buildifier@latest
# Formatbuildifier -r .
# Check onlybuildifier -mode=check -r .Configuration (.buildifier.json):
{ "version": "6.0.0", "lint": "warn", "warnings": ["attr-cfg", "attr-license"]}Sky includes a Starlark formatter:
skyfmt path/to/file.starskyfmt --check . # Check without modifyingBuildifier includes lint checks:
buildifier -lint=warn path/to/BUILD.bazelCommon warnings:
load-on-top - Load statements should be firstsame-origin-load - Combine loads from same fileunused-variable - Remove unused variablesSky provides additional Starlark-specific checks:
skylint path/to/file.starChecks include:
Sky’s test runner:
skytest path/to/test.starTest file format:
load("math.star", "add", "multiply")
def test_add(): assert_eq(add(1, 2), 3) assert_eq(add(-1, 1), 0)
def test_multiply(): assert_eq(multiply(2, 3), 6) assert_eq(multiply(0, 5), 0)Bazel Skylib testing for Bazel rules:
load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest")
def _add_test_impl(ctx): env = unittest.begin(ctx) asserts.equals(env, 3, add(1, 2)) return unittest.end(env)
add_test = unittest.make(_add_test_impl)Interactive Starlark shell:
skyrepl>>> x = [1, 2, 3]>>> [i * 2 for i in x][2, 4, 6]>>> def greet(name):... return "Hello, " + name...>>> greet("World")"Hello, World"go run go.starlark.net/cmd/starlarkbuck2 starlark replBazel’s documentation generator:
load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
stardoc( name = "my_rules_docs", input = "my_rules.bzl", out = "my_rules.md",)Sky’s documentation generator:
skydoc path/to/module.star -o docs/Generates markdown from docstrings:
def build_target(name, srcs, deps = []): """Creates a build target.
Args: name: Target name (must be unique) srcs: Source files to compile deps: Optional dependencies
Returns: A target object """ ...Install Starpls
brew install starplsConfigure VS Code
Install the vscode-bazel extension and configure:
{ "bazel.lsp.command": "starpls"}Install Buildifier
go install github.com/bazelbuild/buildtools/buildifier@latestConfigure Format on Save
{ "[starlark]": { "editor.formatOnSave": true, "editor.defaultFormatter": "BazelBuild.vscode-bazel" }}Set Up Pre-commit Hook
repos: - repo: https://github.com/keith/pre-commit-buildifier rev: 6.4.0 hooks: - id: buildifier - id: buildifier-lint| Tool | starlark-rust | starlark-go | starlark-java |
|---|---|---|---|
| LSP | ✅ Built-in | ⚠️ Starpls | ⚠️ Starpls |
| DAP | ✅ Built-in | ❌ | ❌ |
| REPL | ✅ | ✅ | ❌ |
| Formatter | ✅ Buildifier | ✅ Buildifier | ✅ Buildifier |
| Linter | ✅ Buildifier | ✅ Buildifier | ✅ Buildifier |