يجب أن تذهب هذه الإدخالات إلى ملف 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
).
$ 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.
أشعر أن هناك نوعًا من "الفجوة" في التعامل مع الفهارس وتجربة المستخدم:
Pipfile
وربط كل حزمة بفهرس. هذا ليس مناسبًا جدًا في حالة وجود مجموعة من الحزم من pypi وواحدة فقط من فهرس خاص.أنا أغوص في الكود لتوفير علاقات عامة لتغطية المشكلات الموضحة أعلاه:
pip.conf
للفهارس المخصصةPipfile
ليتم استخدامه عندما لا يتم تحديد أي منهاPipfile
إذا تم استخدام فهرس إما في ملف المتطلبات أو في سطر الأوامر ولكنه غير معروف لـ Pipfile
، فيجب إضافة إدخال باسم تلقائي مشابه لتسمية venv المستخدمة في pipenv.
لماذا أهتم كثيرا؟ العيش في الصين ، pypi ليس دائمًا متاحًا أو سريعًا (العديد من المهلات أو البطء الشديد) لذا فإن وجود فهرس مثل devpi يخزن ويسمح لي بمزج حزمتي الخاصة يعد فوزًا مزدوجًا. هذا يجعل مطورنا ، والاختبار ، وأداة الإرساء ، وما إلى ذلك طريقة أسرع.
على سبيل المثال ، هذا سلوك كلاسيكي جدًا يحدث عندما تتدخل المهلات:
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
تضمين التغريدة
لا. على سبيل المثال الحقيقي ، أعيش في الصين. عادة ما تكون سرعة pypi.python.org أقل من 50 كيلو / ثانية ، ولا بد لي من وضع مرآة صينية عالمية. أو كنت أرى الكثير من
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 الذي من المفترض أن يدخل في إعادة شراء المشروع.
eromoehrbonz هكذا هي المشكلة التي يقرر pipenv pypi أولا بدلا من الخوادم الخاصة؟
بالنسبة لي هو. أنا حقا بحاجة إلى إعدادات مرآة عالمية.
pip.conf يتبع:
- أولاً يتم قراءة الملف على مستوى الموقع ، ثم
- تتم قراءة الملف لكل مستخدم ، وأخيرًا
- تتم قراءة الملف الخاص بـ virtualenv.
احترام pip.conf يعني أنه يمكن للمستخدم الانتقال إلى pipenv بسلاسة.
تعجبني فكرة أن تكون قادرًا على وضع هذه التكوينات في Pipfile
(لمشاركة التكوين بسهولة مع المطورين الآخرين) ، ولكن يجب أيضًا أن تحترم pipenv بشكل نهائي pip.conf
(استخدمها لأي شيء غير محدد في Pipfile).
erinxocon هذه إحدى المشكلات التي حددتها. لقد كنت مشغولًا جدًا بالعمل ولكني آمل أن أقدم العلاقات العامة الأولى قبل الأسبوع المقبل.
مرحبًا ، @ kennethreitz شكرًا على المشروع الرائع.
لدي سؤال ، هل ستعيد النظر في موقفك من هذه القضية بعد الحجج التي تم طرحها في تلك المناقشة؟
لدي حالة استخدام أخرى مشابهة جدًا مع pip.conf وامتلاك بيانات اعتماد في ملف pip.conf المنفصل صالح للحصول على بناء يمكن التنبؤ به على خط أنابيب CI / CD وآلة تطوير محلية.
hrbonz الآن لقد وجدت حلًا لاستخدام متغيرات env من $PIP_INDEX_URL
من النقطة حتى ملف pip.conf سيتم دعمه بواسطة pipenv. يمكن الحصول على تلك $PIP_VARIABLE
الآن من ملف .env
.
أعتقد أن الجمع بين pypa / pip # 3728 والفهارس المخصصة سيكون الحل للفهارس الخاصة دون كشف بيانات الاعتماد. علق أيضا في # 1406.
إليك حل واحد إذا كان كل ما تحتاجه هو اسم الفهرس وعنوان URL (على سبيل المثال ، باستخدام devpi
). يمكنك استدعاء وظيفة shell هذه متى أردت إنشاء ملف Pipfile يحتوي على اسم الفهرس المخصص وعنوان URL الخاص بك ، ولكنه بخلاف ذلك أصلي.
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. أكتب هذا المشروع في المنزل وفي العمل.
في المنزل ، ليس لدي مشكلة. في العمل ، لا بد لي من استخدام مؤشر الأنابيب الداخلي.
نظرًا لأن Pipfile ملتزم ودفع إلى git ، لا يمكنني الاستمرار في تغييره لأنني قفز من المنزل إلى العمل. أرغب في الحصول على تكوين خارجي يشير إلى pipenv بأنه يتعين علي استخدام مؤشر آخر.
وضع هذا التكوين داخل Pipfile لا يعمل.
أي تحديثات على هذا؟
GhostofGoesninrodhrbonz الثابتة في # 1769 و # 1809 - متغيرات البيئة في Pipfiles يتم توسيع الآن في وقت التشغيل
نشكرك جميعًا على سعة صدرك ، كانت أهم أولوياتنا هي الوظيفة الأساسية لقاعدة التعليمات البرمجية ، لذلك تميل ميزات مثل هذه إلى التسلل عبر الشقوق. يسعدنا دائمًا مناقشة المساهمات الخاصة بالعناصر التي لا نعطيها الأولوية حاليًا!
البديل الوحيد الذي يمكنني التفكير فيه حتى يتم إصلاح ذلك هو تجاوز عنوان URL لـ PyPi بحيث يتم إعادة توجيه كل حركة المرور إلى المرآة الداخلية لـ PyPi (على سبيل المثال ، Artifactory أو غير ذلك). نظرًا لأن PyPi مقيد داخليًا على أي حال.
التعليق الأكثر فائدة
قد تحتوي هذه الإدخالات على بيانات اعتماد لن تدخل بالتأكيد إلى ملف Pipfile الذي من المفترض أن يدخل في إعادة شراء المشروع.