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ライセンスとします。