Skip to main content
Version: 2.21

Common subsystem tasks

Common tasks for Subsystems


Skipping individual targets

Many subsystems allow skipping specific targets. For example, you might have Python files that you want to not typecheck with mypy. In Pants, this is achieved with a skip_* field on the target. This is simple to implement.

  1. Create a field for skipping your tool
from pants.engine.target import BoolField

class SkipFortranLintField(BoolField):
alias = "skip_fortran_lint"
default = False
help = "If true, don't run fortran-lint on this target's code."
  1. Register this field on the appropriate targets.
def rules():
return [
FortranSourceTarget.register_plugin_field(SkipFortranLintField),
]
  1. Add this field as part of your subsystems opt_out method:
from dataclasses import dataclass

from pants.engine.target import FieldSet, Target


@dataclass
class FortranLintFieldSet(FieldSet):
required_fields = (FortranSourceField,)

source: FortranSourceField

@classmethod
def opt_out(cls, tgt: Target) -> bool:
return tgt.get(SkipFortranLintField).value

Making subsystems exportable with their default lockfile

Support depends on language backend of the subsystem

Only some language backends support pants export. These include the Python and JVM backends. Only tools which are themselves written to use a backend with this feature can be exported. For example, a Python-based tool which operates on a different language is exportable.

  1. Make the subsystem a subclass of ExportableTool

    Language backends may have done this in their Tool base class.

    For example, the Python backend with PythonToolRequirementsBase and JVM with JvmToolBase are already subclasses.

    from pants.backend.python.subsystems.python_tool_base import PythonToolBase
    from pants.core.goals.resolves import ExportableTool

    class FortranLint(PythonToolBase, ExportableTool):
    ...
  2. Register your class with a UnionRule with ExportableTool

    def rules():
    return [
    UnionRule(ExportableTool, FortranLint)
    ]