Pants is a fast, scalable, user-friendly build system for codebases of all sizes.
Pants is an open-source project that is not owned or controlled by any one company or organization, and does incur some expenses. These expenses are managed by Pants Build, a non-profit that was established for this purpose. This non-profit's only source of revenue is sponsorship by individuals and companies that use Pants.
We offer formal sponsorship tiers for companies, as well as individual sponsorships via GitHub.
Thank you to Klaviyo for their Platinum tier support through throughout this release.
Support for the deprecated Get()/MultiGet() in the plugin API has been removed.
The plugin API's Get() and MultiGet() constructs, deprecated in 2.30, are now unsupported. If your plugin still relies on them you must migrate before upgrading to this version.
The Pants Contribution Overview now contains guidance on LLM use.
The version of Python used by Pants itself has been updated to 3.14. To support this, the Pants Launcher Binary (also known as scie-pants) now has a minimum version of 0.13.0. To update to the latest launcher binary, either:
- Use the package manager you used to install Pants. For example, with Homebrew:
brew update && brew upgrade pantsbuild/tap/pants. - Use its built-in self-update functionality:
SCIE_BOOT=update pants.
Note: Pants uses its own separately-installed Python installation to run itself. This installation is managed by the Pants Launcher Binary. The Pants choice of Python 3.14 for its own code does not limit the versions of Python that you can use to test and build your own code.
For GitHub Actions users that use the pantsbuild/actions/init-pants action with setup-python-for-plugins=true, you will need to update your GHA workflows to use v11 or newer to get the correct version of Python.
As an aid to developing Pants itself (or plugins!), Pants 2.32 includes two developments to assist in profiling:
- The rust engine is now built with frame pointers.
- The global enable_stack_trampoline is an ergonomic option to toggle Python's
perfsupport on both the pants client and daemon.
Together these can produce unified C/Rust/Python tracing data suitable for flamegraphs, https://www.speedscope.app/, and other tools.
For those language ecosystems that use separate type checkers from compilers (So Python, but not JVM languages or Golang for example), the check goal now includes a --force flag that works like the test goals's --force. Use it for benchmarking or debugging rare problems. Supported languages now also include a cache status hint similar to the test output. So using the Pants repository itself as an example, output might look like:
✓ javac succeeded.
✓ mypy (pbs-script, ['CPython==3.11.*']) succeeded in 3.93s (cached locally).
✓ mypy (python-default, ['CPython==3.11.*']) succeeded in 17.87s (cached locally).
✓ scalac succeeded.
✓ typescript succeeded.
generate-lockfiles now has a sync option. On backends that support this feature, it will attempt a minimal update of the lockfile, preserving existing dependency versions where still valid. Currently this is only supported in the Python backend.
For generate-lockfiles, typos in the name of a resolve now give "Did you mean?" style suggestions.
The find-links automatically injected by pants.backend.plugin_development is no longer injected into all Python resolves, only the resolve associated with pants_requirements(name="pants"). Having extraneous un-scoped find-links can materially affect dependency resolution time. In some real world user reports, this results in a >30% improvements in generate-lockfiles wall time.
PublishFieldSet now has a check_skip_request hook to enable preemptive skips of packaging requests for targets where the publishing will be skipped (such as when a skip_push=True field exists).
Fixed inverted logic when setting noninteractive_process_output to only log failures.
The option [docker].push_on_package can be used to prevent Docker images from being pushed during packaging, i.e. when --output contains push=True or type=registry.
Running pants publish on a docker_image target with skip_push=True will no longer package the docker_image.
When pants publish is invoked, Pants will now skip packaging for helm_chart targets if either skip_push=True or the target has no registries.
The default version of the helm-unittest tool has been upgraded from 1.0.1 to 1.0.3
The default version of Helm has been upgraded from 3.14.3 to 3.19.5
generate-lockfiles with sync will perform a minimal update of the lockfile, keeping existing requirement versions
whenever those are still valid. In some cases this may not be any faster than doing a full lockfile regeneration, but it will reduce churn.
The Pex --compress field is now plumbed through to the pex_binary target.
pants tailor now supports custom glob patterns for detecting Python tests. This makes it easier to get started with
Pants when your test files (e.g., *_tests.py) don't match the default patterns.
The Python Build Standalone backend (pants.backend.python.providers.experimental.python_build_standalone) has release metadata current through PBS release 220260127.
When pants publish is invoked, Pants will now skip packaging for python_distribution targets if either skip_twine=True, the target has no registries, or if [twine].skip = true.
Pants will attempt to only preserve the mypy cache when mypy returns a probably-not-a-crash exit code. This is intended as a defensive guard against propagating crash induced inconsistencies back to the "named cache" and propagated to future runs.
The default version of mypy used by Pants has been updated to 1.19.1. This includes support for the new "Fixed‑Format" cache.
Copying the mypy cache back to the "named cache" should now be atomic in all cases.
The mypy subsystem now supports a new cache_mode="none" to disable mypy's caching entirely. This is slower and intended as an "escape valve". It is hoped that on the latest mypy with the above Pants side fixes it will not be necessary.
The runtime field of aws_python_lambda_layer or aws_python_lambda_function now has built-in complete platform configurations for x86-64 and arm64 Python 3.14. This provides stable support for Python 3.14 lambdas out of the box, allowing deleting manual complete_platforms configuration if any.
The grpc-python-plugin tool now uses an updated v1.73.1 plugin built from <https://github.com/nhurden/protoc-gen-grpc-python-prebuilt]. This also brings macos_arm64 support.
All version of Ruff from 0.13.1 to 0.15.5 are now supported by default.
The default version of the Ruff tool has been updated to 0.14.14.
The version of Pex used by the Python backend has been upgraded to v2.91.4. Of particular note for Pants users:
- Support for pip 26.0.1.
- A new
--interpreter-selection-strategyoption to select the"oldest"or"newest"interpreter when multiple match constraints. - Linux PEX scies can now install themselves with a desktop entry.
- Performance improvements for large PEXes
- And for Pants developers fixes the most common case of a rare interpreter caching bug for CPython interpreters that have the same binary contents across patch versions.
For the full changelog, see the individual GitHub Releases for this series: https://github.com/pantsbuild/pants/releases