| name | mise-task-configuration |
| description | Use when defining and configuring Mise tasks in mise.toml. Covers task definitions, dependencies, file tasks, and parallel execution. |
| allowed-tools | Read, Write, Edit, Bash, Grep, Glob |
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