Как я могу создать пустой пакет python? - PullRequest
0 голосов
/ 14 января 2020

Я хотел бы создать пустой (мета) пакет, используя инструмент поэзии, главным образом, чтобы упростить объединение списка зависимостей. Если я создаю свой project.toml следующим образом:

[build-system]
requires = ["poetry"]

[tool.poetry]
name = "metapackage"
version = "1.0.0"
description = "My empty metapackage"
authors = ["Me"]
license = "MIT"

[tool.poetry.dependencies]
numpy = "*"

Затем выполняю poetry build, я получаю сообщение об ошибке:

$ mkdir -p metapackage
$ python -m poetry build --no-interaction --format wheel -vvvUsing virtualenv: /Users/duncan/opt/miniconda3/envs/py37
Building metapackage (1.0.0)

[ValueError]
metapackage is not a package.

Traceback (most recent call last):
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/clikit/console_application.py", line 131, in run
    status_code = command.handle(parsed_args, io)
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/clikit/api/command/command.py", line 120, in handle
    status_code = self._do_handle(args, io)
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/clikit/api/command/command.py", line 171, in _do_handle
    return getattr(handler, handler_method)(args, io, self)
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/cleo/commands/command.py", line 92, in wrap_handle
    return self.handle()
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/poetry/console/commands/build.py", line 30, in handle
    builder.build(fmt)
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/poetry/masonry/builder.py", line 19, in build
    builder = self._FORMATS[fmt](self._poetry, self._env, self._io)
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/poetry/masonry/builders/wheel.py", line 44, in __init__
    super(WheelBuilder, self).__init__(poetry, env, io)
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/poetry/masonry/builders/builder.py", line 68, in __init__
    includes=self._package.include,
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/poetry/masonry/utils/module.py", line 72, in __init__
    source=package.get('from'),
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/poetry/masonry/utils/package_include.py", line 15, in __init__
    self.check_elements()
  File "/Users/duncan/opt/miniconda3/envs/py37/lib/python3.7/site-packages/poetry/masonry/utils/package_include.py", line 61, in check_elements
    raise ValueError('{} is not a package.'.format(root.name))

Я что-то упускаю, чтобы сказать стихам, что этот пакет имеет нет содержимого?

Приложение: я просто использую поэзию как средство для создания каталога .dist-info, заполненного метаданными, чтобы pip видел установленные метапакеты, если есть лучший инструмент для этого, я Я счастлив переключиться.

Ответы [ 2 ]

2 голосов
/ 23 января 2020

С setuptools это может выглядеть следующим образом:

pyproject.toml

[build-system]
build-backend = "setuptools.build_meta"
requires = ["setuptools"]

setup.cfg

[metadata]
name = metapackage
version = 1.0.0
description = My empty metapackage
authors = Me
license = MIT

[options]
install_requires =
    numpy

Обратите внимание, как параметры packages, py_modules, scripts и ext_modules не заполняются.

1 голос
/ 14 января 2020

Абсолютное минимальное требование для пакета, который вы создаете с поэзией, состоит в том, что он содержит импортируемый модуль или пакет python.

Таким образом, вам нужен как минимум один файл, который будет содержать оператор import metapackage, для этого недостаточно просто папки без файлов:

вариант 1, с модулем

.
├── pyproject.toml
└── metapackage.py  # can be empty

вариант 2, с пакетом

.
├── pyproject.toml
└── metapackage
    └── __init__.py  # can be empty
...