Skip to content

Migrating from Just

If you’re coming from Just, the transition to Jake is smooth. Most syntax is similar or identical.

JustJake
recipe:task recipe: (or simple syntax)
{{var}}{{var}} (same!)
set dotenv-load@dotenv
@recipe (quiet)@quiet decorator
[group: 'x']@group x
[confirm]@confirm "message"
[private]@hidden or prefix with _

Just uses bare recipe names. Jake prefers the task keyword for clarity, but also supports simple syntax:

# Jake with task keyword (recommended)
task build:
cargo build
# Jake with simple syntax (Just-like)
build:
cargo build

Just uses a global setting. Jake uses a directive:

# Just: set dotenv-load
# Jake:
@dotenv
@dotenv ".env.local" # Can load multiple files

Just uses attributes. Jake uses a directive:

# Just: [group: 'build']
# Jake:
@group build
task compile:
cargo build

Just uses an attribute. Jake uses a directive with a message:

# Just: [confirm]
# Jake:
task deploy:
@confirm "Deploy to production?"
./deploy.sh

Just uses an attribute. Jake supports both @hidden directive and underscore prefix:

# Just: [private]
# Jake option 1: @hidden directive
@hidden
task helper:
echo "I'm hidden from --list"
# Jake option 2: underscore prefix
task _other-helper:
echo "Also hidden from --list"
task public: [helper, _other-helper]
echo "I use the hidden helpers"
set dotenv-load
default:
@just --list
build:
cargo build
test: build
cargo test
[confirm("Deploy to production?")]
[group: 'deploy']
deploy: test
./deploy.sh
@dotenv
@default
task list:
jake --list
task build:
cargo build
task test: [build]
cargo test
@group deploy
task deploy: [test]
@confirm "Deploy to production?"
./deploy.sh

Migrating from Just gives you new capabilities:

Track source files and only rebuild when changed:

file dist/bundle.js: src/**/*.ts
esbuild src/index.ts --bundle --outfile=dist/bundle.js

This skips the build if no TypeScript files changed since the last run.

Reference files with wildcards:

file dist/app.js: src/**/*.ts
tsc --outFile dist/app.js

Run independent tasks simultaneously:

Terminal window
jake -j4 all # 4 parallel workers
jake -j all # Use CPU count

Run setup and cleanup around recipes:

task deploy:
@pre echo "Starting deployment..."
./deploy.sh
@post echo "Deployment complete!"

Re-run tasks when files change:

Terminal window
jake -w build
jake -w "src/**/*.ts" build

Verify tools exist before running:

task build:
@needs node npm esbuild
npm run build

Handle failures globally:

@on_error notify "Build failed!"
task build:
npm run build
  1. Add task keyword - For clarity (or keep simple syntax)
  2. Convert attributes - Replace [...] with @... directives
  3. Move dotenv - Change set dotenv-load to @dotenv
  4. Use file recipes - Replace always-run tasks with file when appropriate
  5. Add parallelism - Use -j for faster builds

If you want to gradually migrate, you can:

  1. Keep your justfile during transition
  2. Run specific tasks with both tools to verify behavior
  3. Once confident, remove the justfile