mirror of https://github.com/pypa/hatch.git
324 lines
8.7 KiB
Markdown
324 lines
8.7 KiB
Markdown
# Build configuration
|
|
|
|
-----
|
|
|
|
All build configuration is defined in the `tool.hatch.build` table.
|
|
|
|
[Build targets](#build-targets) are defined as sections within `tool.hatch.build.targets`:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build.targets.<TARGET_NAME>]
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build.targets.<TARGET_NAME>]
|
|
```
|
|
|
|
For each build target you may override any of the defaults set in the top-level `tool.hatch.build` table.
|
|
|
|
## Build system
|
|
|
|
To be compatible with the broader [Python packaging ecosystem](../build.md#packaging-ecosystem), you must define the [build system](https://www.python.org/dev/peps/pep-0517/#source-trees) as follows:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
```
|
|
|
|
The version of `hatchling` defined here will be used to build all targets.
|
|
|
|
Hatchling is a [PEP 517][]/[PEP 660][] compatible build system and is a dependency of Hatch itself.
|
|
|
|
## File selection
|
|
|
|
### VCS
|
|
|
|
By default, Hatch will respect any `.gitignore` file located at your project's root. Set `ignore-vcs` to `true` to disable this behavior:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build]
|
|
ignore-vcs = true
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build]
|
|
ignore-vcs = true
|
|
```
|
|
|
|
### Patterns
|
|
|
|
You can set the `include` and `exclude` options to select exactly which files will be shipped in each build, with `exclude` taking precedence. The options may be defined as either an array of strings or a comma-separated string, with every entry representing a [Git-style glob pattern](https://git-scm.com/docs/gitignore#_pattern_format).
|
|
|
|
For example, the following configuration:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build]
|
|
include = [
|
|
"pkg/*.py",
|
|
"/tests",
|
|
]
|
|
exclude = "*.json,pkg/_compat.py"
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build]
|
|
include = [
|
|
"pkg/*.py",
|
|
"/tests",
|
|
]
|
|
exclude = "*.json,pkg/_compat.py"
|
|
```
|
|
|
|
will exclude every file with a `.json` extension, and will include everything under a `tests` directory located at the root and every file with a `.py` extension that is directly under a `pkg` directory located at the root except for `_compat.py`.
|
|
|
|
### Packages
|
|
|
|
The `packages` option can be used to include specific Python packages. This option is semantically equivalent to `include` except that every entry is a simple relative path and the shipped path will be collapsed to only include the final component.
|
|
|
|
So for example, if you want to ship a package `foo` that is stored in a directory `src` you would do:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build]
|
|
packages = "src/foo"
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build]
|
|
packages = "src/foo"
|
|
```
|
|
|
|
### Artifacts
|
|
|
|
If you want to include files that are [ignored by your VCS](#vcs), such as those that might be created by [build hooks](#build-hooks), you can use the `artifacts` option. This option is semantically equivalent to `include`.
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build]
|
|
artifacts = [
|
|
"*.so",
|
|
"*.dll",
|
|
]
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build]
|
|
artifacts = [
|
|
"*.so",
|
|
"*.dll",
|
|
]
|
|
```
|
|
|
|
### Default file selection
|
|
|
|
If no file selection options are provided, then what gets included is determined by each [build target](#build-targets).
|
|
|
|
## Reproducible builds
|
|
|
|
By default, [build targets](#build-targets) will build in a reproducible manner provided that they support that behavior. To disable this, set `reproducible` to `false`:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build]
|
|
reproducible = false
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build]
|
|
reproducible = false
|
|
```
|
|
|
|
When enabled, the [SOURCE_DATE_EPOCH](https://reproducible-builds.org/specs/source-date-epoch/) environment variable will be used for all build timestamps. If not set, then Hatch will use an [unchanging default value](../plugins/utilities.md#hatchling.builders.utils.get_reproducible_timestamp).
|
|
|
|
## Output directory
|
|
|
|
When the output directory is not provided to the [`build`](../cli/reference.md#hatch-build) command, the `dist` directory will be used by default. You can change the default to a different directory using a relative or absolute path like so:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build]
|
|
directory = "<PATH>"
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build]
|
|
directory = "<PATH>"
|
|
```
|
|
|
|
## Dev mode
|
|
|
|
In most cases, [dev mode](environment.md#dev-mode) environment installations or [editable installs](https://pip.pypa.io/en/stable/cli/pip_install/#editable-installs) in general will work as expected. However, for some project layouts you need to explicitly define which directories to add to Python's search path, such as for [namespace packages](https://packaging.python.org/guides/packaging-namespace-packages/).
|
|
|
|
You can do this with the `dev-mode-dirs` option, which may be defined as either an array of strings or a comma-separated string:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build]
|
|
dev-mode-dirs = "."
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build]
|
|
dev-mode-dirs = "."
|
|
```
|
|
|
|
## Build targets
|
|
|
|
A build target can be provided by any [builder plugin](../plugins/builder.md). There are three built-in build targets: [wheel](../plugins/builder.md#wheel), [sdist](../plugins/builder.md#source-distribution), and [custom](../plugins/builder.md#custom).
|
|
|
|
### Dependencies
|
|
|
|
You can specify additional dependencies that will be installed in each build environment, such as for third party builders:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build.targets.your-target-name]
|
|
dependencies = [
|
|
"your-builder-plugin"
|
|
]
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build.targets.your-target-name]
|
|
dependencies = [
|
|
"your-builder-plugin"
|
|
]
|
|
```
|
|
|
|
### Versions
|
|
|
|
If a build target supports multiple build strategies or if there are major changes over time, you can specify exactly which versions you want to build using the `versions` option, which may be defined as either an array of strings or a comma-separated string:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build.targets.<TARGET_NAME>]
|
|
versions = [
|
|
"v1",
|
|
"beta-feature",
|
|
]
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build.targets.<TARGET_NAME>]
|
|
versions = [
|
|
"v1",
|
|
"beta-feature",
|
|
]
|
|
```
|
|
|
|
## Build hooks
|
|
|
|
A build hook defines code that will be executed at various stages of the build process and can be provided by any [build hook plugin](../plugins/build-hook.md). There is one built-in build hook: [custom](../plugins/build-hook.md#custom).
|
|
|
|
Build hooks can be applied either globally:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build.hooks.<HOOK_NAME>]
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build.hooks.<HOOK_NAME>]
|
|
```
|
|
|
|
or to specific build targets:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build.targets.<TARGET_NAME>.hooks.<HOOK_NAME>]
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build.targets.<TARGET_NAME>.hooks.<HOOK_NAME>]
|
|
```
|
|
|
|
### Dependencies
|
|
|
|
You can specify additional dependencies that will be installed in each build environment, such as for third party build hooks:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build.hooks.your-hook-name]
|
|
dependencies = [
|
|
"your-build-hook-plugin"
|
|
]
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build.hooks.your-hook-name]
|
|
dependencies = [
|
|
"your-build-hook-plugin"
|
|
]
|
|
```
|
|
|
|
### Order of execution
|
|
|
|
For each build target, build hooks execute in the order in which they are defined, starting with target-specific hooks.
|
|
|
|
As an example, for the following configuration:
|
|
|
|
=== ":octicons-file-code-16: pyproject.toml"
|
|
|
|
```toml
|
|
[tool.hatch.build.hooks.hook3]
|
|
[tool.hatch.build.hooks.hook1]
|
|
|
|
[tool.hatch.build.targets.foo.hooks.hook2]
|
|
```
|
|
|
|
=== ":octicons-file-code-16: hatch.toml"
|
|
|
|
```toml
|
|
[build.hooks.hook3]
|
|
[build.hooks.hook1]
|
|
|
|
[build.targets.foo.hooks.hook2]
|
|
```
|
|
|
|
When target `foo` is built, build hook `hook2` will be executed first, followed by `hook3`, and then finally `hook1`.
|