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 develop
とsome-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
する適切な方法は何ですか?
プライベートである可能性のあるGit依存関係を持つパッケージをpipインストールする適切な方法は何ですか?
2つのオプション
dependency_links
を使用します。詳細については、以下を参照してください。
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-link
にpip 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つのオプションがあります。
必要な各パッケージのリポジトリに共同作業者を追加します。これらの共同編集者は、これを機能させるためにgithubでsshキーを設定する必要があります。次に、git+ssh://...
を使用します
各リポジトリにデプロイキーを追加します。ここでの欠点は、展開する必要のあるすべてのマシンに対応する秘密鍵を配布する必要があることです。もう一度git+ssh://...
を使用します
プライベートリポジトリを保持するgithubアカウントにパーソナルアクセストークンを追加します。次に、git+https://[email protected]/...
を使用できます。欠点は、アクセストークンが、それぞれのgithubアカウントのパブリックおよびプライベートのすべてのリポジトリへの読み取り+書き込みアクセス権を持つことです。プラス面として、リポジトリごとの秘密鍵を配布および管理する必要がなくなり、鍵の循環がはるかに簡単になります。すべての開発者がすべてのリポジトリにアクセスできるすべての社内環境では、これがすべての人にとって最も効率的で手間のかからない方法であることがわかりました。 YMMV
これは、プライベートリポジトリでも機能するはずです。
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'
],
「 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
"は依存関係の名前とバージョンです。
次のように、#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の基本-タグ付け
"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
が役立つ場合があります。