<p>pipenv๋Š” pip.conf๋ฅผ ์กด์ค‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2017๋…„ 10์›” 08์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pypa/pipenv

devpi ๋ฅผ pypi ํŒจํ‚ค์ง€๋ฅผ ํ”„๋ก์‹œ ์บ์‹œํ•˜๊ณ  ์ž์ฒด ๋‚ด๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ธ pypi ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด pip.conf ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[global]
index_url = https://pypi.priv.xxx/prod/+simple/
[search]
index = https://pypi.priv.xxx/prod/

์ด ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๋Ÿฌํ•œ ํ•ญ๋ชฉ์—๋Š” ํ”„๋กœ์ ํŠธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋Š” Pipfile๋กœ ์ด๋™ํ•˜์ง€ ์•Š์„ ์ž๊ฒฉ ์ฆ๋ช…์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  15 ๋Œ“๊ธ€

์ด๋Ÿฌํ•œ ํ•ญ๋ชฉ์€ Pipfile๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@kennethreitz ๋‚ด ๊ฒฝ์šฐ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ pipenv๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋™์•ˆ ๊ฒช์—ˆ๋˜ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์„ค๋“ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋จผ์ € pipenv, ์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. Pipfile ์—์„œ ์†Œ์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ณ  ~/.pypirc ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋ช…๋ช…๋œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ pipenv ํ”„๋กœ์ ํŠธ/ํ™˜๊ฒฝ ๋งŒ๋“ค๊ธฐ

$ 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 ๋˜๋Š” pip-tools๋Š” 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.

๊ด€์ฐฐ

์ธ๋ฑ์Šค์™€ UX๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ผ์ข…์˜ "๊ฐญ"์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๋Š” Pipfile ์ธ๋ฑ์Šค ํ•ญ๋ชฉ์„ ๋งŒ๋“ค๊ณ  ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์ธ๋ฑ์Šค์™€ ์—ฐ๊ฒฐํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๋ช…๋ น์ค„์„ ํ†ตํ•ด ์„ค์น˜ํ•˜๋Š” ๋™์•ˆ ์ธ๋ฑ์Šค(์ด๋ฆ„ ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋กœ)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. pypi์˜ ํŒจํ‚ค์ง€์™€ ๊ฐœ์ธ ์ธ๋ฑ์Šค์˜ ํŒจํ‚ค์ง€๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ฆฌ ํŽธ๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ช…๋ น์ค„์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ ์ธ๋ฑ์Šค๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ์‚ฌ์šฉ์ž ์ง€์ • ์ธ๋ฑ์Šค์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๋ช…๋ น์ค„์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค๊ฐ€ ์š”๊ตฌ ์‚ฌํ•ญ ํŒŒ์ผ์— ์ง€์ •๋˜๋ฉด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์œ„์— ๋…ธ์ถœ๋œ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด PR์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ์— ๋›ฐ์–ด๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™” ์‹œ pip.conf ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ‰์ธ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • Pipfile ์— ๊ธฐ๋ณธ ์ธ๋ฑ์Šค๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ ์ธ๋ฑ์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช…๋ น์ค„์—์„œ ์ด๋ฆ„ ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋กœ ์ธ๋ฑ์Šค ์ œ๊ณต
  • ์š”๊ตฌ ์‚ฌํ•ญ ํŒŒ์ผ์— ์ œ๊ณต๋œ ์ธ๋ฑ์Šค๋ฅผ ์กด์ค‘ํ•˜๊ณ  Pipfile ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๊ฐ€ ์š”๊ตฌ ์‚ฌํ•ญ ํŒŒ์ผ์ด๋‚˜ ๋ช…๋ น์ค„์—์„œ ์‚ฌ์šฉ๋˜์ง€๋งŒ Pipfile ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ pipenv์—์„œ ์‚ฌ์šฉ๋œ venv ์ด๋ฆ„ ์ง€์ •๊ณผ ์œ ์‚ฌํ•œ ์ž๋™ ์ด๋ฆ„์œผ๋กœ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์™œ ๊ทธ๋ ‡๊ฒŒ ์‹ ๊ฒฝ์„ ์จ? ์ค‘๊ตญ์— ์‚ด๊ณ  ์žˆ๋Š” 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

@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๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋จผ์ € ์‚ฌ์ดํŠธ ์ „์ฒด ํŒŒ์ผ์„ ์ฝ์€ ๋‹ค์Œ
  2. ์‚ฌ์šฉ์ž๋ณ„ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ
  3. virtualenv ๊ด€๋ จ ํŒŒ์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.

pip.conf๋ฅผ ์กด์ค‘ํ•˜๋ฉด pip ์‚ฌ์šฉ์ž๊ฐ€ pipenv๋กœ ์›ํ™œํ•˜๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์„ Pipfile ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ(๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์™€ ๊ตฌ์„ฑ์„ ์‰ฝ๊ฒŒ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด) pipenv๋Š” ํ™•์‹คํžˆ pip.conf ๋„ ์กด์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ํŒŒ์ผ).

@erinxocon ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์‹๋ณ„ํ•œ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ผ๋กœ ๊ฝค ๋ฐ”๋นด์ง€๋งŒ ๋‹ค์Œ ์ฃผ ์ „์— ์ฒซ ๋ฒˆ์งธ PR์„ ์ถ”์ง„ํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, @kennethreitz ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ† ๋ก ์— ๋…ผ์Ÿ์ด ๋ฐœ์ƒํ•œ ํ›„ ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ž…์žฅ์„ ์žฌ๊ณ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

pip.conf์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ณ„๋„์˜ pip.conf ํŒŒ์ผ์— ์ž๊ฒฉ ์ฆ๋ช…์ด ์žˆ๋Š” ๊ฒƒ์€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ์Šคํ…œ์—์„œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ๋ฅผ ๊ฐ–๋Š” ๋ฐ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

@hrbonz ์ง€๊ธˆ์€ pip.conf ํŒŒ์ผ์ด pipenv์—์„œ ์ง€์›๋  ๋•Œ๊นŒ์ง€ pip์—์„œ $PIP_INDEX_URL env ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น $PIP_VARIABLE ๋Š” ํ˜„์žฌ .env ํŒŒ์ผ์—์„œ ์†Œ์‹ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pypa/pip#3728๊ณผ ์‚ฌ์šฉ์ž ์ง€์ • ์ธ๋ฑ์Šค ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์ž๊ฒฉ ์ฆ๋ช…์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋น„๊ณต๊ฐœ ์ธ๋ฑ์Šค๋ฅผ ์œ„ํ•œ _the_ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ #1406์— ๋Œ“๊ธ€์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค.

์ƒ‰์ธ ์ด๋ฆ„๊ณผ URL๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ(์˜ˆ: 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์˜ ๋‚ด๋ถ€ ๋ฏธ๋Ÿฌ(์˜ˆ: Artifactory ๋˜๋Š” ๊ธฐํƒ€ ๋“ฑ๋“ฑ)๋กœ ์ „๋‹ฌ๋˜๋„๋ก PyPi URL์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  PyPi๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ œํ•œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰