Я создаю пакет Python PIP для хранения в реестре артефактов Google.
pyproject.toml
выглядит следующим образом:
[build-system]
requires = ["setuptools>=68.0.0,<69.0.0", "setuptools-scm>=8.0.1,<8.1.0"]
build-backend = "setuptools.build_meta"
[project]
name = "my-sdk"
version = "0.1.3"
license = {text = "Some Solution"}
readme = "README.md"
requires-python = ">=3.8,<3.11"
dependencies = [
"google-cloud-storage>=2.6.0"
]
[project.optional-dependencies]
ci = [
"flake8==6.0.0",
"Flake8-pyproject==1.2.3",
"pytest-cov==4.1.0",
"pytest==7.2.2"
]
[tool.setuptools.packages.find]
include = ["*"]
namespaces = false
[tool.pytest]
norecursedirs = [".git", ".tox"," venv*"]
addopts = "-rsxX -q -p no:warnings"
python_files = ["*_test.py", "test_*.py"]
log_cli = true
log_cli_level = "INFO"
[tool.flake8]
max-line-length = 100
select = ["E", "W", "F", "C", "B"]
ignore = ["E203", "W503", "E731"]
per-file-ignores = ["__init__.py: F401", "test_*.py: D103"]
Последовательность команд для пакета:
python -m pip install \
keyring==24.3.0 \
keyrings.google-artifactregistry-auth==1.1.2 \
build==1.0.3 \
twine==4.0.2
python -m build
python -m twine upload \
--repository-url https://<hidden>.pkg.dev/my-project/my-artifacts \
dist/*
Не удается выполнить только последний шаг, т. е. twine upload
, а сообщение об ошибке приведено ниже:
Traceback (most recent call last):
File "/miniconda/envs/pip_env/lib/python3.10/runpy.py", line 187, in _run_module_as_main
mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
File "/miniconda/envs/pip_env/lib/python3.10/runpy.py", line 146, in _get_module_details
return _get_module_details(pkg_main_name, error)
File "/miniconda/envs/pip_env/lib/python3.10/runpy.py", line 110, in _get_module_details
__import__(pkg_name)
File "/miniconda/envs/pip_env/lib/python3.10/site-packages/twine/__init__.py", line 43, in <module>
__license__ = metadata["license"]
File "/miniconda/envs/pip_env/lib/python3.10/site-packages/importlib_metadata/_adapters.py", line 54, in __getitem__
raise KeyError(item)
KeyError: 'license'
Я пробовал разные типы license
в pyproject.toml, но каждый раз получал одну и ту же ошибку.
Кто-нибудь еще сталкивался с этой проблемой?
Тщательно просмотрев вопросы twine
, я не смог найти подходящего ответа.
Однако я видел, что на pypi.org версия 5.1.0 была удалена из-за аналогичной ошибки: KeyError
.
Поэтому я решил перейти на 5.1.1
, и тогда twine upload
получилось.
python -m pip install \
keyring==24.3.0 \
keyrings.google-artifactregistry-auth==1.1.2 \
build==1.0.3 \
twine==5.1.1
Как упоминается в сообщении ниже, версия 5.1.1 касается выпуска importlib-metadata==8.0.0
.
https://github.com/pypa/twine/issues/1125#issuecomment-2191941192
Где-то в importlib-metadata 7.x было добавлено предупреждение об устаревании DeprecationWarning: Implicit None on return values is deprecated and will raise KeyErrors.
importlib-metadata v8, выпущенного несколько дней назад, что теперь вызывает ключевую ошибку. Попробуйте добавить ограничение для importlib-metadata<8.
[project.optional-dependencies]
ci = [
"flake8==6.0.0",
"Flake8-pyproject==1.2.3",
"pytest-cov==4.1.0",
"pytest==7.2.2",
"importlib-metadata<8.0.0"
]
Вам придется управлять этой зависимостью, пока она не будет решена в Twine. Twine не предлагает верхнего предела для метаданных importlib https://github.com/pypa/twine/blob/2e0bd6f2376a9549b47d42db79244bac6ed047c8/pyproject.toml#L38
Это решило проблему для меня:
pip3 install importlib-metadata==7.1.0 twine==5.1.1
Кстати, у шпагата есть патч для версии 5.1.1, если вы можете обновить его до 5.x с 4.0.2 Twine.readthedocs.io/en/stable/…