これらのエントリは、Pipfileに入れる必要があります。
@kennethreitz自分のケースを明確にしたとは思わないので、pipenvを使い始めたときに遭遇したいくつかのユースケースを説得してみましょう。
まず、私はpipenv、それがどのように機能するか、そしてそのコードに飛び込み始めたところです。 私は、あなたがソースを指定することができます知っているPipfile
で何ができるかに似ている、私はまた、あなたが名前のインデックスを使用することができます見て、 ~/.pypirc
。
$ mkdir foobar
$ cd foobar
$ pipenv install --verbose requests
⠋New python executable in /home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf/bin/python
Installing setuptools, pip, wheel...done.
Virtualenv location: /home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf
Installing requests…
⠙Installing u'requests'
$ "/home/xxx/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install --verbose "requests"
-i https://pypi.python.org/simple --exists-action w
Collecting requests
1 location(s) to search for versions of requests:
* https://pypi.python.org/simple/requests/
Getting page https://pypi.python.org/simple/requests/
[...]
Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22
Cleaning up...
Adding requests to Pipfile's [packages]…
PS: You have excellent taste! ✨ 🍰 ✨
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (76e6d4)!
pypiが認識しないパッケージをインストールすると、すぐには機能しません( pip.conf
設定を使用するため、pipまたはpip-toolsで機能します)。
$ pipenv install --verbose palantir
Installing palantir…
⠋Installing u'palantir'
$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install --verbose "palantir" -i https://pypi.python.org/simple --exists-action w
Collecting palantir
1 location(s) to search for versions of palantir:
[...]
Error: An error occurred while installing palantir!
Could not find a version that satisfies the requirement palantir (from versions: )
No matching distribution found for palantir
Pipfile
に新しいインデックスが設定され、パッケージがこのインデックスに関連付けられている場合(https://docs.pipenv.org/advanced.html#specifying-package-indexesに続く)、コマンドラインはとにかく最初にpypi
を呼び出します:
$ pipenv install --verbose palantir
Installing palantir…
⠋Installing u'palantir'
$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install --verbose "palantir"
-i https://pypi.python.org/simple --exists-action w
⠋$ "/home/hr/.local/share/virtualenvs/foobar-JdBU33Mf/bin/pip" install --verbose "palantir"
-i https://pypi.priv.xxx/prod/+simple/ --exists-action w
Collecting palantir
1 location(s) to search for versions of palantir:
[...]
Successfully installed palantir-1.1.5
Cleaning up...
Adding palantir to Pipfile's [packages]…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
pip-tools
によって生成された要件ファイルを使用しますpip-tools
を使用する場合、要件ファイルはパッケージのインストールに使用されるインデックスで始まります。
#
# This file is autogenerated by pip-compile
# To update, run:
#
# pip-compile --output-file requirements.txt requirements.in
#
--index-url https://pypi.priv.xxx/prod/+simple/
bcrypt==3.0.0
[...]
要件ファイルを使用する場合(クリーンなプロジェクトから開始)、この設定は尊重されません。
$ pipenv install -r requirements.txt
Requirements file provided! Importing into Pipfile…
Pipfile.lock (c23e27) out of date, updating to (3c7b08)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
CRITICAL:pip.index:Could not find a version that satisfies the requirement palantir==1.1.5 (from versions: )
Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
インデックスとUXの処理にはある種の「ギャップ」があると思います。
Pipfile
インデックスのエントリを作成し、すべてのパッケージをインデックスに関連付けることができます。 pypiからのパッケージがたくさんあり、プライベートインデックスからのパッケージが1つしかない場合、これはあまり便利ではありません。上記で明らかになった問題をカバーするPRを提供するためにコードに飛び込んでいます:
pip.conf
を確認しますPipfile
にデフォルトのインデックスを定義し、何も指定されていない場合に使用しますPipfile
追加しますインデックスが要件ファイルまたはコマンドラインで使用されているが、 Pipfile
が不明な場合は、pipenvで使用されているvenvの名前と同様の自動名でエントリを追加する必要があります。
どうしてそんなに気にするの? 中国に住んでいるので、pypiは常に利用可能または高速(多数のタイムアウトまたは完全な低速)ではないため、プライベートパッケージをキャッシュして混合できるdevpiのようなインデックスを持つことは二重の勝利です。 これにより、開発、テスト、Dockerビルドなどがはるかに高速になります。
例として、これはタイムアウトが関係するときに発生する非常に古典的な動作です。
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
Could not find a version that matches requests==2.17.3,==2.18.4
Tried: 0.2.0, 0.2.0, 0.2.1, 0.2.1, 0.2.2, 0.2.2, 0.2.3, 0.2.3, 0.2.4, 0.2.4, 0.3.0, 0.3.0, 0.3.1, 0.3.1, 0.3.2, 0.3.2, 0.3.3, 0.3.3, 0.3.4, 0.3.4, 0.4.0, 0.4.0, 0.4.1, 0.4.1, 0.5.0, 0.5.0, 0.5.1, 0.5.1, 0.6.0, 0.6.0, 0.6.1, 0.6.1, 0.6.2, 0.6.2, 0.6.3, 0.6.3, 0.6.4, 0.6.4, 0.6.5, 0.6.5, 0.6.6, 0.6.6, 0.7.0, 0.7.0, 0.7.1, 0.7.1, 0.7.2, 0.7.2, 0.7.3, 0.7.3, 0.7.4, 0.7.4, 0.7.5, 0.7.5, 0.7.6, 0.7.6, 0.8.0, 0.8.0, 0.8.1, 0.8.1, 0.8.2, 0.8.2, 0.8.3, 0.8.3, 0.8.4, 0.8.4, 0.8.5, 0.8.5, 0.8.6, 0.8.6, 0.8.7, 0.8.7, 0.8.8, 0.8.8, 0.8.9, 0.8.9, 0.9.0, 0.9.0, 0.9.1, 0.9.1, 0.9.2, 0.9.2, 0.9.3, 0.9.3, 0.10.0, 0.10.0, 0.10.1, 0.10.1, 0.10.2, 0.10.2, 0.10.3, 0.10.3, 0.10.4, 0.10.4, 0.10.6, 0.10.6, 0.10.7, 0.10.7, 0.10.8, 0.10.8, 0.11.1, 0.11.1, 0.11.2, 0.11.2, 0.12.0, 0.12.0, 0.12.1, 0.12.1, 0.13.0, 0.13.0, 0.13.1, 0.13.1, 0.13.2, 0.13.2, 0.13.3, 0.13.3, 0.13.4, 0.13.4, 0.13.5, 0.13.5, 0.13.6, 0.13.6, 0.13.7, 0.13.7, 0.13.8, 0.13.8, 0.13.9, 0.13.9, 0.14.0, 0.14.0, 0.14.1, 0.14.1, 0.14.2, 0.14.2, 1.0.0, 1.0.0, 1.0.1, 1.0.1, 1.0.2, 1.0.2, 1.0.3, 1.0.3, 1.0.4, 1.0.4, 1.1.0, 1.1.0, 1.2.0, 1.2.0, 1.2.1, 1.2.1, 1.2.2, 1.2.2, 1.2.3, 1.2.3, 2.0.0, 2.0.0, 2.0.0, 2.0.0, 2.0.1, 2.0.1, 2.0.1, 2.0.1, 2.1.0, 2.1.0, 2.1.0, 2.1.0, 2.2.0, 2.2.0, 2.2.0, 2.2.0, 2.2.1, 2.2.1, 2.2.1, 2.2.1, 2.3.0, 2.3.0, 2.3.0, 2.3.0, 2.4.0, 2.4.0, 2.4.0, 2.4.0, 2.4.1, 2.4.1, 2.4.1, 2.4.1, 2.4.2, 2.4.2, 2.4.2, 2.4.2, 2.4.3, 2.4.3, 2.4.3, 2.4.3, 2.5.0, 2.5.0, 2.5.0, 2.5.0, 2.5.1, 2.5.1, 2.5.1, 2.5.1, 2.5.2, 2.5.2, 2.5.2, 2.5.2, 2.5.3, 2.5.3, 2.5.3, 2.5.3, 2.6.0, 2.6.0, 2.6.0, 2.6.0, 2.6.1, 2.6.1, 2.6.1, 2.6.1, 2.6.2, 2.6.2, 2.6.2, 2.6.2, 2.7.0, 2.7.0, 2.7.0, 2.7.0, 2.8.0, 2.8.0, 2.8.0, 2.8.0, 2.8.1, 2.8.1, 2.8.1, 2.8.1, 2.9.0, 2.9.0, 2.9.0, 2.9.0, 2.9.1, 2.9.1, 2.9.1, 2.9.1, 2.9.2, 2.9.2, 2.9.2, 2.9.2, 2.10.0, 2.10.0, 2.10.0, 2.10.0, 2.11.0, 2.11.0, 2.11.0, 2.11.0, 2.11.1, 2.11.1, 2.11.1, 2.11.1, 2.12.0, 2.12.0, 2.12.0, 2.12.0, 2.12.1, 2.12.1, 2.12.1, 2.12.1, 2.12.2, 2.12.2, 2.12.2, 2.12.2, 2.12.3, 2.12.3, 2.12.3, 2.12.3, 2.12.4, 2.12.4, 2.12.4, 2.12.4, 2.12.5, 2.12.5, 2.12.5, 2.12.5, 2.13.0, 2.13.0, 2.13.0, 2.13.0, 2.14.0, 2.14.0, 2.14.0, 2.14.0, 2.14.1, 2.14.1, 2.14.1, 2.14.1, 2.14.2, 2.14.2, 2.14.2, 2.14.2, 2.15.1, 2.15.1, 2.15.1, 2.15.1, 2.16.0, 2.16.0, 2.16.0, 2.16.0, 2.16.1, 2.16.1, 2.16.1, 2.16.1, 2.16.2, 2.16.2, 2.16.2, 2.16.2, 2.16.3, 2.16.3, 2.16.3, 2.16.3, 2.16.4, 2.16.4, 2.16.4, 2.16.4, 2.16.5, 2.16.5, 2.16.5, 2.16.5, 2.17.0, 2.17.0, 2.17.0, 2.17.0, 2.17.1, 2.17.1, 2.17.1, 2.17.1, 2.17.2, 2.17.2, 2.17.2, 2.17.2, 2.17.3, 2.17.3, 2.17.3, 2.17.3, 2.18.0, 2.18.0, 2.18.0, 2.18.0, 2.18.1, 2.18.1, 2.18.1, 2.18.1, 2.18.2, 2.18.2, 2.18.2, 2.18.2, 2.18.3, 2.18.3, 2.18.3, 2.18.3, 2.18.4, 2.18.4, 2.18.4, 2.18.4
@kennethreitz
いいえ。 たとえば、私は中国に住んでいます。 pypi.python.orgへの速度は通常50k / s未満であり、グローバルチャイナミラーを設定する
File "d:\python27\lib\site-packages\pipenv\patched\pip\_vendor\requests\packages\urllib3\response.
py", line 324, in read
flush_decoder = True
File "d:\python27\lib\contextlib.py", line 35, in __exit__
self.gen.throw(type, value, traceback)
File "d:\python27\lib\site-packages\pipenv\patched\pip\_vendor\requests\packages\urllib3\response.
py", line 246, in _error_catcher
raise ReadTimeoutError(self._pool, None, 'Read timed out.')
pip._vendor.requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='pypi.py
thon.org', port=443): Read timed out.
つまり、pipenvを使用するたびに、pip.conf [Pipfile]を作成する必要があるということですか? それは私には受け入れられません。
これらのエントリには、プロジェクトリポジトリに入るはずのPipfileには確実に入らない資格情報が含まれている場合があります。
@eromoe @hrbonzでは、pipenvがプライベートサーバーではなく最初にpypiを解決するという問題はありますか?
私にとってはそうです。 本当にグローバルミラー設定が必要です。
pip.confは次のとおりです。
- 最初にサイト全体のファイルが読み取られ、次に
- ユーザーごとのファイルが読み取られ、最後に
- virtualenv固有のファイルが読み取られます。
pip.confを尊重するということは、pipユーザーがシームレスにpipenvに切り替えることができることを意味します。
私はそれらの構成をPipfile
に入れることができるというアイデアが好きです(他の開発者と構成を簡単に共有するため)が、pipenvは間違いなくpip.conf
も尊重する必要があります( Pipfile)。
@erinxoconこれは私が特定した問題の1つです。 私は仕事でかなり忙しいですが、来週までに最初のPRをプッシュしたいと思っています。
こんにちは、 @ kennethreitz素晴らしいプロジェクトに感謝します。
私は質問があります、あなたはその議論に議論が持ち込まれた後、その問題に関するあなたの立場を再考しますか?
pip.confの別の非常によく似たユースケースがあり、個別のpip.confファイルにクレデンシャルがあると、CI / CDパイプラインとローカル開発マシンで予測可能なビルドを行うのに有効です。
@hrbonz今のところ、pip.confファイルがpipenvでサポートされるまで、pipから$PIP_INDEX_URL
env変数だけを使用するソリューションを見つけました。 これらの$PIP_VARIABLE
は、今のところ.env
ファイルから入手できます。
pypa / pip#3728とカスタムインデックスを組み合わせることは、クレデンシャルを公開せずにプライベートインデックスのソリューションになると思います。 #1406にもコメント。
必要なのがインデックス名とURLだけである場合の1つの回避策です(たとえば、 devpi
を使用します)。 このシェル関数は、カスタムのインデックス名とURLを持ち、それ以外は元の状態のPipfileを作成するときにいつでも呼び出すことができます。
pipenv_init() {
# pipenv issue #856: pipenv doesn't respect pip.conf
# https://github.com/pypa/pipenv/issues/856
# This function accepts one optional argument: the path to the pipenv
# executable. If not set or empty, defaults to PATH lookup.
local PIPENV="${1:-pipenv}"
if ! command -v -- "${PIPENV}" > /dev/null; then
>&2 printf '%s\n' 'pipenv not found'
return 1
fi
# Check for required environment variables.
if [[ -z "${PIPENV_INDEX_NAME-}" ]] || [[ -z "${PIPENV_INDEX_URL-}" ]]; then
>&2 printf '%s\n' 'PIPENV_INDEX_{NAME,URL} env vars must be set and not empty'
return 1
fi
# Create fresh Pipfile and virtualenv.
#
# While doing so, move requirements.txt out of the way so pipenv
# doesn't attempt to populate the virtualenv before we have a chance
# to modify Pipfile.
# https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/cli.py#L308-L330
# https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/project.py#L117-L119
# https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/project.py#L231-L240
# https://github.com/pypa/pipenv/blob/v9.0.3/pipenv/utils.py#L1112-L1124
local TEMP_REQUIREMENTS_TXT
"${PIPENV}" --rm || true
rm -f -- Pipfile Pipfile.lock
if [[ -f requirements.txt ]]; then
TEMP_REQUIREMENTS_TXT="$(mktemp)"
mv -- requirements.txt "${TEMP_REQUIREMENTS_TXT}"
fi
"${PIPENV}" install
if [[ -n "${TEMP_REQUIREMENTS_TXT}" ]]; then
mv -- "${TEMP_REQUIREMENTS_TXT}" requirements.txt
fi
rm -- Pipfile.lock
# Within Pipfile's `[[source]]` section, set `name` to
# `${PIPENV_INDEX_NAME}` and `url` to `${PIPENV_INDEX_URL}`.
local TEMP_PIPFILE="$(mktemp)"
< Pipfile \
sed \
-e '/^\[\[source\]\]$/,/^\[/ { s|^\(name = \).*|\1"'"${PIPENV_INDEX_NAME}"'"| ; s|^\(url = \).*|\1"'"${PIPENV_INDEX_URL}"'"| ; }' \
> "${TEMP_PIPFILE}"
mv -- "${TEMP_PIPFILE}" Pipfile
}
紳士、真剣に。 この問題の影響を直接受ける簡単なユースケースがあります。
pipenvを使用するプロジェクトがあります。 私はこのプロジェクトを自宅と職場の両方で書いています。
家では問題ありません。 職場では、内部pipyインデックスを使用する必要があります。
Pipfileがコミットされてgitにプッシュされるため、自宅から職場に移動するときに変更を続けることができません。 別のインデックスを使用する必要があることをpipenvに通知する外部構成が必要です。
この構成をPipfile内に配置しても機能しません。
これに関する更新はありますか?
@hrbonz @ninrod @GhostofGoesが#1769および#1809で修正されました-Pipfilesの環境変数が実行時に拡張されるようになりました
ご理解のほどよろしくお願いいたします。私たちの最優先事項はコードベースのコア機能であるため、このような機能はすり抜けてしまう傾向があります。 ただし、現在優先していないアイテムへの貢献については、いつでも喜んで話し合います。
これが修正されるまで私が考えることができる唯一の選択肢は、PyPi URLをオーバーライドして、すべてのトラフィックがPyPiの内部ミラー(たとえば、Artifactoryなど)に転送されるようにすることです。 とにかくPyPiは内部的に制限されているので。
最も参考になるコメント
これらのエントリには、プロジェクトリポジトリに入るはずのPipfileには確実に入らない資格情報が含まれている場合があります。