依存関係としてGitリポジトリを含めるようにsetup.pyを作成する方法


99

setup.pyパッケージ用に書き込もうとしています。私のパッケージは、別のGitリポジトリへの依存関係を指定する必要があります。

これは私がこれまでに持っているものです:

from setuptools import setup, find_packages

setup(
    name='abc',
    packages=find_packages(),
    url='https://github.abc.com/abc/myabc',
    description='This is a description for abc',
    long_description=open('README.md').read(),
    install_requires=[
        "requests==2.7.0",
        "SomePrivateLib>=0.1.0",
        ],
    dependency_links = [
     "git+git://github.abc.com/abc/SomePrivateLib.git#egg=SomePrivateLib",
    ],
    include_package_data=True,
)

私が走るとき:

pip install -e https://github.abc.com/abc/myabc.git#egg=analyse

私は得る

要件SomePrivateLib> = 0.1.0(分析から)を満たすバージョンが見つかりませんでした(バージョンから:) SomePrivateLib> = 0.1.0(分析から)に一致するディストリビューションが見つかりません

私は何が間違っているのですか?


setup.pyとpipは完全に異なるシステムであることに注意してください。私が抱えていた問題の1つは、これをpipで機能させることはできたが、setup.pyでは機能させなかったことです。
bcattle

回答:


51

あなたはここでそれを行う正しい方法を見つけることができます。

dependency_links=['http://github.com/user/repo/tarball/master#egg=package-1.0']

重要なのは、Gitリポジトリへのリンクではなく、tarballへのリンクを提供することです。/tarball/master上記のように追加すると、GitHubはマスターブランチのtarballを作成します。


17
この方法のように見えるがあたりに廃止されましたgithub.com/pypa/pip/issues/3939
ミュオン

3
この方法は、認証する方法がないため、プライベートリポジトリにも役立ちません。
tedivm

3
私はなんとかそれを機能させることができ、別の答えを追加しました。
tedivm

1
/tarball/masterこの方法は、gitlabのために動作しません
マーティン・トーマ

5
非推奨。正解は、以下の@Dickフォックスによって答え、Pep508を使用することです
SwimBikeRun

116

上記のコメントで@muonによってリンクされたpipの問題3939を掘り下げてから、PEP-508仕様を調べた後、setup.pyこの仕様パターンを使用してプライベートリポジトリの依存関係をインストールすることに成功しましたinstall_requires(これ以上dependency_links):

install_requires = [
  'some-pkg @ git+ssh://git@github.com/someorgname/pkg-repo-name@v1.1#egg=some-pkg',
]

@v1.1githubの上で作成したリリースタグを示し、ブランチ、コミット、またはタグの異なるタイプに置き換えることができます。


注:これはローカル/プライベートパッケージでは正常に機能しますが、setup.pyでこの構文を使用するパッケージをPyPIにリリースすることはできません
Brian

7
@ブライアン公式声明へのリンクを教えてください。

12
git+https://github.comSSHを使用したくない場合は実行できることに注意してください。
multithr3at3d

2
では、-upgradeを実行するための正しいアプローチは何ですか?タグバージョンを指定しても、アップグレードでは新しいタグバージョンが無視されます
Piacenti 2020

1
@Elephantあまり公式ではありませんが、これらは少なくともPyPAの実際のメンバーからのpip GitHubプロジェクトに関するコメントです:github.com/pypa/pip/issues/4187#issuecomment-415667805および詳細な説明:github.com/pypa/pip / issues / 4187#issuecomment-415067034
DominickPastore20年

21

次の回答はPip19 +では非推奨です


残念ながら、もう1つの答えは、このための最も一般的なユースケースの1つであるプライベートリポジトリでは機能しません。私は最終的にsetup.py次のようなファイルで動作するようになりました:

from setuptools import setup, find_packages

setup(
    name = 'MyProject',
    version = '0.1.0',
    url = '',
    description = '',
    packages = find_packages(),
    install_requires = [
        # Github Private Repository - needs entry in `dependency_links`
        'ExampleRepo'
    ],

    dependency_links=[
        # Make sure to include the `#egg` portion so the `install_requires` recognizes the package
        'git+ssh://git@github.com/example_organization/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]
)

新しいバージョンのpipは、「dependency_links」を使用する必要をなくすことで、これをさらに簡単にします-

from setuptools import setup, find_packages

setup(
    name = 'MyProject',
    version = '0.1.0',
    url = '',
    description = '',
    packages = find_packages(),
    install_requires = [
        # Github Private Repository
        'ExampleRepo @ git+ssh://git@github.com/example_organization/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]
)

1
-0.1あなたのアプローチの意味を詳しく説明していただけますか?バージョン番号はgitリリースまたはsetup.py説明から取得しますか?
Peteris

2
setup.pyファイルから-特定のブランチまたはタグを使用する場合は、フォーマットが少し異なります。
tedivm

「残念ながら、他の回答はプライベートリポジトリでは機能しません」これはもはや真実ではありませんFoxの回答は必要なしにプライベートリポジトリで機能しますdependency_links非推奨
Keto 2010

ありがとう@Keto!編集が拒否された理由はわかりませんが、modですが、先に進み、その拒否を無効にして、回答に非推奨通知を追加しました。
tedivm

3

より一般的な答え:requirements.txtファイルから情報を取得するには:

from setuptools import setup, find_packages
from os import path

loc = path.abspath(path.dirname(__file__))

with open(loc + '/requirements.txt') as f:
    requirements = f.read().splitlines()

required = []
dependency_links = []

# Do not add to required lines pointing to Git repositories
EGG_MARK = '#egg='
for line in requirements:
    if line.startswith('-e git:') or line.startswith('-e git+') or \
            line.startswith('git:') or line.startswith('git+'):
        if EGG_MARK in line:
            package_name = line[line.find(EGG_MARK) + len(EGG_MARK):]
            required.append(package_name)
            dependency_links.append(line)
        else:
            print('Dependency to a git repository should have the format:')
            print('git+ssh://git@github.com/xxxxx/xxxxxx#egg=package_name')
    else:
        required.append(line)

setup(
    name='myproject',  # Required
    version='0.0.1',  # Required
    description='Description here....',  # Required
    packages=find_packages(),  # Required
    install_requires=required,
    dependency_links=dependency_links,
)

1

実際、パッケージを再帰的にインストール可能にしたい場合(YourCurrentPackageにはSomePrivateLibが含まれています)、たとえばYourCurrentPackageを別のパッケージに含めたい場合(OuterPackage→YourCurrentPackage→SomePrivateLibなど)、次の両方が必要になります。

install_requires=[
    ...,
    "SomePrivateLib @ git+ssh://github.abc.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
],
dependency_links = [
    "git+ssh://github.abc.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
]

また、バージョン番号でタグが作成されていることを確認してください。

また、Gitプロジェクトがプライベートで、DockerGitLabランナーなどのコンテナー内にインストールする場合は、リポジトリへの承認されたアクセスが必要になります。アクセストークンでGit + HTTPSを使用することを検討してください(GitLab:https://docs.gitlab.com/ee/user/profile/personal_access_tokens.htmlなど):

import os
from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    ....

    install_requires=[
            ...,
            f"SomePrivateLib @ git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ],
    dependency_links = [
            f"git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

0

私はGitLabでこれらの3つのオプションで成功しました。GitLabのバージョン11を使用しています。

オプション1-トークンが指定されていません。シェルはユーザー名/パスワードの入力を求めます。

from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        "SomePrivateLib @ git+https://gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

オプション2-ユーザーアクセストークンが指定されました。GitLab→アカウント右上→設定→アクセストークンに移動して生成されたトークン。read_repository権限でトークンを作成します。

例:

import os
from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        f"SomePrivateLib @ git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

オプション3-リポジトリレベルのトークンが指定されています。リポジトリ→設定→リポジトリ→デプロイトークンに移動して生成されたトークン。ここから、read_repository権限を持つトークンを作成します。

例:

import os
from setuptools import setup

TOKEN_USER = os.getenv('EXPORTED_TOKEN_USER')
TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        f"SomePrivateLib @ git+https://{TOKEN_USER}:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

3つすべてで、「SomePrivateLib @ git + https://gitlab.server.com/abc/SomePrivateLib.git」を最後に#eggマークなしで簡単に実行できました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.