web-dev-qa-db-ja.com

Gitの依存関係があるパッケージを「pipinstall」する方法は?

some-library(実際の名前が変更されました)というプライベートライブラリがあり、セットアップファイルは次のようになっています。

setup(
    name='some-library',

    // Omitted some less important stuff here...

    install_requires=[
        'some-git-dependency',
        'another-git-dependency',
    ],
    dependency_links=[
        'git+ssh://[email protected]/my-organization/some-git-dependency.git#Egg=some-git-dependency',
        'git+ssh://[email protected]/my-organization/another-git-dependency.git#Egg=another-git-dependency',
    ],
)

これらのGit依存関係はすべてプライベートである可能性があるため、 HTTP経由のインストール はオプションではありません。 python setup.py installのルートディレクトリでpython setup.py developsome-libraryを問題なく使用できます。

ただし、Gitを介したインストールは機能しません。

pip install -vvv -e 'git+ssh://[email protected]/my-organization/[email protected]#Egg=some-library'

コマンドはsome-git-dependencyを検索すると失敗し、PyPIから依存関係を取得する必要があると誤って想定し、PyPIに依存していないと結論付けた後に失敗します。私の最初の推測は、--process-dependency-linksを使用してコマンドを再実行することでしたが、その後、次のことが起こりました。

   Cannot look at git URL git+ssh://[email protected]/my-organization/some-git-dependency.git#Egg=some-git-dependency
   Could not find a version that satisfies the requirement some-git-dependency (from some-library) (from versions: )

なぜこの漠然としたエラーが発生するのですか?プライベートである可能性のあるGit依存関係を持つパッケージをpip installする適切な方法は何ですか?

20
Pieter

プライベートである可能性のあるGit依存関係を持つパッケージをpipインストールする適切な方法は何ですか?

2つのオプション

  1. dependency_linksを使用します。詳細については、以下を参照してください。

  2. Setup.pyのdependency_linksと一緒に、必要なすべてのパッケージを収集する特別なdependency-links.txtを使用します。次に、このパッケージをrequirements.txtに追加します。以下で説明するように、これが私の推奨オプションです。

    # dependency-links.txt
    git+ssh://...@tag#Egg=package-name1
    git+ssh://...@tag#Egg=package-name2
    # requirements.txt (per deployed application)
    -r dependency-links.txt
    

オプション2は、パッケージ管理に余分な負担を追加します。つまり、dependency-links.txtを最新の状態に保ちますが、--process-dependency-linkpip installオプションを追加するのを忘れることができるため、パッケージのインストールがはるかに簡単になります。

おそらくもっと重要なのは、dependency-links.txtを使用して、デプロイメントにインストールする正確なバージョンを指定できることです。これは、CI/CD環境で必要なものです。インストールすることほどリスクはありませんsomeバージョン。ただし、パッケージメンテナの観点からは、次のような最小バージョンを指定するのが一般的であり、良い習慣と考えられています。

    # setup.py in a package
    ...
       install_requires = [ 'foo>1.0', ... ]

これは、パッケージが同様の依存関係を持ちながら、おそらく異なるバージョンにある他のパッケージとうまく連携するので素晴らしいことです。ただし、デプロイされたアプリケーションでは、パッケージ間で要件が競合している場合、これは依然として混乱を引き起こす可能性があります。例えば。パッケージAはfoo>1.0で問題なく、パッケージBはfoo<=1.5を必要とし、最新バージョンはfoo==2.0です。 dependency-links.txtを使用すると、すべてのパッケージに1つのバージョンを適用して、特定することができます。

    # dependency-links.txt
    foo==1.5

Some-git-dependencyを探すと、コマンドは失敗します。

それを機能させるには、pipがgithubへの依存関係を認識するために -process-dependency-links を追加する必要があります。

pip install --process-dependency-links -r private-requirements.txt

pip 8.1. 以降、このオプションをrequirements.txtに追加できることに注意してください。欠点としては、インストールされているallパッケージに適用され、意図しない結果が生じる可能性があります。そうは言っても、dependency-links.txtを使用する方がより安全で管理しやすいソリューションだと思います。

これらのGit依存関係はすべてプライベートである可能性があります

3つのオプションがあります。

  1. 必要な各パッケージのリポジトリに共同作業者を追加します。これらの共同編集者は、これを機能させるためにgithubでsshキーを設定する必要があります。次に、git+ssh://...を使用します

  2. 各リポジトリにデプロイキーを追加します。ここでの欠点は、展開する必要のあるすべてのマシンに対応する秘密鍵を配布する必要があることです。もう一度git+ssh://...を使用します

  3. プライベートリポジトリを保持するgithubアカウントにパーソナルアクセストークンを追加します。次に、git+https://[email protected]/...を使用できます。欠点は、アクセストークンが、それぞれのgithubアカウントのパブリックおよびプライベートのすべてのリポジトリへの読み取り+書き込みアクセス権を持つことです。プラス面として、リポジトリごとの秘密鍵を配布および管理する必要がなくなり、鍵の循環がはるかに簡単になります。すべての開発者がすべてのリポジトリにアクセスできるすべての社内環境では、これがすべての人にとって最も効率的で手間のかからない方法であることがわかりました。 YMMV

6
miraculixx

これは、プライベートリポジトリでも機能するはずです。

dependency_links = [
     'git+ssh://[email protected]/my-organization/some-git-dependency.git@master#Egg=some-git-dependency',
     'git+ssh://[email protected]/my-organization/another-git-dependency.git@master#Egg=another-git-dependency'
],
3
RaviTezu

pip installdependencylinks 」を参照する場合、GitHubリポジトリ自体を参照するのではなく、そのGitHubリポジトリに関連付けられているtarballイメージを参照します。

dependency_links=[
        'git+ssh://[email protected]/my-organization/some-git-dependency/tarball/master/#Egg=some-git-dependency',
        'git+ssh://[email protected]/my-organization/another-git-dependency/tarball/master/#Egg=another-git-dependency',
    ],

some-git-dependency "は依存関係の名前とバージョンです。

1
VonC

次のように、#Eggを使用してURLを作成する場合はgit + gitを使用する必要があります。

-e [email protected]:foo/my-repo.git#Egg=my-repo

#Eggを使用せずに本番環境でgit + sshを使用しますが、@ versionまたはbranch @ masterを指定できます

git+ssh://[email protected]/foo/[email protected]

アプリのバージョンで作業するには、gitタグ付けを使用します Gitの基本-タグ付け

1

"git URL git + ssh://[email protected]/my-organization/some-git-dependency.git#Egg=some-git-dependencyを見ることができません"つまり、pipはこのURLからhtmlページをフェッチして、ページ内の直接ダウンロードリンクを探すことができません。つまり、pipはURLをvcsチェックアウトとして認識しません。これは、要件指定子とvcsURLのフラグメント部分。

VCSチェックアウトの場合、そのチェックアウトを使用するパッケージを識別するために、#Egg=project-versionも追加する必要があります。

名前またはバージョンのダッシュは、必ずアンダースコアに置き換えてエスケープしてください。

チェック PyPIにない依存関係

パッケージおよびバージョン文字列-_に置き換えます。

git+ssh://[email protected]/my-organization/some-git-dependency.git#Egg=some_git_dependency  

および--allow-all-externalが役立つ場合があります。

0
Nizam Mohamed