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 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.
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.
For generate-lockfiles, typos in the name of a resolve now give "Did you mean?" style suggestions.
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).
The --pull flag for docker_image targets now supports also podman. When podman is activated the flag can be set to missing, always,never and newer as well as False (equal to missing) or True (equal to always).
The default behavior is now missing, which pulls the base image only if it is not already present locally.
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 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.
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.90.2. 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.
For the full changelog, see the individual GitHub Releases for this series: https://github.com/pantsbuild/pants/releases