Mise - Task Configuration
Defining and managing tasks in Mise for build automation, testing, and development workflows.
Basic Task Definition
Simple TOML Tasks
mise.toml
[tasks.build] description = "Build the project" run = "cargo build --release"
[tasks.test] description = "Run all tests" run = "cargo test"
[tasks.lint] description = "Run linter" run = "cargo clippy -- -D warnings"
Running Tasks
Run a task
mise run build mise build # Shorthand if no command conflicts
Run multiple tasks
mise run build test lint
List available tasks
mise tasks ls
Show task details
mise tasks info build
Task Dependencies
Sequential Dependencies
[tasks.deploy] description = "Deploy the application" depends = ["build", "test"] run = "./deploy.sh"
Parallel Dependencies
[tasks.ci] description = "Run CI checks" depends = ["lint", "test", "security-scan"] run = "echo 'All checks passed'"
Mise automatically runs dependencies in parallel when possible.
File Tasks
Creating File Tasks
Create task directory
mkdir -p .mise/tasks
Create executable task file
cat > .mise/tasks/deploy <<'EOF' #!/usr/bin/env bash
mise description="Deploy the application"
mise depends=["build", "test"]
echo "Deploying..." ./scripts/deploy.sh EOF
chmod +x .mise/tasks/deploy
File Task Metadata
#!/usr/bin/env bash
mise description="Task description"
mise depends=["dependency1", "dependency2"]
mise sources=["src/**/*.rs"]
mise outputs=["target/release/app"]
Task implementation
Advanced Task Configuration
Task Arguments
[tasks.test] description = "Run tests with optional filter" run = ''' if [ -n "$1" ]; then cargo test "$1" else cargo test fi '''
Run all tests
mise test
Run specific test
mise test user_tests
Environment Variables in Tasks
[tasks.build] description = "Build with specific configuration" env = { RUST_ENV = "production", OPTIMIZATION = "3" } run = "cargo build --release"
[tasks.dev] description = "Start development server" env = { NODE_ENV = "development", PORT = "3000" } run = "npm run dev"
Task Aliases
[tasks.b] alias = "build"
[tasks.t] alias = "test"
[tasks.d] alias = "dev"
Use aliases
mise b # Runs build mise t # Runs test
File Watching
Watch Mode Tasks
[tasks.watch] description = "Watch and rebuild on changes" run = "cargo watch -x build"
[tasks."test:watch"] description = "Watch and run tests" run = "cargo watch -x test"
Built-in watch with mise
mise watch --task build
Monorepo Task Patterns
Workspace Tasks
Root mise.toml
[tasks.build-all] description = "Build all packages" depends = ["pkg-a:build", "pkg-b:build", "pkg-c:build"] run = "echo 'All packages built'"
[tasks."pkg-a:build"] description = "Build package A" run = "cd packages/pkg-a && cargo build"
[tasks."pkg-b:build"] description = "Build package B" run = "cd packages/pkg-b && cargo build"
Per-Package Tasks
packages/pkg-a/mise.toml
[tasks.build] description = "Build package A" run = "cargo build"
[tasks.test] description = "Test package A" depends = ["build"] run = "cargo test"
Task Validation
Validate Task Configuration
Validate all tasks
mise tasks validate
Check specific task
mise tasks info build
Common Validation Errors
Error: Missing required fields
[tasks.broken] run = "echo test" # Missing description
Error: Invalid dependency
[tasks.deploy] description = "Deploy" depends = ["nonexistent-task"] run = "./deploy.sh"
Error: Circular dependency
[tasks.a] description = "Task A" depends = ["b"] run = "echo a"
[tasks.b] description = "Task B" depends = ["a"] # Circular! run = "echo b"
Best Practices
Organize Tasks by Purpose
Build tasks
[tasks.build] description = "Build production binary" run = "cargo build --release"
[tasks."build:debug"] description = "Build debug binary" run = "cargo build"
Test tasks
[tasks.test] description = "Run all tests" run = "cargo test"
[tasks."test:unit"] description = "Run unit tests only" run = "cargo test --lib"
[tasks."test:integration"] description = "Run integration tests" run = "cargo test --test '*'"
Development tasks
[tasks.dev] description = "Start development server" run = "cargo run"
[tasks.watch] description = "Watch and rebuild" run = "cargo watch -x run"
Use Descriptive Names
Good: Clear, descriptive names
[tasks."test:integration:api"] description = "Run API integration tests" run = "pytest tests/integration/api"
Avoid: Vague names
[tasks.t1] description = "Some test" run = "pytest"
Leverage Dependencies
Good: Explicit dependencies
[tasks.deploy] description = "Deploy to production" depends = ["lint", "test", "build"] run = "./scripts/deploy.sh"
Avoid: Manual sequencing in run command
[tasks.deploy] description = "Deploy to production" run = ''' cargo clippy cargo test cargo build --release ./scripts/deploy.sh '''
Use Environment Variables
Access mise environment variables
[tasks.info] description = "Show task info" run = ''' echo "Task: $MISE_TASK_NAME" echo "Project root: $MISE_PROJECT_ROOT" echo "Config root: $MISE_CONFIG_ROOT" '''
Common Patterns
Pre/Post Hooks
[tasks.build] description = "Build with pre/post hooks" depends = ["pre-build"] run = "cargo build"
[tasks.pre-build] description = "Run before build" run = "echo 'Preparing build...'"
[tasks.post-build] description = "Run after build" run = "echo 'Build complete!'"
[tasks."build:full"] description = "Build with all hooks" depends = ["pre-build", "build", "post-build"] run = "echo 'Full build pipeline complete'"
Conditional Execution
[tasks.deploy] description = "Deploy only if tests pass" run = ''' if mise test; then ./scripts/deploy.sh else echo "Tests failed, deployment cancelled" exit 1 fi '''
Multi-Stage Builds
[tasks.build] description = "Multi-stage build" depends = ["compile", "optimize", "package"] run = "echo 'Build complete'"
[tasks.compile] description = "Compile source" run = "cargo build --release"
[tasks.optimize] description = "Optimize binary" depends = ["compile"] run = "strip target/release/app"
[tasks.package] description = "Create package" depends = ["optimize"] run = "tar -czf app.tar.gz target/release/app"
Anti-Patterns
Don't Hardcode Paths
Bad: Hardcoded absolute paths
[tasks.build] description = "Build" run = "cd /Users/me/project && cargo build"
Good: Use relative paths and environment variables
[tasks.build] description = "Build" run = "cd $MISE_PROJECT_ROOT && cargo build"
Don't Duplicate Logic
Bad: Duplicated test logic
[tasks."test:unit"] run = "cargo test --lib"
[tasks."test:integration"] run = "cargo test --test '*'"
[tasks."test:all"] run = "cargo test --lib && cargo test --test '*'"
Good: Use dependencies
[tasks."test:all"] depends = ["test:unit", "test:integration"] run = "echo 'All tests complete'"
Don't Ignore Exit Codes
Bad: Swallowing errors
[tasks.ci] run = ''' cargo clippy || true cargo test || true echo "CI complete" '''
Good: Fail fast
[tasks.ci] depends = ["lint", "test"] run = "echo 'CI checks passed'"
Related Skills
-
tool-management: Managing tool versions with Mise
-
environment-management: Environment variables and configuration