注意
現在、Python のパッケージングに関する設定は setup.py には定義せず、
pyproject.toml に定義することが主流になりつつあります。
Python 3.6 以下をサポートするなどの理由で
どうしても setup.py にパッケージングの設定を定義しなければいけない、など
特別な事情がない限りは、パッケージングの設定は pyproject.toml に移行することをお奨めします。
ただし、2023-04-17 現在、
Pipfile と pyproject.toml の依存関係の設定を同期したり確認したりする方法は見つけられませんでした。
Pipfile を更新する都度、手作業で pyproject.toml に設定を書き写す必要があることに注意します。
また、上記のような理由で、今後の Python パッケージの新バージョンは急速に Python 3.6 以下に非対応になっていく可能性があります。
万一、まだ Python 3.6 以下を利用している場合は、早急に Python のバージョンアップを行うことをお奨めします。
事前の設定
pipenv-setup を使います:
pipenv install --dev pipenv-setup
pipenv-setup には Pipfile や Pipfile.lock の設定を setup.py に同期する機能があります。(後述)
この機能は同時に setup.py のフォーマット (自動整形) も行います。
そのときに使うフォーマッターを black か autopep8 から選択して、依存関係として一緒にインストールすることができます:
pipenv install --dev "pipenv-setup[black]" # または: pipenv-setup[autopep8]
コーディング規約などで特段の定めがない限り、black を使うことをお勧めします。
参考: 2023-04-17 現在の GitHub Star 数の比較:
| フォーマッター | GitHub Star 数 |
|---|---|
| black | 32,021+ |
| autopep8 | 4,321+ |
手順
1. まず、ローカルで Pipfile と setup.py を比較します
pipenv run pipenv-setup check --strict
ポイント: --strict で同一のバージョン要件のみを許可します
デフォルトでは、pipenv-setup チェックは、
setup.py が指定するバージョンが Pipfile の範囲内である場合にパスします。
たとえば、次がそのようなケースです:
-
Pipfile:django~=1.1 -
setup.py:django==1.2
--strict を指定すると、同一の要件のみを許可します。
つまり、上記のように Pipfile: django~=1.1 の場合、setup.py は django>=1.1,<2.0 となっている必要があります。
2. 問題がある場合は同期します
pipenv run pipenv-setup sync --pipfile
ポイント: --pipfile で Pipfile.lock ではなく、Pipfile に合わせて setup.py を更新します
デフォルトでは、pipenv-setup は Pipfile.lock に合わせて setup.py を更新します。
--pipfile を指定すると、Pipfile に合わせて setup.py を更新します。
要件に合わせて選択していただく必要がありますが、
setup.py に依存関係を定義するということは、多くの場合、パッケージ開発が目的であり、
依存関係にはある程度の幅を持たせたいと考えられますので、
--pipfile の指定が必要となる場合が多いと考えられます。
3. CI にチェックを追加します
GitHub Actions を例に解説します。
GitHub Actions の基本
GitHub Actions では、CI のためのワークフローを、
リポジトリーのプロジェクト内の .github/workflows/ に YAML ファイルとして定義します。
ワークフロー定義の例
例えば、.github/workflows/ に check_setup.yml を作成し、次のようなワークフローを定義します:
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
check_setup:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- run: python -m pip install pipenv
- run: python -m pipenv sync --dev
- run: python -m pipenv run pipenv-setup check --strict
参考: スクリプトを使ってランナーでコードをテストする - GitHub Docs
長いコマンドを毎回入力するのが面倒な場合
本格的に開発のショートカット集を作る場合、Invoke などを使うのが良いのですが、
「ひとまず、さっと定義してしまいたい」ような場合、Pipfile にショートカットを定義できます。
例えば、次の定義を行います:
[scripts]
sync_setup = "pipenv-setup sync --pipfile"
check_setup = "pipenv-setup check --strict"
こうすると、コマンドが幾分短くなります:
pipenv run sync_setup
pipenv run check_setup