twine上传报错(InvalidDistribution: Invalid distribution metadata)解决方案
错误原因分析
这个报错的核心含义是:你使用了
license-expression(许可证表达式)这个字段,但它是在 metadata version 2.4 中才被引入的,而你的项目元数据版本还停留在 2.1,版本不兼容导致验证失败。简单来说,
twine 会严格校验项目的 setup.py/pyproject.toml 中的元数据格式,低版本元数据不支持高版本才有的字段。解决方案
方案 1:升级元数据版本(推荐)
修改项目的元数据配置,将版本升级到 2.4 及以上,适配
根据你的项目配置方式,分两种情况:
license-expression 字段。根据你的项目配置方式,分两种情况:
情况 A:使用 setup.py
修改
setup.py 中的 metadata_version 字段,并规范许可证写法from setuptools import setup
setup(
name="你的包名",
version="0.1.0",
# 升级元数据版本到 2.4
metadata_version="2.4",
# 使用 license_expression 字段(替代旧的 license 字段)
license_expression="MIT", # 示例:替换为你的实际许可证,如 Apache-2.0、BSD-3-Clause 等
author="你的名字",
author_email="你的邮箱",
description="包描述",
packages=["你的包目录"],
)
情况 B:使用 pyproject.toml(现代推荐方式)
修改
pyproject.toml 中的 [project] 部分:[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "你的包名"
version = "0.1.0"
# 元数据版本会自动适配,无需手动指定
license = { file = "LICENSE" } # 或直接写表达式:license = "MIT"
authors = [
{ name="你的名字", email="你的邮箱" }
]
description = "包描述"
方案 2:降级许可证写法(兼容旧版本)
如果不想升级元数据版本,可改用旧版本支持的
license 字段(去掉 license-expression):# setup.py 示例(元数据版本保留 2.1)
setup(
name="你的包名",
version="0.1.0",
metadata_version="2.1",
# 改用旧的 license 字段,而非 license_expression
license="MIT", # 直接写许可证名称,而非表达式
# 其他配置...
)
方案 3:降级 twine/setuptools 版本(兜底,可能有兼容性问题)
# twine 3.x 之前的版本校验较松,setuptools 50.x 适配旧元数据 pip install twine==3.8.0 setuptools==50.0.0
方案 4:使用自定义脚本上传(终极兜底)
upload_script.py
import requests
# 配置信息
upload_url = "http://10.0.0.214:8080/" # 仓库上传地址
package_path = "your_package-0.1.0-py3-none-any.whl" # 包路径
username = "你的仓库用户名" # 如果不需要认证,可删去auth相关
password = "你的仓库密码"
# 读取包文件
with open(package_path, "rb") as f:
files = {"file": (package_path, f)}
# 发送上传请求
response = requests.post(
upload_url,
files=files,
auth=(username, password) # 无认证则注释这行
)
# 打印结果
print(f"上传状态码: {response.status_code}")
print(f"上传响应: {response.text}")
运行脚本:
python upload_script.py

浙公网安备 33010602011771号