Poetryを使ってPyPIにパッケージを公開するメモ

年が変わる前に書いておこう。

12月になって、PyPI にパッケージを2つ公開した。

以前にもパッケージを公開したことはあるんだけど、PyPI で検索したら2020年10月で、「試しにやってみた」程度のものだった。このときはたぶん Poetry 使ってない。

で、今回は poetry publish コマンドで公開する手順を調べながらやったので、そのメモとして残しておく。

前提

  • PyPI (と Test PyPI)にアカウントを持っていること
  • pyproject.toml が適切に記述されていること

APIトークンの作成

Poetry を使ってパッケージを公開する前に、PyPI と Test PyPI のAPI トークンを作っておく必要がある。

PyPI にログインして、アカウント設定のページに「API トークン」というセクションがある。ここで「トークンの追加」をクリックして作る。詳細は省略。難しいことはないのでやればわかる。

ただし、作成されたトークンは一度しか表示されないので、コピペして保存しておく。

Test PyPI でも同様に作成しておく。

Poetry の設定

必要な設定は、公開先のリポジトリとその API トークンの登録だ。PyPI はデフォルトで登録されているので、Test PyPI をリポジトリとして登録する。

takatoh@apostrophe:~$ poetry config repositories.testpypi https://test.pypi.org/legacy/

Test PyPI を testpypi という名前で登録した。

つぎは先に作成しておいた API トークンを登録する。これは PyPI、Test PyPI の両方に必要。

takatoh@apostrophe:~$ pyetry config pypi-token.pypi "PyPIのAPIトークン"
takatoh@apostrophe:~$ pyetry config pypi-token.testpypi "Test PyPIのAPIトークン"

これでパッケージを公開する準備は完了

パッケージの公開

プロジェクトのルートディレクトリで、poetry publish コマンドを実行する。-r / --repository オプションでリポジトリを指定(指定しないと PyPI に公開)。

Test PyPI に公開する場合:

takatoh@apostrophe:~$ pyetry publish -r testpypi

PyPI に公開する場合:

takatoh@apostrophe:~$ pyetry publish

これで無事公開できた。

プライベートリポジトリに公開する場合

ローカルネットワークに、pypiserver を利用してプライベートなリポジトリ(http://pypilocal/)を作ってあるので、そこにも公開できるように、リポジトリ登録する。

takatoh@apostrophe:~$ poetry config repositories.pypilocal https://pypilocal/

ユーザー認証はしてないからリポジトリの登録だけすればいい。

ただ、ちょっと URL でハマった。pip でこのリポジトリからインストールするには、リポジトリの URL に “http://pypilocal/simple” を指定する。だけど、パッケージ公開用には上のように “http://pypilocal/” だけを設定する。 “simple” をつけてはいけない。Test PyPI では “legacy” がついてたので、こっちも必要なのかと思ったけど違った。

pypilocal に公開するには -r オプションで指定してやればいい。

takatoh@apostrophe:~$ pyetry publish -r pypilocal

おしまい。

miseがPythonのアップグレードに失敗する

mise で Python (3.12系)の最新版 3.12.8 にアップグレードしようとしたところ、失敗した。

takatoh@apostrophe:~$ mise update [email protected]
mise hint use multiple versions simultaneously with mise use [email protected] [email protected]
mise hint disable this hint with mise settings set disable_hints python_multi or all with mise settings set disable_hints "*"
mise hint installing precompiled python from indygreg/python-build-standalone
if you experience issues with this python (e.g.: running poetry), switch to python-build by running mise settings set python_compile 1
mise hint disable this hint with mise settings set disable_hints python_precompiled or all with mise settings set disable_hints "*"
mise failed to extract tar: ~/.local/share/mise/downloads/python/3.12.8/cpython-3.12.8+20241219-x86_64-unknown-linux-gnu-pgo+lto-full.tar.zst to ~/.local/share/mise/downloads/python/3.12.8
mise failed to iterate over archive
mise invalid gzip header
mise Run with --verbose or MISE_VERBOSE=1 for more information

Ruby や Go、Node.js は問題なくできたのに。

ちなみに、mise update [email protected] する前のバージョン状態はこう。

takatoh@apostrophe:~$ mise ls
Tool Version Config Source Requested
go 1.22.10 ~/.mise.toml 1.22
node 20.17.0
node 22.12.0 ~/.mise.toml 22
python 3.11.10
python 3.12.6 (outdated) ~/.mise.toml 3.12
ruby 3.2.5
ruby 3.2.6 ~/.mise.toml 3.2

Python 3.12.6 が outdated になってる。これはより新しい 3.12.8 がリリースされてるからだろう。Python はすでに3.13系がリリースされてるし、Ruby や Go ももっと新しいバージョンがあるけど、ここでは脇に置く。

さて、エラーメッセージを見ると、cpython-3.12.8+20241219-x86_64-unknown-linux-gnu-pgo+lto-full.tar.zst というファイルをダウンロードしていることがわかる。でもってこれを gzip で解凍しようとして失敗している。

.zst という拡張子は ZStandard という圧縮形式だ。はじめはこのコマンドかライブラリがインストールされていないのかと考えたけど、 apt install zstdapt install libzstd1 を実行しても、すでに最新版がインストールされているという結果になった。

ということは mise の問題か?

mise には doctor というサブコマンドがあって、問題があれば報告してくれる。mise help の出力から抜粋するとつぎのとおりだ。

takatoh@apostrophe:~$ mise help
mise is a tool for managing runtime versions. https://github.com/jdx/mise
(中略)
doctor Check mise installation for possible problems [aliases: dr]
(後略)

実行してみるとつぎのようになった。

takatoh@apostrophe:~$ mise doctor
version: 2024.9.5 linux-x64 (1f0f03e 2024-09-17)
activated: yes
shims_on_path: no

build_info:
Target: x86_64-unknown-linux-gnu
Features: DEFAULT, NATIVE_TLS, OPENSSL
Built: Tue, 17 Sep 2024 13:42:22 +0000
Rust Version: rustc 1.81.0 (eeb90cda1 2024-09-04)
Profile: release

shell:
/bin/bash
GNU bash, バージョン 5.2.21(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2022 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

dirs:
data: ~/.local/share/mise
config: ~/.config/mise
cache: ~/.cache/mise
state: ~/.local/state/mise
shims: ~/.local/share/mise/shims

config_files:
~/.config/mise/config.toml
~/.mise.toml

backends:
cargo
core
go
npm
pipx
spm
ubi
vfox

plugins:


toolset:
[email protected]
[email protected]
[email protected]
[email protected]

env_vars:
MISE_SHELL=bash

settings:
activate_aggressive = false
all_compile = false
always_keep_download = false
always_keep_install = false
asdf = true
asdf_compat = false
cargo_binstall = true
color = true
disable_default_shorthands = false
disable_hints = []
disable_tools = []
experimental = false
go_default_packages_file = "~/.default-go-packages"
go_download_mirror = "https://dl.google.com/go"
go_repo = "https://github.com/golang/go"
go_set_gopath = false
go_set_goroot = true
go_skip_checksum = false
http_timeout = 30
jobs = 4
legacy_version_file = true
legacy_version_file_disable_tools = []
libgit2 = true
node_compile = false
not_found_auto_install = true
paranoid = false
pipx_uvx = false
plugin_autoupdate_last_check_duration = "7d"
python_default_packages_file = "~/.default-python-packages"
python_pyenv_repo = "https://github.com/pyenv/pyenv.git"
raw = false
trusted_config_paths = []
quiet = false
use_versions_host = true
verbose = false
vfox = false
yes = false
ci = false
debug = false
trace = false
log_level = "info"
python_venv_auto_create = false

[status]
missing_tools = "if_other_versions_installed"
show_env = false
show_tools = false

No warnings found
1 problem found:

1. new mise version 2024.12.21 available, currently on 2024.9.5

直接の答えではないけど、mise の新しいバージョンがあることがわかった。ならこれで解決するかも。mise 自体をアップグレードするには mise self-update を使う。

takatoh@apostrophe:~$ mise self-update
Checking target-arch... mise-v2024.12.21-linux-x64.tar.gz
Checking current version... v2024.9.5
Checking latest released version... v2024.12.21
New release found! v2024.9.5 --> v2024.12.21
New release is compatible

mise release status:
* Current exe: "/home/takatoh/.local/bin/mise"
* New exe release: "mise-v2024.12.21-linux-x64.tar.gz"
* New exe download url: "https://api.github.com/repos/jdx/mise/releases/assets/216247428"

The new release will be downloaded/extracted and the existing binary will be replaced.
Do you want to continue? [Y/n] y
Downloading...
[00:00:00] [========================================] 12.94 MiB/12.94 MiB (0s) DoneVerifying downloaded file...
Extracting archive... Done
Replacing binary file... Done
Updated mise to 2024.12.21
mise config files in ~ are not trusted. Trust them? Yes

さて、これで mise doctor では問題が報告されなくなった。

では Python のアップグレードはどうか。

takatoh@apostrophe:~$ mise upgrade [email protected]
mise hint use multiple versions simultaneously with mise use [email protected] [email protected]
mise hint installing precompiled python from astral-sh/python-build-standalone
if you experience issues with this python (e.g.: running poetry), switch to python-build by running mise settings python.compile=1
mise [email protected] ✓ installed mise uninstall [email protected] ✓ remove ~/.local/share/mise/installs/python/3.12.6

無事アップグレードできたようだ。各バージョンはつぎの通り。

takatoh@apostrophe:~$ mise ls
Tool Version Source Requested
go 1.22.10 ~/.mise.toml 1.22
node 20.17.0
node 22.12.0 ~/.mise.toml 22
python 3.11.10
python 3.12.8 ~/.mise.toml 3.12
ruby 3.2.5
ruby 3.2.6 ~/.mise.toml 3.2

mise upgrade だと outdated だったバージョンは削除されるんだな。

おまけ

先日リリースされたばかりの Ruby 3.4 をインストールしてみる。

takatoh@apostrophe:~$ mise install [email protected]
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 22.0M 100 22.0M 0 0 73.1M 0 --:--:-- --:--:-- --:--:-- 73.3M
mise [email protected] ✓ installed

3.4.0 じゃなくて 3.4.1 がインストールされた。もうパッチが出たの?と思って公式サイトを見ると、「このリリースではバージョン表記を修正しています。」とだけ書いてある。別に大したことじゃなさそう。