LoginSignup
7
7

More than 5 years have passed since last update.

pip 18.1 から setup.py の install_requires に URL が書けるようになった

Posted at

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 の一部です:

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.pypip 18.0 以前のヴァージョンではエラーになってしまうので、使える状況を選ぶ状態ではあると思います。

参考文献


以下、付録:

18.0 以前の場合

pip 18.0 以前では install_requires 引数に書いたパッケージ名に対応する URL を dependency_links 引数に書く必要がありました。この書き方にもいくつか細かいルールがあり、更にこの setup.py を使う際にも pip install コマンドに --process-dependency-links というオプションを渡さないとうまく動かない (しかも DEPRECATION の警告が出る) という状態でした。

setup.py
# -*- 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'
    ]
)
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7