Невозможно загрузить пакет PIP в реестр артефактов Google с помощью шпагата, ошибка: KeyError: «лицензия»

Я создаю пакет 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, но каждый раз получал одну и ту же ошибку. Кто-нибудь еще сталкивался с этой проблемой?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
595
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Тщательно просмотрев вопросы 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

Кстати, у шпагата есть патч для версии 5.1.1, если вы можете обновить его до 5.x с 4.0.2 Twine.readthedocs.io/en/stable/…

M.M 02.07.2024 07:10

Это решило проблему для меня:

pip3 install importlib-metadata==7.1.0 twine==5.1.1

Другие вопросы по теме