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

Posted

技术标签:

【中文标题】如何使用 twine 将新版本的项目上传到 PyPI?【英文标题】:How to upload new versions of project to PyPI with twine? 【发布时间】:2019-01-31 15:15:21 【问题描述】:

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

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

现在,如何上传新版本没有任何错误?!

【问题讨论】:

我需要删除现存的./dist 来上传我的新版本 【参考方案1】:

您需要更改版本号。

【讨论】:

【参考方案2】:

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

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

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

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

$ twine upload --skip-existing dist/*

【讨论】:

谢谢,救了我的命:) 哦,我明白了,我需要删除我文件夹中的旧dist....然后就没有这样的错误消息了。【参考方案3】:

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

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

解决方案:

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

正如@dustin所说,同名的dist文件不能再次上传。

【讨论】:

【参考方案4】:

在运行之前确保你的 dist 目录是空的

python setup.py sdist

【讨论】:

【参考方案5】:

错误似乎源于命令:

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 会尝试上传在该 (dist) 文件夹中找到的所有版本。【参考方案6】:

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

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

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

虽然更新版本号是 twine 上传包的要求,但这并不妨碍程序上传 dist 文件夹中的所有内容,包括以前上传的版本。如果您移出旧版本也没关系,但我不确定可能的影响。 使用--skip-existing选项解决了上述问题,但是所有文件都还在处理中,所以需要时间。

我确信有更有效的解决方案,但这对我来说已经足够简单了。

【讨论】:

以上是关于如何使用 twine 将新版本的项目上传到 PyPI?的主要内容,如果未能解决你的问题,请参考以下文章

为什么必须删除我的build和dist文件才能成功将新版本的软件包上传到Pypi?

在 iTunes Connect 中上传具有新版本的应用程序时,应用程序图标未更改

如何将所有模块移动到新版本的 Python(从 3.6 到 3.7)

IBM Worklight:将应用程序上传到 Worklight Server/App Store

在 TestFlight 上上传新版本的实时应用程序

如何在较新版本的打字稿中处理打字稿错误 Object.ts (7053)?