pipとpipenvとpoetryの技術的・歴史的背景とその展望という記事を読みました。Pythonのビルドシステムに微妙さを感じている自分には
単一のtomlファイルをrequirements.txtやそれらを参照するsetup.pyの代替とする事が出来るようになっている
という一文に心がぴょんぴょんしました。
偶然にも(本当に偶然だぞ!)新しくPythonのプロジェクトを作る機会があったので、試しにpyproject.toml
を使ってみました。
そしたら、初手で詰みました。バージョンの指定がつらかったからです。
よくあるsetup.py
でのバージョン読み込み
Pythonパッケージでは、よく、パッケージ名.__version__
で、パッケージのバージョンを取得できるようになっています。
これは自動でそうなるのではなく、人手でそのように書かれていて、そういう風に書くという作法になっています。
そして、バージョンをsetup.py
にも書かなければならないのですが、パッケージ名.__version__
との二重管理を防ぐために、
__version__ = "0.4.2"
with open("パッケージ名/_version.py", "r", encoding="utf-8") as f:
exec(f.read())
のようにsetup.py
に黒魔術を仕込んでいることが多いです。
では、setup.py
を使わない場合、これはどうすればいいでしょう。
setuptools
では、バージョンはsetup.cfg
に書くことになります。その際、attr:
という機能を使えばバージョンが読めそうなのですが、そうするとビルド時に自身をimport
することになり、ビルド環境に自身の依存関係をインストールしないといけなくなるようでした。
それは避けたいのですが、かといって、setup.cfg
と_version.py
の両方に同じことを書くのはもっと避けたいです。ということで、今回、GitHubアクションを使って機能を実現することにしました。
master
ブランチのsetup.cfg
が更新されたとき、_version.py
を更新し、pushする
というアクションを書きました。それにより、setup.cfg
さえ更新すれば_version.py
のことはGitHub Actionsにおまかせできるようになりました。どのブランチにするかなどは、プロジェクトによって違うので、適宜、プロジェクトに合わせて書き換えてください。
# This is a basic workflow to help you get started with Actions
name: "Update _version.py"
# Controls when the action will run.
on:
# Triggers the workflow on push or pull request events but only for the main branch
push:
branches: [ master ]
paths:
- "setup.cfg"
pull_request:
branches: [ master ]
paths:
- "setup.cfg"
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
# !!!!runの行の > 以降を、_version.pyのパスに書き換え!!!!
- name: Update version
run: sed -n 's/^version\s*=\s*\(.*\)/__version__ = "\1"/p' setup.cfg > bqbraket/_version.py
- name: Commit version file
uses: EndBug/add-and-commit@v7.1.0
with:
author_name: "コミットに使う名前"
author_email: "コミットに使うメールアドレス"
message: "コミットメッセージ"
add: "上で指定した_version.pyのパス"
ライセンス
本YAMLファイルはBlueqatプロジェクトがこちらでオープンソースとして公開しており、ライセンスも同パッケージに準じて、Apache-2ライセンスとします。