How to include a public library in a dependency on GitHub, although it is not registered in PyPI.
In addition, we will summarize as a memorandum how to deal with the case where requirements.txt
is referenced from setup.py
.
requirements.txt If the URL of the GitHub repository is https://github.com/rgmining/common requirements.txt contains
requirements.txt
-e git+https://github.com/rgmining/common.git#egg=rgmining_common-0.9.0
Write like this. After # egg =
, it seems to be in the format pip-tools
to generate requirements.txt
Enter the same character string as above in requirements.in
.
setup.py
Until now, setup.py
passed the contents of requirements.txt
to ʻinstall_requires` as shown below.
setup.py
from setuptools import setup, find_packages
def load_requires_from_file(filepath):
with open(filepath) as fp:
return [pkg_name.strip() for pkg_name in fp.readlines()]
setup(
#Other items omitted
install_requires=load_requires_from_file("requirements.txt")
)
If the URL is included in requirements.txt
, improve it a little and list only the package name.
setup.py
def take_package_name(name):
if name.startswith("-e"):
return name[name.find("=")+1:name.rfind("-")]
else:
return name.strip()
def load_requires_from_file(filepath):
with open(filepath) as fp:
return [take_package_name(pkg_name) for pkg_name in fp.readlines()]
Also, pass the URL part to the keyword argument dependency_link
of the setup
function.
setup.py
def load_links_from_file(filepath):
res = []
with open(filepath) as fp:
for pkg_name in fp.readlines():
if pkg_name.startswith("-e"):
res.append(pkg_name.split(" ")[1])
return res
setup(
#Other items omitted
install_requires=load_requires_from_file("requirements.txt"),
dependency_links=load_links_from_file("requirements.txt"),
)
With the above, if you do python setup.py test
etc., you can prepare a package from GitHub and execute the test.