Skip to content

Outdated error message from hatchling when default module name selection fails during hatch shell #1778

Open
@petermorrowdev

Description

@petermorrowdev

The error raised here appears to be out of date. I couldn't find any documentation or issues about this change to the build config, so I might be mistaken, but I felt like it was worth reaching out since hatch seems like it's not behaving as expected.

When a project name does not match the (snake_cased) module name hatch shell will throw this error recommend adding this kind of config to your pyproject.toml:

[tool.hatch.build.targets.wheel]
packages = ["src/foo"]

This appears to be incorrect and the correct recommendation seems to be:

[tool.hatch.build]
packages = ["src/foo"]

Looking through the issues I did see #1245 on improving documentation, so maybe this issue is already known. Or maybe I'm configuring hatch incorrectly..

Steps to reproduce issue

I'm using the latest version of hatch.

hatch --version
# Hatch, version 1.13.0

First, create a fresh hatch project called exampleprefix-foo with one module foo.

hatch new exampleprefix-foo
cd exampleprefix-foo
mv src/exampleprefix_foo src/foo

Then adjust the pyproject.toml to reflect the new module name foo removing unnecessary configs along the way.

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "exampleprefix-foo"
dynamic = ["version"]
description = ''
readme = "README.md"
requires-python = ">=3.8"
license = "MIT"
keywords = []
authors = []
dependencies = []

[tool.hatch.version]
path = "src/foo/__about__.py"

hatch shell with the project in this state will throw the error mentioned above, as expected.

Next, inject the recommended TOML into pyproject.toml

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "exampleprefix-foo"
dynamic = ["version"]
description = ''
readme = "README.md"
requires-python = ">=3.8"
license = "MIT"
keywords = []
authors = []
dependencies = []

[tool.hatch.version]
path = "src/foo/__about__.py"

# Since we have a module named `foo` in this example we can copy/paste verbatim
[tool.hatch.build.targets.wheel]
packages = ["src/foo"]

This will setup the default env successfully, but the foo package is not installed.

hatch shell
python -c 'import foo'
# Traceback (most recent call last):
#   File "<string>", line 1, in <module>
#     import foo
# ModuleNotFoundError: No module named 'foo'

How to resolve

Swap [tool.hatch.build.targets.wheel] for [tool.hatch.build]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "exampleprefix-foo"
dynamic = ["version"]
description = ''
readme = "README.md"
requires-python = ">=3.8"
license = "MIT"
keywords = []
authors = []
dependencies = []

[tool.hatch.version]
path = "src/foo/__about__.py"

[tool.hatch.build]
packages = ["src/foo"]

Then rebuild the hatch shell environment and try again.

hatch env remove
hatch shell
python -c 'import foo'

This works!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions