web-dev-qa-db-ja.com

Python setuptools:install_requiresの下にプライベートリポジトリをリストするにはどうすればよいですか?

プライベートGitHubリポジトリに依存するプロジェクトのsetup.pyファイルを作成しています。ファイルの関連部分は次のようになります。

from setuptools import setup
setup(name='my_project',
    ...,
    install_requires=[
        'public_package',
        'other_public_package',
        'private_repo_1',
        'private_repo_2',
    ],
    dependency_links=[
        'https://github.com/my_account/private_repo_1/master/tarball/',
        'https://github.com/my_account/private_repo_2/master/tarball/',
    ],
    ...,
)

setuptoolsの代わりにdistutilsを使用しているのは、後者が this 回答ごとにinstall_requiresおよびdependency_links引数をサポートしていないためです。

上記のセットアップファイルは、404エラーでプライベートリポジトリへのアクセスに失敗します。これは、GitHubがプライベートリポジトリへの不正なリクエストに404を返すため、予想されます。ただし、setuptools認証を行う方法がわかりません。

ここに私が試したものがいくつかあります:

  1. pipでリポジトリをインストールする場合と同様に、git+ssh://https://の代わりにdependency_linksを使用します。 distribute documentation がそうすべきだと言っているにもかかわらず、setuptoolsがこのプロトコル(「不明なURLタイプ:git + ssh」)を認識しないため、これは失敗します。同じgit+httpsおよびgit+http

  2. https://<username>:<password>@github.com/...-それでも404を取得します(このメソッドは、コマンドラインからのcurlまたはwgetでは動作しません-curl -u <username> <repo_url> -O <output_file_name>は動作します)。

  3. Setuptools(0.9.7)およびvirtualenv(1.10)を最新バージョンにアップグレードします。また、distributeのインストールを試みました この概要 は、setuptoolsにマージされたと言います。どちらにしても、サイコロはありません。

現在、プライベートリポジトリを個別にダウンロードする必要があるという警告をsetup.py印刷するだけです。これは明らかに理想的とは言えません。行方不明になっていることは明らかですが、それが何であるかは考えられません。 :)

回答のない重複した質問 here

62
Eric P

私はこれをpipでインストールするために機能させようとしましたが、上記はうまくいきませんでした。 [1]からPEP508標準を使用する必要があることを理解し、[2]から(少なくとも私の場合は)実際に機能する例を取得しました。

ご注意ください;これは、pip 18.1上のPython3.6

setup(
    name='<package>',
...
    install_requires=[
        '<normal_dependency>',
        '<dependency_name> @ git+ssh://[email protected]/<user>/<repo_name>@<branch>',
    ],
)

この方法でパッケージを指定した後、インストールは正常に機能します(-e設定でも--process-dependency-linksを指定する必要はありません)。

参考文献[1] https://github.com/pypa/pip/issues/4187 [2] https://github.com/pypa/pip/issues/5566

31
Tom Hemmes

ここに私のために働いたものがあります:

  install_requires=[
      'private_package_name==1.1',
  ],
  dependency_links=[
      'git+ssh://[email protected]/username/private_repo.git#Egg=private_package_name-1.1',
  ]

Egg名にバージョン番号を含める必要があることに注意してください。そうしないと、パッケージが見つからないと表示されます。

40
vadimg

私はこれに関する良いドキュメントを見つけることができませんでしたが、主に試行錯誤を通してソリューションに出会いました。さらに、pipとsetuptoolsからのインストールには微妙な違いがあります。しかし、この方法は両方で機能するはずです。

GitHubは(現在、2016年8月現在)プライベートリポジトリのZip/tarballを簡単に取得する方法を提供していません。したがって、setuptoolsを指定して、gitリポジトリを指していることをsetuptoolsに伝える必要があります。

from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#Egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ] 

ここにいくつかの注意事項があります:

  • プライベートリポジトリの場合、GitHubで認証する必要があります。私が見つけた最も簡単な方法は、oauthトークンを作成し、それを環境にドロップし、それをURLに含めることです。
  • PyPIにパッケージがない場合でも、リンクの最後にsomeバージョン番号(ここでは0)を含める必要があります。これは、Wordではなく実際の数字でなければなりません。
  • Zip/tarballを指すのではなく、リポジトリのクローンを作成することをsetuptoolsに伝えるには、git+を先頭に付ける必要があります
  • versionは、ブランチ、タグ、またはコミットハッシュにすることができます
  • Pipからインストールする場合は、--process-dependency-linksを指定する必要があります
10
Maximilian

私は(ハックな)回避策を見つけました:

#!/usr/bin/env python

from setuptools import setup
import os

os.system('pip install git+https://github-private.corp.com/user/repo.git@master')

setup( name='original-name'
     , ...
     , install_requires=['repo'] )

セットアップスクリプトでシステムコールを使用することには倫理的な問題があることは理解していますが、これを行う別の方法は考えられません。

4
cjohnson318

パブリックリポジトリの場合、githubのアーカイブURLを使用するとうまくいきます。例えば。

dependency_links = [
  'https://github.com/username/reponame/archive/master.Zip#Egg=eggname-version',
]
1
Overclocked

編集:これは、パブリックgithubリポジトリでのみ機能するようです。コメントを参照してください。

dependency_links=[
    'https://github.com/my_account/private_repo_1/tarball/master#Egg=private_repo_1',
    'https://github.com/my_account/private_repo_2/tarball/master#Egg=private_repo_2',
],

上記の構文は、setuptools 1.0で動作するようです。現時点では、少なくとも「#Egg = project_name-version」をVCSの依存関係に追加する構文は、 distribute documentation に指定したリンクに記載されています。

0
wor

トム・ヘムズの回答を介して、これが私にとって唯一働いたものであることがわかりました:

    install_requires=[
        '<package> @ https://github.com/<username>/<package>/archive/<branch_name>.Zip']
0
PidgeyBE