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

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

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

【问题讨论】:

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

标签: distutils pypi distutils2


【解决方案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 和增加补丁的微型版本的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多