pip コマンドのヴァージョン 18.1 から setup.py に記述する setuptools.setup 関数の install_requires 引数に、依存パッケージの URL を直接記述できるようになったようです。
18.0 以前も PyPl 以外の場所から依存パッケージを取得する場合 requirements.txt には URL を記述できましたが、setup.py で同じようなことをすると、色々と面倒でした。
install_requires 引数の要素には、通常 PyPl のパッケージ名(+ヴァージョン指定)を書きますが、今回の変更で、 install_requires の要素に以下の記述ができるようになりました:
(パッケージ名) @ (URL)
下記の例は gitlab.com に置いた osoken/private-package というリポジトリにある private-package というパッケージに依存したパッケージの setup.py の一部です:
# -*- coding: utf-8 -*-
from setuptools import setup
setup(
... (中略) ...
install_requires=[
'private-package @ git+ssh://git@gitlab.com/osoken/private-package.git'
]
)
URL には、この例のような VCS のリモートリポジトリの URL や、下記のようなアーカイブの URL が書けます:
pip @ https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686
この変更は PEP 508 に従ったもののようで、記述できるものの文法もここに載っています。
PyPl 外のパッケージが混ざっていたとしても、大体の場合は requirements.txt に書いて pip install -r requirements.txt したり、特定のパッケージだけ手動で依存関係を解消したりすれば問題にはなりませんが、今回の変更で setup.py だけで統一的に依存関係が解消できるようになりました。ただ、上記の記述が混じった setup.py は pip 18.0 以前のヴァージョンではエラーになってしまうので、使える状況を選ぶ状態ではあると思います。
参考文献
- Un-deprecate
--process-dependency-linksuntil an alternative is implemented · Issue #4187 · pypa/pip - setup.pyのdependency_linksの書き方 - 今川館
- PEP 508 -- Dependency specification for Python Software Packages | Python.org
以下、付録:
18.0 以前の場合
pip 18.0 以前では install_requires 引数に書いたパッケージ名に対応する URL を dependency_links 引数に書く必要がありました。この書き方にもいくつか細かいルールがあり、更にこの setup.py を使う際にも pip install コマンドに --process-dependency-links というオプションを渡さないとうまく動かない (しかも DEPRECATION の警告が出る) という状態でした。
# -*- coding: utf-8 -*-
from setuptools import setup
setup(
... (中略) ...
install_requires=[
'private-package'
],
dependency_links=[
'git+ssh://git@gitlab.com/osoken/' +
'private-package.git#egg=private_package-1.0.0'
]
)