自作Pythonパッケージの管理を考える

Python

便利なコードたちをまとめたい

個人開発等で何らかのPythonプロジェクトを進めていると、Pythonに対する理解が進んでくるとともにプロジェクト内のファイル構造を見直したくなる時がくると思います。

最初は使い捨てコード的な感覚で作った関数たちをモジュールとしてまとめようという考えが芽生え、さらに他のプロジェクトでも使い回しができる便利コードなのではないかと思い始めるとパッケージとしてまとめて管理したくなってきます。

このような「使い回しができる」仕組みってどうするんだと考えましたので、使い方として便利で効率が良さそうな方法がないか調べてみました。

pipでインストールできる仕組み

Pythonで誰かが作ってくれた便利なライブラリを使いたいときはだいたいpipコマンドでインストールして使うと思います。pipでインストールするとプロジェクトの中にはコードの実態がないのに、どこからでもimportして使えるようになります。

単に関数やクラスをモジュールやパッケージとして書いたコードをプロジェクト内のディレクトリにおいて、それをimportすることが手軽ですが、もし自作が書いたコードをpipでインストールして使えたらと考えると使いまわしがしやすそうです。

調べてみるとpipでインストールできるパッケージを自作する方法がありました。

Pythonで自分だけのクソライブラリを作る方法

パッケージごとにGit管理したい

pipでインストールできることはわかりましたが、そのコードの実態をどうやって管理したらいいのか疑問に思いました。そこで方針を色々と考えてみました。

プロジェクトのGitリポジトリに含める

パッケージとして作ったコードをプロジェクト内のディレクトリにおいて、それをプロジェクトのGitリポジトリの一部として管理することを考えてみました。

この方法はpip管理下に置かずにディレクトリをそのままimportして使うこともできます。

しかし、これだとプロジェクトとパッケージがガッチリ結びついてしまって「使いまわし」という点では意味がなさそうです。

パッケージとして独立したGitリポジトリを作る

パッケージとして作ったディレクトリをGitリポジトリとして管理する方法です。プロジェクトのGitリポジトリの中にパッケージのGitリポジトリが存在する状態です。

ディレクトリからpipでインストールする場合

この方法だとプロジェクトとパッケージを分離できたように思えます。しかし、実際に使う場面を考えてみると、パッケージをgit cloneして、pipで管理する場合はさらにinstallする手順があります。手順が増えて管理が煩雑になってしまいそうです。

ディレクトリを直接参照する場合

また、pipを使わずに単にディレクトリからimportする方法も考えられます。この場合はGitのサブモジュールという機能が使えそうです。Gitリポジトリの中にさらにGitリポジトリをもつイメージでしょうか。

Git - サブモジュール

Git Hubからpipでインストールする場合

調べていると以下のブログを見つけまして参考になりました。

パッケージのリポジトリをGitHubに作成し、install時の参照先をGitHubのリポジトリにしておけばpipで管理できるようです。

さらに、世に公開したくないパッケージの場合はプライベートにして使うこともできるようです。

この方法がスマートな自作パッケージ管理方法に思えます。

しかし開発環境はおろか、本番環境でのデプロイ時にGitHubの認証周りがどうなるか実際に動かしてみないとわからないので、まずは試してみたいと思います。

追記 : 2022/04/19

Githubのプライベートリポジトリからのインストールを試してみたところ、以下の書式だとCalledProcessErrorとなってしまい、インストールできなかった。

poetry add git+https://github.com/hogehoge
(or)
poetry add git+https://github.com/hogehoge.git

インストールに成功する書式は以下のもの。末尾にリビジョンを追加したもの。

poetry add git+https://github.com/hogehoge#main
(or)
poetry add git+https://github.com/hogehoge.git#main

poetryの設定時に以下のように説明が表示されるため、#mainを記載しない書式もインストールできそうなものだが、なぜか動かない。(調査中)

You can specify a package in the following forms:
  - A single name (requests)
  - A name and a constraint (requests@^2.23.0)
  - A git url (git+https://github.com/python-poetry/poetry.git)
  - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop)
  - A file path (../my-package/my-package.whl)
  - A directory (../my-package/)
  - A url (https://example.com/packages/my-package-0.1.0.tar.gz)

コメント

タイトルとURLをコピーしました