PyPI でバージョン番号を変えず内容を変える

PyPI では、アップロードしたファイルを消すことが出来ても、置き換えることはできない。従って、あるバージョンでアップロードしてしまった後、そこにミスが発覚した場合、再アップロードして置き換えることは不可能である。

www.reddit.com

・・・というのが常識で、例えば上の reddit での議論でも、できないのが仕様ということになっている。

しかし、実は、1度だけチャンスがある。パッケージ作成で使うアーカイブのフォーマットを変えると再アップロードできる。具体的な手順は以下。

  • PyPI の Web 上で、'Remove' ボタンを使って、再アップロードしたいバージョンを一度削除する。
  • フォーマットに zip を指定してパッケージを作成しアップロードする。
python setup.py sdist --formats zip upload

仕組みとしては、PyPI は重複判定を単純にファイルが存在するかで判定しているらしく、しかも ‘Remove’ をしてもファイルは残ったままになっている。そこで、zip を指定すると、ファイル名が被らないので再アップロードができる(デフォルトは tar.gz)。

ちなみに、ドキュメントを見ると、一見 zip, tar.gz のみならず色々な種類のアーカイブがサポートされているように見える・・・が、PyPI がサポートしているのは zip, tar.gz のみであり、他のフォーマットを使うと以下のようなエラーになる。複数回チャンスがあると誤解すると危険なので注意。

Upload failed (400): Invalid file extension.
error: Upload failed (400): Invalid file extension.