如何使用 twine 将新版本的项目上传到 PyPI?

How to upload new versions of project to PyPI with twine?

我已经将我的 Python 包上传到 PyPI。 但是现在我制作了我的包的新版本并且需要上传它。 我尝试取得与第一次上传包时相同的进展。 但给我这个错误:

HTTPError: 400 Client Error: File already exists. See https://pypi.org/help/#file-name-reuse for url: https://upload.pypi.org/legacy

现在,如何上传新版本才不会出错?!

您需要更改版本号。

PyPI 不允许重复使用分发文件名(项目名称 + 版本号 + 分发类型)。

这确保了给定项目的给定版本的给定分发将始终解析为相同的文件,并且不会有一天被项目维护者或恶意方偷偷更改(它只能被删除)。

您需要将版本号更改为您之前未上传到 PyPI 的版本号。

您没有提到您是如何上传分发的,但如果您使用 twine,也有可能您正在尝试重新上传之前上传的分发。要解决这个问题,您可以这样做:

$ twine upload --skip-existing dist/*

由于以下原因可能会出现该错误:

  • 没有在 setup.py
  • 中更改您的版本
  • 没有删除您之前的 dist 文件

解决方案:

  • 更改setup.py中的版本号。
  • 运行 再次设置文件。 python setup.py bdist_wheel.
  • 仅上传该 dist 文件或 运行 麻绳(如果使用)。 twine upload --skip-existing dist/*

如@dustin所述,同名的dist文件无法再次上传。

确保 dist 目录在 运行

之前是空的
python setup.py sdist

错误似乎源于命令:

twine upload --repository-url https://test.pypi.org/legacy/ dist/*
reusing the previous package version.

要解决这个问题,试试这个:

twine upload --skip-existing --repository-url https://test.pypi.org/legacy/ 
dist/*

另一种没有提到的方法是提供明确的文件名:

twine upload --repository testpypi --skip-existing dist/myProject-0.1.9-py3-none-any.whl

与其他提议的解决方案相比,这具有优势,准确地说:

  • 虽然更新版本号是 twine 上传包的必要条件,但这不会阻止程序上传 dist 文件夹中的所有内容,包括以前上传的版本。如果你移出旧版本没关系,但我不确定可能的影响。
  • 使用--skip-existing选项解决了上面的问题,但是所有的文件还是要处理,所以需要时间。

我相信有更有效的解决方案,但这对我来说很简单。