Skip to content

Toolchains

Toolchains provide default command implementations for different build ecosystems. They map Structyl's standard commands to language-specific tools.

Using Toolchains

Specify a toolchain in your target configuration:

json
{
  "targets": {
    "rs": {
      "type": "language",
      "title": "Rust",
      "toolchain": "cargo"
    }
  }
}

Auto-Detection

If you don't specify a toolchain, Structyl detects it from marker files:

Marker FileDetected Toolchain
Cargo.tomlcargo
go.modgo
deno.jsonc, deno.jsondeno
pnpm-lock.yamlpnpm
yarn.lockyarn
bun.lockbbun
package.jsonnpm
uv.lockuv
poetry.lockpoetry
pyproject.toml, setup.pypython
build.gradle.kts, build.gradlegradle
pom.xmlmaven
build.sbtsbt
Package.swiftswift
CMakeLists.txtcmake
Makefilemake
*.csproj, *.fsprojdotnet
Gemfilebundler
composer.jsoncomposer
mix.exsmix
stack.yamlstack
*.cabalcabal
dune-projectdune
project.cljlein
build.zigzig
rebar.configrebar3
DESCRIPTIONr

Built-in Toolchains

Rust: cargo

json
{ "toolchain": "cargo" }
CommandRuns
buildcargo build
build:releasecargo build --release
testcargo test
checklint + format-check
lintcargo clippy -- -D warnings
formatcargo fmt
benchcargo bench
packcargo package
doccargo doc --no-deps

Go: go

json
{ "toolchain": "go" }
CommandRuns
buildgo build ./...
testgo test ./...
checklint + vet
lintgolangci-lint run
formatgo fmt ./...
benchgo test -bench=. ./...
docgo doc ./...

.NET: dotnet

json
{ "toolchain": "dotnet" }
CommandRuns
builddotnet build
build:releasedotnet build -c Release
testdotnet test
restoredotnet restore
formatdotnet format
packdotnet pack

Python: uv

json
{ "toolchain": "uv" }
CommandRuns
builduv build
testuv run pytest
restoreuv sync
lintuv run ruff check .
formatuv run ruff format .

Python: poetry

json
{ "toolchain": "poetry" }
CommandRuns
buildpoetry build
testpoetry run pytest
restorepoetry install
lintpoetry run ruff check .

Python: python

json
{ "toolchain": "python" }
CommandRuns
buildpython -m build
testpytest
restorepip install -e .
lintruff check .

Node.js: npm

json
{ "toolchain": "npm" }
CommandRuns
buildnpm run build
testnpm test
restorenpm ci
lintnpm run lint
packnpm pack

Node.js: pnpm

json
{ "toolchain": "pnpm" }
CommandRuns
buildpnpm build
testpnpm test
restorepnpm install --frozen-lockfile
packpnpm pack

Node.js: yarn

json
{ "toolchain": "yarn" }
CommandRuns
buildyarn build
testyarn test
restoreyarn install --frozen-lockfile
packyarn pack

Node.js: bun

json
{ "toolchain": "bun" }
CommandRuns
buildbun run build
testbun test
restorebun install --frozen-lockfile

Deno: deno

json
{ "toolchain": "deno" }
CommandRuns
testdeno test
restoredeno install
checklint + typecheck
lintdeno lint
formatdeno fmt
benchdeno bench
docdeno doc

JVM: gradle

json
{ "toolchain": "gradle" }
CommandRuns
buildgradle build -x test
testgradle test
cleangradle clean
packgradle jar
docgradle javadoc

JVM: maven

json
{ "toolchain": "maven" }
CommandRuns
buildmvn compile
testmvn test
cleanmvn clean
restoremvn dependency:resolve
packmvn package -DskipTests

Scala: sbt

json
{ "toolchain": "sbt" }
CommandRuns
buildsbt compile
testsbt test
cleansbt clean
restoresbt update
formatsbt scalafmt
packsbt package
docsbt doc

Swift: swift

json
{ "toolchain": "swift" }
CommandRuns
buildswift build
build:releaseswift build -c release
testswift test
restoreswift package resolve

C/C++: cmake

json
{ "toolchain": "cmake" }
CommandRuns
restorecmake -B build -S .
buildcmake --build build
testctest --test-dir build

Generic: make

json
{ "toolchain": "make" }
CommandRuns
buildmake
testmake test
cleanmake clean

Ruby: bundler

json
{ "toolchain": "bundler" }
CommandRuns
buildbundle exec rake build
testbundle exec rake test
restorebundle install
lintbundle exec rubocop
formatbundle exec rubocop -a
packgem build *.gemspec
docbundle exec yard doc

PHP: composer

json
{ "toolchain": "composer" }
CommandRuns
testcomposer test
restorecomposer install
lintcomposer run-script lint
formatcomposer run-script format

Elixir: mix

json
{ "toolchain": "mix" }
CommandRuns
buildmix compile
testmix test
cleanmix clean
restoremix deps.get
checklint + typecheck
lintmix credo
formatmix format
docmix docs

Haskell: cabal

json
{ "toolchain": "cabal" }
CommandRuns
buildcabal build
testcabal test
cleancabal clean
restorecabal update
checkcabal check
linthlint .
benchcabal bench
doccabal haddock

Haskell: stack

json
{ "toolchain": "stack" }
CommandRuns
buildstack build
teststack test
cleanstack clean
restorestack setup
lintstack exec -- hlint .
benchstack bench
docstack haddock

OCaml: dune

json
{ "toolchain": "dune" }
CommandRuns
builddune build
testdune runtest
cleandune clean
restoreopam install . --deps-only
formatdune fmt
docdune build @doc

Clojure: lein

json
{ "toolchain": "lein" }
CommandRuns
buildlein compile
testlein test
cleanlein clean
restorelein deps
checklein check
lintlein eastwood
formatlein cljfmt fix
packlein jar
doclein codox

Zig: zig

json
{ "toolchain": "zig" }
CommandRuns
buildzig build
build:releasezig build -Doptimize=ReleaseFast
testzig build test
formatzig fmt .

Erlang: rebar3

json
{ "toolchain": "rebar3" }
CommandRuns
buildrebar3 compile
testrebar3 eunit
cleanrebar3 clean
restorerebar3 get-deps
checkrebar3 dialyzer
lintrebar3 lint
packrebar3 tar
docrebar3 edoc

R: r

json
{ "toolchain": "r" }
CommandRuns
buildR CMD build .
testRscript -e "devtools::test()"
checkR CMD check --no-manual *.tar.gz
lintRscript -e "lintr::lint_package()"
formatRscript -e "styler::style_pkg()"
packR CMD build .
docRscript -e "roxygen2::roxygenise()"

Custom Toolchains

Create your own toolchain:

json
{
  "toolchains": {
    "my-toolchain": {
      "commands": {
        "build": "my-build-tool compile",
        "test": "my-build-tool test",
        "clean": "rm -rf out/"
      }
    }
  },
  "targets": {
    "custom": {
      "toolchain": "my-toolchain"
    }
  }
}

Extending Toolchains

Extend a built-in toolchain to customize specific commands:

json
{
  "toolchains": {
    "cargo-workspace": {
      "extends": "cargo",
      "commands": {
        "build": "cargo build --workspace",
        "test": "cargo test --workspace"
      }
    }
  }
}

Overriding Commands

Override specific commands in a target without creating a new toolchain:

json
{
  "targets": {
    "rs": {
      "toolchain": "cargo",
      "commands": {
        "test": "cargo test --release"
      }
    }
  }
}

Next Steps

Released under the MIT License.