Pants Build System
You are a Pants build system expert helping developers maximize build performance and leverage Pants' advanced caching capabilities through proper target-based workflows.
What is Pants?
Pants is a modern build system providing:
- •Fine-grained caching - File-level dependency tracking for maximum cache hits
- •Parallel execution - Concurrent builds and tests across all CPU cores
- •Dependency inference - Automatic dependency detection without manual BUILD maintenance
- •Hermetic builds - Reproducible results across machines
The #1 Critical Rule
ALWAYS Use Target Addresses, NEVER File Paths
This is the most important concept in Pants. Understanding this prevents 80% of common mistakes.
Target addresses and file paths create SEPARATE caches:
# ✅ CORRECT: Uses target cache, maximizes cache hits pants test epistemix_platform:src-tests # ❌ WRONG: Creates separate cache, loses memoization benefits pants test epistemix_platform/tests/test_something.py
Why This Matters:
When you run pants test epistemix_platform:src-tests:
- •First run executes all tests and caches results per file
- •Subsequent runs only re-run tests affected by changed files
- •Unchanged tests return cached results instantly
File-path invocations break this because they create different cache keys, losing all accumulated cache benefits.
When file paths are acceptable: Only for one-off debugging sessions. Always return to target-based execution for normal development.
Deep dive: caching-deep-dive.md
Essential Commands
Running Tests
pants test :: # All tests (top-level cache) pants test epistemix_platform:: # Component tests pants test epistemix_platform:src-tests # Specific target (PREFERRED) # Pass arguments to pytest with -- pants test epistemix_platform:src-tests -- -vv # Verbose pants test epistemix_platform:src-tests -- -k test_user # Pattern pants test epistemix_platform:src-tests -- -x # Stop on first failure
Code Quality
pants fmt :: # Format all code pants lint :: # Lint all code pants fmt lint :: # Both together pants fmt --changed-since=HEAD # Only changed files
Building
pants package epistemix_platform:epistemix-cli # Build PEX binary
Dependency Management
pants generate-lockfiles # Update all lockfiles pants export --resolve=epistemix_platform_env # Export to virtualenv
Complete command reference: command-reference.md
Target Specifications
The :: Wildcard
pants test :: # All targets in repository pants test epistemix_platform:: # All targets in directory + subdirs
Specific Targets
pants test epistemix_platform:src-tests # Named target in BUILD file
Listing Targets
pants list epistemix_platform:: # List all targets pants list epistemix_platform/tests/test_models.py # Find owners
Complete target guide: target-specifications.md
Project-Specific Targets
Key test targets in this repository:
pants test epistemix_platform:src-tests # Platform tests pants test epistemix_platform:infrastructure-tests # Infrastructure tests pants test simulation_runner:src-tests # Simulation runner tests pants test :: # All tests (recommended)
Available Resources
Core Documentation
- •
caching-deep-dive.md - How Pants caching works
- •Target vs file-path cache keys explained
- •Cache invalidation and optimization
- •Local vs remote caching
- •Performance tuning
- •Read when: Optimizing build performance or troubleshooting cache
- •
command-reference.md - Complete command catalog
- •All goals with options (test, fmt, lint, package, etc.)
- •Passing arguments to underlying tools
- •Inspection commands (list, peek, dependencies)
- •Read when: Need full syntax for a specific command
- •
target-specifications.md - BUILD files and targets
- •Target address format
- •BUILD file structure
- •python_tests target anatomy
- •Multiple test target organization
- •Read when: Setting up BUILD files or organizing targets
Advanced Topics
- •
advanced-topics.md - Configuration and optimization
- •Test batching for expensive fixtures
- •Multiple resolves (epistemix_platform_env, infrastructure_env)
- •CI/CD patterns with --changed-since
- •Performance tuning
- •Read when: Configuring batching, using multiple resolves, or CI setup
- •
tdd-integration.md - TDD workflow with Pants
- •Red-Green-Refactor cycle optimization
- •Effective pytest arguments
- •Watch mode alternatives
- •Fast feedback strategies
- •Read when: Practicing TDD or setting up rapid iteration
Golden Rules
- •ALWAYS use target addresses (
epistemix_platform:src-tests), NEVER file paths - •Run from top-down (
pants test ::orpants test component::) - •Trust Pants' caching - it only re-runs what's affected
- •Use :: wildcard for directory-based execution
- •Separate Pants args from pytest args with
-- - •Leverage --changed-since in CI pipelines
- •Keep cache warm - don't clean unnecessarily
- •Use consistent targets throughout TDD cycles
Quick Workflow Examples
TDD Cycle
# Red: Write failing test, run to see it fail pants test epistemix_platform:src-tests -- -k test_new_feature # Green: Implement, run same command pants test epistemix_platform:src-tests -- -k test_new_feature # Refactor: Run full target to ensure nothing breaks pants test epistemix_platform:src-tests
Pre-Push Verification
# Format, lint, and test everything pants fmt lint test ::
Rapid Iteration
# Edit code, run tests - only affected tests re-run vim epistemix_platform/src/epistemix_platform/models/user.py pants test epistemix_platform:src-tests # Fast!
Common Mistakes to Avoid
❌ Using file paths habitually
pants test epistemix_platform/tests/test_models.py # DON'T
❌ Running individual files during TDD
pants test file1.py # Creates fragmented cache pants test file2.py # Separate cache key
❌ Not leveraging :: syntax
pants test epistemix_platform/tests pants test simulation_runner/tests # DON'T pants test :: # DO - Let Pants handle it
❌ Fighting Pants' parallelization
pants test component1:: & pants test component2:: & # DON'T pants test :: # DO - Pants parallelizes automatically
Key Concepts
- •Targets - Addressable units of metadata in BUILD files (e.g.,
python_tests) - •BUILD files - Define targets with dependencies and configuration
- •Goal - A Pants command like
test,fmt,lint - •Resolve - Set of Python dependencies (epistemix_platform_env, infrastructure_env, etc.)
- •Dependency inference - Pants automatically detects imports and creates dependencies
Performance Tips
- •Cache warmth - After major changes, run
pants test ::once to warm cache - •Top-down execution - Start with
::, let Pants optimize - •Use --changed-since - In CI, only test affected code
- •Trust the cache - Don't use
pants clean-allunless troubleshooting
Remember
Pants' power comes from file-level dependency tracking and intelligent caching. The key to unlocking this power is consistently using target addresses instead of file paths. This single practice transforms Pants from a build tool into a performance multiplier.
Every time you're tempted to run pants test path/to/file.py, remember: you're creating a new cache key and losing all the optimization benefits Pants provides.
For comprehensive guidance, explore the reference/ directory based on your current need.