はじめに
Github上で開発をしている際に開発しているmoduleとは別のRepositoryのmoduleを利用したい場合があります.
そのようなときにsubmodule
を利用します.一方で,単純にsubmoduleを加えるだけだとpip install
をした際にsubmoduleが追加されないという問題が発生します.その対処法について簡単に説明します.
問題設定
Sphere関数という関数を作成し,それをsubmoduleとして利用したいケースを想定します.
例としてsubmodule_practice_parentというrepositoryを用意しました.
submodule_practice_parent/
├ submodule_practice_parent/
│ └ __init__.py
│ └ func.py <=== これを使いたい
├ requirements.txt
└ setup.py
submodule_practice_parent.func.sphere
という関数が実際に利用したい関数です.
次にsubmodule_practice_childというrepositoryを用意します.この run.py
の中から submodule_practice_parent.func.sphere
を呼び出せるようにします.
submodule_practice_child/
├ submodule_practice_parent/ <== submodule
├ submodule_practice_child/
│ └ __init__.py
│ └ run.py
├ .gitmodules
├ requirements.txt
└ setup.py
submodule_practice_parent
は以下のコマンドによってsubmodule_practice_child
のsubmoduleになっていると仮定します.
git submodule add https://github.com/nabenabe0928/submodule_practice_parent submodule_practice_parent
対処法
解決の手順を順番に書いていきます.
-
submodule_practice_parent
の中にsetup.py
がなければ作る -
submodule_practice_child
のsetup()
の引数であるinstall_requires
にsubmoduleを指定する
コード例は以下の通り.
import setuptools
requirements = []
with open("requirements.txt", "r") as f:
for line in f:
requirements.append(line.strip())
requirements.append(
"submodule_practice_parent "
"@ git+ssh://git@"
"github.com/nabenabe0928/submodule_practice_parent"
# "@v0.0.1#egg=submodule_practice_parent" <== versionがあるなら指定する
"#egg=submodule_practice_parent"
)
setuptools.setup(
name="submodule_practice_child",
version="0.0.1",
author="nabenabe0928",
author_email="user@gmail.com",
url="https://github.com/nabenabe0928/submodule_practice_child",
packages=setuptools.find_packages(),
python_requires='>=3.8',
platforms=['Linux'],
install_requires=requirements,
include_package_data=True
)
テスト
実際にうまくいくかどうか試してみます.
今回はmoduleがpublicになっていないので,Localにcloneしてからうまくいくか試します.
# テスト用の新しい環境を作成
$ conda create -n package_checker python=3.8
# pipのパスを確認 (今回は `package_checker` のpipか確認)
$ which pip
/home/user/anaconda3/envs/package_checker/bin/pip
$ git clone https://github.com/nabenabe0928/submodule_practice_child
$ cd submodule_practice_child/
# submodule_practice_child を install
$ pip install .
# 念の為,別のディレクトリに移動
$ cd <適当なディレクトリ>
$ python
>>> from submodule_practice_child.run import start
>>> start()
55
module not found
なしにうまく実行されました.
submoduleのVersion変更
$ cd submodule_practice_parent
$ git checkout <target branch> && git pull
$ cd ~/submodule_practice_child
$ git add submodule_practice_parent
$ git commit -m "[version] Update the submodule_practice_parent to the latest"