从命令行上传时如何覆盖pypi包?

Posted

技术标签:

【中文标题】从命令行上传时如何覆盖pypi包?【英文标题】:How to overwrite pypi package when doing upload from command line? 【发布时间】:2014-01-30 14:56:11 【问题描述】:

我想在某些情况下自动化上传过程错误 python setup.py upload 失败,因为 pypi 服务器已经上传了保存版本。

如何强制它从脚本上传(我知道我可以使用网络界面删除旧变体)。

【问题讨论】:

我遇到了同样的问题,但找不到使用当前 pypi 和 setuptools 的方法。 尤其是test pypi 服务器的存在,这似乎很荒谬。即使你从服务器上删除了现有版本,你也不能重新上传那个版本,说“这个文件名以前被使用过,你应该使用不同的版本。这至少在测试服务器上应该是可能的。错误的形式, pypi. 测试服务器,旨在学习真实的东西,在我看来应该表现得像真实的东西。并且任何更改都应强制使用新的版本子编号。因为如果您不厌其烦地上传改进,为什么不授予用户下载权限呢?允许覆盖已删除的版本可能是混乱的潜在根源。谁来说明什么是重大变化,什么不是。 我希望我有不止一张赞成票给@obsoleteaccount。即使您的更改“只是一个错误修复”,覆盖现有或已删除的版本也会为某人上传“只是一个重大更改”打开大门。如果有帮助,可以将其视为“显式优于隐式”的另一种情况。 【参考方案1】:

一个迟到的答案,但是:似乎每个人都同意您不能覆盖现有的 pypi 上传,或者在删除损坏的版本后重新上传固定版本。然而,这似乎实际上是可行的并且得到了官方的支持:“内部版本号”是一个没有人使用过或不记得它们存在的功能,但这似乎有效,至少对我来说是这样。

诀窍是按照以下模式重命名文件:

mypackage-0.31.0-py2.py3-none-any.whl
mypackage-0.31.0-1-py2.py3-none-any.whl
mypackage-0.31.0-2-py2.py3-none-any.whl

“-1”或“-2”是内部版本号。如果 pip 找到同一版本的所有这些文件,它将选择具有最高版本号的文件。如果它找到一个具有非零内部版本号的单个文件,它似乎也可以工作,因此您可以在删除原始文件后使用它。

(https://www.python.org/dev/peps/pep-0427/#file-name-convention 的文档中很快提到了这一点,但如果没有 Daniel Holth 向我指出,我不会猜到它的用途。谢谢 Daniel!)

我不知道为什么互联网上有这么多人认为它做不到。我自己昨天才知道这件事,并认为我应该尝试传递这些信息。

在此处插入关于不要滥用该功能的常见警告。一个典型的例子,当我认为你应该使用它时,其中一个***制造不好,你需要用相同来源的正确制造的***替换它

【讨论】:

当我使用这个技巧时,我按照描述重命名了.whl.tar.gz 文件并且它工作但它出现在pypi 上,其内部版本号不是1,而是post1 .所以我重命名为1.1.0-1,但pypi上的版本是1.1.0.post1。除此之外,这是可行的。 我尝试在源包上使用相同的技巧,以不改变任何***的方式更新源代码。那是行不通的。看起来除了重建所有***并发布完整版本之外,没有任何解决方案。【参考方案2】:

这是一个实际的答案,不仅仅是我在 cmets 中添加了更多的自言自语。找到这个话题:

https://www.reddit.com/r/Python/comments/35xr2q/howto_overwrite_package_when_reupload_to_pypi/

指的是这个:

http://comments.gmane.org/gmane.comp.python.distutils.devel/22739

说做不到。

还要注意 reddit 线程中关于阅读 semver.org 和增加补丁的微型版本的评论。

【讨论】:

以上是关于从命令行上传时如何覆盖pypi包?的主要内容,如果未能解决你的问题,请参考以下文章

Spring:从命令行覆盖一个 application.property

在 PyPI 测试站点命令行 ValueError 上注册

从命令行覆盖 qmake 变量

如何从命令行测试Perl CGI脚本的文件上传?

CMAKE_INSTALL_PREFIX如何设置默认值,并且保留从命令行覆盖的能力?

如何将原始 Python 包上传到 PyPI?