Pipenv から Poetry への乗り換え

乗り換えるリポジトリ

GitHub - kk6/aeroplast: Transparent PNG conversion (Mainly for Twitter)

twitterにアップロードしたPNGがJPGに強制変換されて見栄えが悪いという問題がある。それを回避するために画像の四隅どこかに1pxの透過ドットを打ち込むという方法がある。いちいちペイントソフトでそれを毎回やるのが面倒なのでコマンドラインで画像のPath渡したら変換してくれるコマンドラインツールを以前作った。こいつをPipenvで管理しているので、Poetryへの乗り換えを試してみる。

Poetry については数日中にもうちょっと突っ込んだ記事書きます。

pyproject.toml の生成

init コマンドで対話形式で情報を入力していくだけ。

$ poetry init

This command will guide you through creating your pyproject.toml config.

Package name [aeroplast]:
Version [0.1.0]:
Description []: Transparent PNG conversion.
Author [kk6 <hiro.ashiya@gmail.com>, n to skip]:
License []: MIT
Compatible Python versions [^3.7]:

Would you like to define your dependencies (require) interactively? (yes/no) [yes] no



Would you like to define your dev dependencies (require-dev) interactively (yes/no) [yes] no

Generated file

[tool.poetry]
name = "aeroplast"
version = "0.1.0"
description = "Transparent PNG conversion."
authors = ["kk6 <hiro.ashiya@gmail.com>"]
license = "MIT"

[tool.poetry.dependencies]
python = "^3.7"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"


Do you confirm generation? (yes/no) [yes] yes

これで pyproject.toml が生成される。

依存パッケージのインストール

続いて Pipfile を見ながらパッケージを poetry add で追加する。

(追記) だるいのでツール作った

kk6.hateblo.jp

(追記おわり)

$ poetry add pillow fire logzero
Using version ^5.3 for pillow
Using version ^0.1.3 for fire
Using version ^1.5 for logzero

Updating dependencies
Resolving dependencies... (3.2s)


Package operations: 0 installs, 1 update, 0 removals

Writing lock file

  - Updating six (1.11.0 -> 1.12.0)

インストールしたパッケージは tool.poetry.dependencies セクションに追記されている。

[tool.poetry]
name = "aeroplast"
version = "0.1.0"
description = "Transparent PNG conversion."
authors = ["kk6 <hiro.ashiya@gmail.com>"]
license = "MIT"

[tool.poetry.dependencies]
python = "^3.7"
pillow = "^5.3"
fire = "^0.1.3"
logzero = "^1.5"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

と同時に poetry.lock ファイルが生成されている。依存関係はこちらに記述されている。

pytestのインストールを忘れていた。

$ poetry add -D pytest
Using version ^4.0 for pytest

Updating dependencies
Resolving dependencies... (0.5s)


Package operations: 0 installs, 1 update, 0 removals

Writing lock file

  - Updating pytest (4.0.1 -> 4.0.2)

今回は -D オプションを付けてインストールしたので、pyproject.toml の tool.poetry.dev-dependencies セクションの方に追記されている。

[tool.poetry.dependencies]
python = "^3.7"
pillow = "^5.3"
fire = "^0.1.3"
logzero = "^1.5"

[tool.poetry.dev-dependencies]
pytest = "^4.0"

コマンドラインツールとして実行できるようにする

PipenvのときはPipfileに以下のように記述して使っていた。

[scripts]
cli = "pipenv run python -m aeroplast"

こんな感じで使っていた

$ pipenv run cli convert ...

Potryの場合は pyproject.tomltool.poetry.scripts セクションに記述する。

[tool.poetry.scripts]
aeroplast = "aeroplast.cli:main"

Poetryの便利なところは、パッケージをビルドした際にこの設定がそのまま setup.pyconsole_scripts として記述される。ビルドする時にコマンドとして実行できるようにあらためてsetup.pyを書く必要がない。

...
entry_points = \
{'console_scripts': ['aeroplast = aeroplast.cli:main']}
...

とまあそれはさておき poetry run aeroplast で実行できるようになった。

$ poetry run aeroplast
Type:        CLI
String form: <aeroplast.cli.CLI object at 0x100f6e978>
Docstring:   Transparent PNG conversion

Usage:       aeroplast
             aeroplast convert
             aeroplast resize

また、poetry developpip install -e . するのと同様に開発途中のパッケージをvenvにインストールできる。インストールした上で poetry shell でvenvをactivateすると aeroplast コマンドのみで実行可能になる。

$ poetry shell
Spawning shell within /Users/kk6/PycharmProjects/aeroplast/.venv
Welcome to fish, the friendly interactive shell
$ poetry develop
develop is deprecated use install instead.

Installing dependencies from lock file

Nothing to install or update

  - Installing aeroplast (0.1.0)
$ aeroplast
Type:        CLI
String form: <aeroplast.cli.CLI object at 0x107dfa908>
Docstring:   Transparent PNG conversion

Usage:       aeroplast
             aeroplast convert
             aeroplast resize
<aeroplast.cli.CLI object at 0x107dfa908>

以上で移行完了。わりと簡単。しかも今すぐにでも以下の2行を実行するだけでPyPIに公開可能な状態となっている。

$ poetry build
$ poetry publish

Poetry便利。