自分で作成したPythonパッケージをGitLab上のプロジェクトで管理していて,これを別のプロジェクトで使用する方法を紹介します.
環境
- MacOS 10.14.6
- Python 3.8
- GitLab
前提条件
- trieという名前のプロジェクトが,private repositoryとしてGitLabに存在する.
- 別のプロジェクトでtrieをpipでインストールできるようにしたい.
なお,trieはトライ木に関する架空のプロジェクトです.
trieをPythonパッケージにする
Pythonパッケージを作成するには,Setuptoolsを使用するのが便利です.
ディレクトリ構成は以下のようにします.
- trie/
- trie.py (メインとなる部分)
- tests/
- test_trie.py (trie.pyのunittest)
- setup.cfg
- setup.py
Setuptoolsのためのファイルを作成します.
setup.cfg
[metadata] name = trie version = 1.0.0 url = https://gitlab.com/[user]/trie.git author = [user] author_email = [user address] license = UNLICENSED description = MyTrie [options] packages = trie
setup.cfgの詳細については,Building and Distributing Packages with Setuptools — setuptools 45.2.0 documentationを参照してください.
packagesに指定したディレクトリのみがpipで使用されます.testsフォルダは別のプロジェクトには不要なので,trieディレクトリのみ指定しています.
setup.py
from setuptools import setup setup()
これで自動的にsetup.cfgが読み込まれます.
より一般的なディレクトリ構成については,requestsなど有名なプロジェクトを参考にするのがよいと思います.
GitLabにpushする
上記の如くPythonパッケージを仕上げたら,GitLabにpushし,masterブランチにmergeします.
pipでインストールする
pipはrequirements.txtに記載したパッケージをインストールしてくれます.通常ぱパッケージ名とバージョンを記載しますが,gitのurlを直接指定することも可能です.例えば以下のようにrequirements.txtファイルを作成します.
requirements.txt
requests==2.22.0 git+ssh://git@gitlab.com/[user]/trie.git
あとは,下記のコマンドでpipを使用します.
sudo pip3 install -r requirements.txt
これで,公開されているrequestsパッケージと非公開のtrieパッケージがインストールされます.もし,すでにインストールしているパッケージをアップデートしたい場合は, --upgrade オプションを付けます.
sudo pip3 install -r requirements.txt --upgrade
もし,gitのurlが間違っていると,下記のようなエラーが出ます.
ssh: Could not resolve hostname gitlab.com:[user]: nodename nor servname provided, or not known fatal: Could not read from remote repository.
GitLabからurlをコピーすると,gitlab.comの直後の"/"が":"になっているので注意が必要です.
trieを試してみる
from trie.trie import Trie print(Trie()) from requests import Session print(Session())
<trie.trie.Trie object at 0x10b52d810> <requests.sessions.Session object at 0x102b97650>
公開されているrequestsパッケージと非公開のtrieパッケージが正常にインポートできました.
site-packagesを確認する
pipを利用してインストールしたファイルは,pythonのsite-packagesディレクトリに保存されます.MacOSならば,
/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages
などとなります.
なお,上記のtrieパッケージをインストールすると,パッケージルート直下のtrie/が上記ディレクトリに保存されますので,当たり前ですが,パッケージを使用する際に必要なファイルはtrie/に保存するべきで,setup.pyなどと同じレベルに保存するのは意味がありません.
GitLab CIで使用する
開発環境ではssh keyが設定されているおかげで,自分のprivate repositoryにpipが自動でログインしてくれるため,追加の認証でパッケージをダウンロードすることができます.しかしながら,GitLab CIにはssh keyが事前に設定されているわけではないので,工夫が必要です.
GitLab CI artifactを利用する
Personal access tokens | GitLabを参考に設定しますが,ユーザー毎にpersonal access tokenというキーを発行することができ,これを利用することによって,privateなプロジェクトのartifactを別のプロジェクトで利用することができます.これはGitLab Job APIを利用するので,これに対する権限を有効にしておく必要があります.
また,projectのidとして,url encodedな文字列を指定する必要があることに注意します.詳細はAPI Docs | GitLabに記載されています./
は%2F
に置き換える必要があるので,注意が必要です.