Pip: ๋Œ€์•ˆ์ด ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ `--process-dependency-links` ์‚ฌ์šฉ ์ค‘๋‹จ ์ทจ์†Œ

์— ๋งŒ๋“  2016๋…„ 12์›” 19์ผ  ยท  72์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pypa/pip

  • ํ• ๋ฒ„์ „: 8.1.1
  • ํŒŒ์ด์ฌ ๋ฒ„์ „: 3.5.2
  • ์šด์˜ ์ฒด์ œ: ์šฐ๋ถ„ํˆฌ 16.04

์„ค๋ช…:

--process-dependency-links ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ž ์‹œ ์ „์— pip์— ๋‹ค์‹œ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/pypa/pip/pull/1955

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ PEP 508/440์ด pip๋กœ ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. setuptools์˜ setup ๋Œ€ํ•œ dependency_links ์ธ์ˆ˜๋„ ์—ฌ์ „ํžˆ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. http://setuptools.readthedocs.io/en/latest/setuptools.html#dependencies -that-aren-t- ์ธํŒŒ์ดํ”ผ

๋‚ด๊ฐ€ ์‹คํ–‰ํ•œ ๊ฒƒ:

$ pip install request --process-dependency-links
Collecting request
  Downloading request-0.0.12.tar.gz
  DEPRECATION: Dependency Links processing has been deprecated and will be removed in a future release.
... 
awaiting PR auto-locked needs discussion maintenance

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

์ด์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์›Œํฌํ”Œ๋กœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Github์—์„œ ํฌํฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์€ ๊ณง ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์„ ์˜ˆ์ •์ด๋ฏ€๋กœ PyPi ๋Œ€์‹  Github ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ํ•œ ๋ฒˆ ์ œ๊ฑฐ๋œ ํ”Œ๋ž˜๊ทธ์ธ pip๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•  ๋•Œ --process-dependency-links๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด setup.py์— ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‚˜์š”? ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์€ ๋ถ„๊ธฐ๋œ pypi ํŒจํ‚ค์ง€๋ฅผ ํ‘ธ์‹œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  pull ์š”์ฒญ์ด ๋ณ‘ํ•ฉ๋˜๋ฉด ์‚ฌ์šฉ์ž์˜ ํ˜ผ๋ž€์„ ๊ฐ€์ค‘์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋™์˜. ์˜์กด์„ฑ ๋งํฌ์— ๋Œ€ํ•œ pip์˜ ํ˜„์žฌ ๋™์ž‘์€ ์ •๋ง ์งœ์ฆ๋‚ฉ๋‹ˆ๋‹ค.

4295

3610

[#3939์— ์ž‘์„ฑ, ๋‚ด ์˜๊ฒฌ์„ ์—ฌ๊ธฐ๋กœ ์ด๋™]

์—ฌ๊ธฐ ์ฃผ์š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. requirements.txt ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด (์˜ˆ๋ฅผ ๋“ค์–ด, setup.cfg ์— ๋ชจ๋‘ ์ง€์ •๋œ ์„ ์–ธ์  ์ข…์†์„ฑ์„ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—), URL์„ ์ข…์†์„ฑ์œผ๋กœ?

์ด๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

[options]
install_requires = 
  requests==2.18.4
  https://github.com/example/example_lib/archive/master.zip

๋˜ํ•œ ์ข…์†์„ฑ ๋งํฌ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๊ณ  ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ‘œ์ค€์  ์œผ๋กœ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์—†์œผ๋ฉด ์–ด๋–ป๊ฒŒ ์ œ๊ณต๋ฉ๋‹ˆ๊นŒ?

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” dependency_links ๋ถ„๋ช…ํžˆ setup.cfg์—์„œ setup.py ์ธ์ˆ˜๋กœ๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๊ด€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ง„ํ–‰ ์ค‘์ธ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? dependency_links_๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚ด๋ถ€/๊ฐœ์ธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์œ ์ผํ•œ ์˜ต์…˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋Œ€์‹  ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด install_requires์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ด๋ฆ„ ๋ฒ„์ „๊ณผ ๊ณ„๋ž€๊ณผ ํ•จ๊ป˜ tarbal์ด ํฌํ•จ๋œ ์ข…์†์„ฑ ๋งํฌ๋ฅผ ๋ชจ๋‘ ๋„ฃ๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์žŠ์–ด๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ํ˜ผ๋™ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์•ˆ์œผ๋กœ @jleclanche ๊ฐ€ install_requires์—์„œ tarball์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๋งํฌ๋ฅผ ์ œ์•ˆํ•œ ๊ฒƒ์„ ๋ณด๊ณ 

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ˜ผ์ž๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: https://stackoverflow.com/questions/3472430/how-can-i-make-setuptools-install-a-package-thats-not-on-pypi

devpi ์™€ ๊ฐ™์€

@dstufft btw - devpi์˜ ์กด์žฌ๊ฐ€ ์ข…์†์„ฑ ๋งํฌ๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ณด๋‹ค ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

IMHO ์ธ๋ฑ์Šค ์ƒ์† + ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ/๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์ž‘์„ฑ์€ ์šด์˜ ์ˆ˜์ค€์—์„œ ๋ณด๋‹ค ์ผ๊ด€๋˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

@RonnyPfannschmidt , ์ œ์•ˆ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ(์ด ์ง€์› ์ค‘๋‹จ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์ง„ํ–‰๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค) ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•˜๋ฉด reddit์˜ ์ด ์˜๊ฒฌ์— ๋” ๋™์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

devpi๊ฐ€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ผ๋ถ€ ๊ด€๋ฆฌ์ž๊ฐ€ ์„ค์ •ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ๊ฒŒ์ž„์— ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ๊ณง ์ž‘์—…์— ์ฐฉ์ˆ˜ํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•œ ๋‹ค์Œ devip์— ๋„ฃ์„ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๋˜๋Š” devpi์— git ์ €์žฅ์†Œ๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‚˜์š”?)

์ด์ƒ์ ์œผ๋กœ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ setup.py์— ๋ช‡ ์ค„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ์ด์ƒ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š” ๋Œ€์•ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๊ฒฐ์ •์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋‚˜์œ ๊ด€ํ–‰๊ณผ ๋ถˆ์•ˆ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚ด๋ถ€ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์œ ์ง€ํ•˜๋Š” ํ•œ ์ฃผ์š” ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

4175๋Š” PEP 508 URL ์ง€์›์ด pip 10์— ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‹ซํž ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@pfmoore @dstufft?

https://github.com/pypa/pip/pull/4175/commits/86b07792e7ae762beeaeb471ab9db87e31bc285d ๋Š” @ ๊ตฌ๋ฌธ์„ ์ข…์†์„ฑ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ #4175๊ฐ€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. . ๊ฑฐ๊ธฐ์— ๋Œ€ํ•œ ์˜๊ฒฌ์€ PyPI๊ฐ€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—…๋กœ๋“œ๋ฅผ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ข…์†์„ฑ์— ๋Œ€ํ•œ @ ์ง€์›์„ ๊ตฌํ˜„ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. , ์•„๋งˆ๋„).

PEP 508 ์ง€์›๊ณผ ๊ฐ™์€ ๋Œ€์•ˆ์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ ๋„ˆ๋ฌด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์›Œํฌํ”Œ๋กœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Github์—์„œ ํฌํฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์€ ๊ณง ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์„ ์˜ˆ์ •์ด๋ฏ€๋กœ PyPi ๋Œ€์‹  Github ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ํ•œ ๋ฒˆ ์ œ๊ฑฐ๋œ ํ”Œ๋ž˜๊ทธ์ธ pip๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•  ๋•Œ --process-dependency-links๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด setup.py์— ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‚˜์š”? ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์€ ๋ถ„๊ธฐ๋œ pypi ํŒจํ‚ค์ง€๋ฅผ ํ‘ธ์‹œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  pull ์š”์ฒญ์ด ๋ณ‘ํ•ฉ๋˜๋ฉด ์‚ฌ์šฉ์ž์˜ ํ˜ผ๋ž€์„ ๊ฐ€์ค‘์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์œผ๋กœ ๊ฐ€์ž.

--process-dependency-links ์—๋Š” ์˜ค๋Š˜๋‚  ๋Œ€์•ˆ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ”Œ๋ž˜๊ทธ๋Š” pip๊ฐ€ ์ž„์˜์˜ URL์— ๋„๋‹ฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์ฒจ๋ถ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@pradyunsg ์˜์›ํžˆ ์ฃฝ์ผ ๊ณ„ํš์ด ์—†๋Š” ํ•œ, ์ข€๋น„๋ฅผ ์‰ฌ๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” pip๊ฐ€ "์•„๋‹ˆ์˜ค, ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋นš์„ ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š๋Š” ํ•œ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ํ•„์š”๋กœ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ƒํ™ฉ์„ ๊ณ ์น  ๋™๊ธฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

pip ์œ ์ง€ ๊ด€๋ฆฌ์ž๋กœ์„œ ๋‚ด ๊ด€์‹ฌ์‚ฌ๋Š” pip๊ฐ€ ์•…์šฉ์˜ ๋ฒกํ„ฐ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Pip๋Š” PyPI๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์Šค๋กœ ๊ฐ€์ •ํ•˜๋ฏ€๋กœ PyPI์— ๋Œ€ํ•œ ์•”์‹œ์  ์‹ ๋ขฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. dependency_links ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€๊ฐ€ PyPI์— ์žˆ์Šต๋‹ˆ๊นŒ?
  2. dependency_links ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜ ์—…๋กœ๋“œ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋„๋ก PyPI๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(๋˜๋Š” ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ)?
  3. ๋˜๋Š” pip๊ฐ€ PyPI์—์„œ ๋‹ค์šด๋กœ๋“œํ•œ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ข…์†์„ฑ ๋งํฌ(์˜ต์…˜ ์„ค์ • ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด) ์ฒ˜๋ฆฌ๋ฅผ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

pip ์‚ฌ์šฉ์ž๊ฐ€ ์•…์„ฑ dependency_links PyPI ํŒจํ‚ค์ง€์— ๋ฌผ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋œ ๊ฑฑ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ์‹ ๋ขฐํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์Šค์Šค๋กœ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋Š” ๊ทธ๋•Œ์—๋„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž ์žฌ์ ์œผ๋กœ ์›๊ฒฉ ์•…์šฉ์ด๋ฉฐ ํ•ญ์ƒ ๋ช…์‹œ์ ์œผ๋กœ ์˜ตํŠธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Pip๋Š” PyPI์˜ ์ข…์†์„ฑ ๋งํฌ๋ฅผ ์ ˆ๋Œ€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ช…์‹œ์ ์œผ๋กœ ๋˜๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—).
  2. --process-dependency-links ํ”Œ๋ž˜๊ทธ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ์‚ฌ์šฉ์ž ์ •์˜ ์ธ๋ฑ์Šค์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ˜„์ƒํƒœ๋กœ ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์˜์กด์„ฑ ๋งํฌ ์Šคํƒ€์ผ ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๊ณ ์ž ํ•˜๋Š” ๋ฐฉ์‹(๋งŒ์•ฝ ์žˆ๋‹ค๋ฉด)์„ ์„œ๋กœ์—๊ฒŒ ๋ค๋ฒผ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์›ํ•œ๋‹ค๋ฉด ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ข…์†์„ฑ ๋งํฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ํ‘œ์ค€์— ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘๋‹จ์€ "ํ‘œ์ค€์— ์ง€์ •๋œ ๋™์ž‘์„ ์œ„ํ•ด ํ˜„์žฌ ๋™์ž‘์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค"๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ pip ์ค‘์‹ฌ์ ์ธ ๊ด€์ ์—์„œ ๋ณด๋ฉด ์ €๋Š” ๊ทธ๋ƒฅ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ข…์†์„ฑ ๋งํฌ๊ฐ€ ํ•„์š”ํ•œ ์‚ฌ๋žŒ๋“ค์ด ํ‘œ์ค€ํ™” ์ž‘์—…์„ ํ•˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค(๊ฒฐ๊ตญ ์ž์‹ ์—๊ฒŒ ์ด์ต์ด ๋ฉ๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‘œ์ค€ ๋ณ€๊ฒฝ์„ ์–ป๋Š” ๊ฒƒ) - ์™„์ „ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ•ฉ์˜๋กœ pip์˜ ํ–‰๋™์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด).

๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์˜์กด์„ฑ ๋งํฌ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ pip๋Š” ์•„์ง ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์•„์ง ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” PyPI์— ๋Œ€ํ•œ ์—…๋กœ๋“œ๋ฅผ ์ฐจ๋‹จํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

#4175๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? 86b0779 ๋•Œ๋ฌธ์— ์ฐจ๋‹จ๋œ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? comes_from ๊ฐ€ PyPI์ธ ๊ฒฝ์šฐ์—๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก https://github.com/pypa/pip/blob/master/src/pip/_internal/req/req_install.py#L167 ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฐ ๋‹ค์Œ --process-dependency-links ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ @ ๊ตฌ๋ฌธ์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ํ•ฉ๋ฆฌ์ ์ธ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด --process-dependency-links ๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ์‹œ์ ๋ถ€ํ„ฐ ์‹œ๊ณ„๊ฐ€ ๋˜‘๋”ฑ ๊ฑฐ๋ฆฌ๊ณ  ์žˆ์Œ).

@pfmoore ์˜ˆ, ๋ฐ”๋กœ ๊ทธ๊ฒƒ์ด๋ฉฐ, ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š”

ํ™•์ธ. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋จผ์ € ์ ‘๊ทผํ•˜์ง€ ์•Š์œผ๋ฉด PR ์ž‘์„ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ˆ˜์ง‘ํ•œ ์ •๋ณด์—์„œ ์‚ฌ์šฉ์ž ๋ฌธ์ œ๋Š” ๋Œ€์•ˆ์ด ์—†๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์˜ต์…˜์„ ์ „๋‹ฌํ•  ๋•Œ "ํ—ค์ด, ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•˜๋Š” ์˜ต์…˜์„ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ข…์†์„ฑ_๋งํฌ ์ง€์›์„ ์™„์ „ํžˆ ์ค‘๋‹จํ•˜๋Š” ๋ฐ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์‚ฌ์ด์— PEP 508 URL ์ข…์†์„ฑ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ, pip๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์—ฌ์ „ํžˆ ํฐ ์†Œ๋ฆฌ๋ฅผ ๋‚ด์•ผ ํ•˜๊ณ  ์—ฌ์ „ํžˆ ์˜ตํŠธ์ธ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ํ”Œ๋ž˜๊ทธ ๋’ค์— PEP 508 url-deps๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.

    • ์ œ์ณ๋‘๊ณ : ๋ณด์•ˆ ๊ด€๋ จ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”Œ๋ž˜๊ทธ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • PyPI ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜จ PEP 508 url-deps ์„ค์น˜๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ข…์†์„ฑ ๋งํฌ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ์‚ญ์ œํ•  ๋‚ ์งœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์†”์งํžˆ ๋งํ•ด์„œ, ๋Œ€์•ˆ์„ ์ธ์‡„ํ•˜๋Š” ๋‹จ์ผ ๋ฆด๋ฆฌ์Šค๋ณด๋‹ค ๋” ์ด์ƒ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๊ฐ„์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด์ œ ํƒ€์ดํ•‘ํ–ˆ๋Š”๋ฐ ์•ˆ ๋ณด๋ƒˆ์–ด์š”. ์ด์ œ @pfmoore ์˜ ๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€๊ณผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

์•ผ!

URL deps์— ์˜ตํŠธ์ธ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? PEP 508์€ ๊ทธ๋ ‡๊ฒŒ ๋งํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ๋Š” ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณด์•ˆ ๋Œ€ ์‚ฌ์šฉ ์šฉ์ด์„ฑ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‚ด ํŒ๋‹จ์„ ์‹ ๋ขฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์Šค์œ„์น˜๋ฅผ ํ‘ธ์‹œํ•˜๊ธฐ ์ „์— ํ”„๋กœ์ ํŠธ๊ฐ€ ์ข…์†์„ฑ ๋งํฌ์—์„œ @ ๊ตฌ๋ฌธ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ง€์› ์ค‘๋‹จ์˜ ์˜ํ–ฅ์„ ๋ฐ›์„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ์–ด๋ ต๊ณ , ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒฝ๊ณ ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ๊ฒฝ๊ณ ์— "๋ณ€๊ฒฝ ๋ฐฉ๋ฒ•" ๋ฌธ์„œ์ธ IMO์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ณด์•ˆ ๋Œ€ ์‚ฌ์šฉ ์šฉ์ด์„ฑ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‚˜์˜ ํŒ๋‹จ์„ ์‹ ๋ขฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋Š” "๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด์•ˆ์„ ์œ ์ง€"ํ•˜๊ณ  ๋œ ์•ˆ์ „ํ•œ ํ–‰๋™์„ ์„ ํƒํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์œ„์น˜๋ฅผ ํ‘ธ์‹œํ•˜๊ธฐ ์ „์— ํ”„๋กœ์ ํŠธ๊ฐ€ ์ข…์†์„ฑ ๋งํฌ์—์„œ @ ๊ตฌ๋ฌธ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋ฌธ์„œ

๋‚˜์—๊ฒŒ ์ข‹์€ ์†Œ๋ฆฌ.

์ €๋Š” "๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด์•ˆ์„ ์œ ์ง€"ํ•˜๊ณ  ๋œ ์•ˆ์ „ํ•œ ํ–‰๋™์„ ์„ ํƒํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ง์žฅ์—์„œ ๋ฐฉํ™”๋ฒฝ ๋ฐ ๋ณด์•ˆ ์ œ์•ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ด์‹ฌํžˆ ์ผํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ ๋‚˜๋Š” ์ด ๊ธฐ๋Šฅ์ด ๊ฐ€์žฅ ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™์€ ํ™˜๊ฒฝ(๋‚ด๋ถ€ ๊ฐœ๋ฐœ, ํ์‡„ ์†Œ์Šค , ์—„๊ฒฉํ•˜๊ฒŒ ์ œ์–ด๋˜๋Š” ์›Œํฌํ”Œ๋กœ ๋ฐ ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์•„์›ƒ ๋“ฑ). ๋”ฐ๋ผ์„œ ๋‚ด ์„ฑํ–ฅ์€ ๊ธฐ๋ณธ ์›Œํฌํ”Œ๋กœ(PyPI)์— ๋Œ€ํ•ด ์•ˆ์ „ํ•˜์ง€๋งŒ ์›Œํฌํ”Œ๋กœ์— ๋ถ„๋ช…ํžˆ ์ค‘์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์„ ๋ฐฉํ•ดํ•˜๋Š” ์ถ”๊ฐ€ ์žฅ์• ๋ฌผ์„ ๋‘์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ๋“ค๋‹ค.

๋‚ด ์ƒ๊ฐ์— "ํŒจํ‚ค์ง€๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ์„œ๋ฒ„์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ"๋Š” URL ๋งํฌ๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋‹ค? ๋ฏธ์†Œ : ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ํ™•์‹คํžˆ ๋‚ด ํŽธ๊ฒฌ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ์•„๋‹ˆ์—์š” ๋‹จ์ง€, ์˜๊ฒฌ์ด์—†๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค :

์›Œํฌํ”Œ๋กœ์— ๋ถ„๋ช…ํžˆ ์ค‘์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์„ ๋ฐฉํ•ดํ•˜๋Š” ์ถ”๊ฐ€ ์žฅ์• ๋ฌผ์„ ๋‘์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

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

"ํŒจํ‚ค์ง€๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ์„œ๋ฒ„์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ"๋Š” URL ๋งํฌ๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. :/

๋ณด๋‹ค? ์ œ ์˜๊ฒฌ์ด ์—†๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ œ ํŽธ๊ฒฌ์ด ์ž˜ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿ˜„

ํ—คํ—ค.

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

๋‚ด ์ƒ๊ฐ์— "ํŒจํ‚ค์ง€๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ์„œ๋ฒ„์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ"๋Š” URL ๋งํฌ๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

GitHub์—์„œ ์†Œ์Šค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋ฌธ์ œ์˜ 99%๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ ํŒจํ‚ค์ง€์—๋Š” ๋ฒ„๊ทธ ๋˜๋Š” ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ํฌํฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ , PR์„ ๋ฐœํ–‰ํ•œ ๋‹ค์Œ, ๋ณ‘ํ•ฉ๋˜์–ด PyPI์—์„œ ๋ฆด๋ฆฌ์Šค๋  ๋•Œ๊นŒ์ง€ ์•„๋งˆ๋„ ์ •๋ง ์˜ค๋žœ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ ๋‚ด ํŒจํ‚ค์ง€๋Š” ํ•ด๋‹น ํŒจํ‚ค์ง€์˜ ์ˆ˜์ • ์‚ฌํ•ญ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ์ค„์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ์˜ตํŠธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ(HTTPS/๋“ฑ์œผ๋กœ ๊ฐ€์ •) ๊ฐ€์šฉ์„ฑ ๋ฌธ์ œ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” PyPI์—์„œ ๊ทธ๊ฒƒ๋“ค์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋ถ„ํ•˜๊ณ  ๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ž‘์—…์—์„œ ์šฐ๋ฆฌ๋Š” @pfmoore๊ฐ€ ์–ธ๊ธ‰ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ์ผ๋ถ€, ์ฆ‰ ํŒจํ‚ค์ง€๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค, ํ์‡„ ์†Œ์Šค ๋“ฑ์ด๊ธฐ ์ „์˜ ๋‚ด๋ถ€ ๊ฐœ๋ฐœ์—
ํŒŒ์ผ ์‹œ์Šคํ…œ ์œ„์น˜๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋„ ๋ณด์•˜์ง€๋งŒ...
ํ—ˆ์šฉ๋œ ํ˜ธ์ŠคํŠธ/์œ„์น˜ ๋ชฉ๋ก์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๊นŒ? ํ”Œ๋ž˜๊ทธ ์ด๋ฆ„์€ @pradyunsg๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€๋ จ๋œ ์œ„ํ—˜์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์„ค๋ช…์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ --whitelisted-host ?

@masdeseiscaracteres ๋‚˜๋Š” ๋‹น์‹ ์ด ์˜คํ•ดํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๊ฐ€ PyPI์—์„œ ๊ฒ€์ƒ‰๋œ ๊ฒฝ์šฐ @ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ํŒจํ‚ค์ง€์˜ ์ข…์†์„ฑ์ด ์ง€์ •๋˜๋ฉด ์‹คํŒจํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  PyPI์—๋Š” ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์šฐ๋ฆฌ๋Š” ์–ด๋Š ์‹œ์ ์—์„œ ์ด๋ฅผ ๊ฑฐ๋ถ€ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์•„์ง ์„ค์ •ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค). @ ์ฐธ์กฐ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

https://github.com/pypa/pip/issues/4187#issuecomment -389846189์—์„œ @pfmoore ๊ฐ€ ์„ค๋ช…ํ•œ ๋Œ€๋กœ PR์„ ์ง„ํ–‰ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ™๋ณด ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. :)

๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ(์„ค๋ช…ํ•œ ๋Œ€๋กœ comes_from ์— ๋Œ€ํ•œ ํ™•์ธ์œผ๋กœ ๋ณด์ž„), ๋„๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค). ๋ˆ„๊ตฌ๋“ ์ง€ ๊ทธ๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋Œ€๋‹จํžˆ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ๊ทธ๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋Œ€๋‹จํžˆ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ์กด ํ…Œ์ŠคํŠธ test_install_pep508_with_url_in_install_requires ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

PyPI์—์„œ ์„ค์น˜ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ URL ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋Š” PyPI์— ์‹ค์ œ๋กœ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ์˜ต์…˜์€ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ž ์ด๋ฅผ ์œ„ํ•ด PyPI์— ํŒจํ‚ค์ง€๋ฅผ ์—…๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. https://pypi.org/project/pep-508-url-deps/


๋˜ ๋‹ค๋ฅธ ์ ์€ -- comes_from ๋Š” URL์ด๋‚˜ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ 'box==0.1.0 from file:///private/tmp/box' ํ–‰์„ ๋”ฐ๋ฅธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์€ ์ด์ œ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„ ํŒจํ‚ค์ง€์˜ ์ถœ์ฒ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. :)

@pfmoore ์ด ๋ฌธ์ œ๋Š” ๋‚ด ๋งˆ์Œ์— ๊ฐ€๊น๊ณ  ์†Œ์ค‘ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜„ @pradyunsg ์˜ ์—…๋กœ๋“œ๊ฐ€ ๋‹น์‹ ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ, ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ด๊ฒƒ์„ ๋‹ค๋ฃฐ ๊ณ„ํš์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ์Šค์œ™์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@bstrdsmkr ์•„๋‹ˆ์š”. @pradyunsg๊ฐ€ ๋งํ–ˆ๋“ฏ์ด comes_from ์ด ์†Œ์Šค URL์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ฐ๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ ์–ธ์ œ ์‹œ๊ฐ„์ด ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(์ด ๊ธฐ๋Šฅ์„ ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์šฐ์„  ์ˆœ์œ„ ๋ชฉ๋ก์—์„œ ๋†’์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด PR์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค :-)

์—…๋กœ๋“œ๋œ ํŒจํ‚ค์ง€๋Š” ๊ตฌํ˜„์— ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋„์›€์ด ๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ๋งŒ ๋„์›€์ด ๋œ๋‹ค๊ณ  ๋ง๋ถ™์ž…๋‹ˆ๋‹ค.

๋‚ด ์ดํ•ด๋Š” ์›ํ•˜๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

if req.url and is_like(req.url, PYPI.url):
    raise

https://github.com/pypa/pip/blob/master/src/pip/_internal/req/req_install.py#L172
์—ฌ๊ธฐ์„œ is_like() ๋Š” URL์ด ๋™์ผํ•œ ๋„๋ฉ”์ธ์— ๋ฃจํŠธ์ธ ๊ฒฝ์šฐ True ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋งž์Šต๋‹ˆ๊นŒ?

์‘. ๋‚˜๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ด. ๊ทธ๊ฒƒ์€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ์™€ NEWS ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€/์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด ๋ณ€๊ฒฝ์ด ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์šฉ ์ค‘๋‹จ ๋ฉ”์‹œ์ง€ + ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ์˜ ์ถ”๊ฐ€ ์„น์…˜์ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋Œ€์•ˆ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋Š” ์ถ”๊ฐ€ ์„น์…˜์„ ์ œ๊ณตํ•  ๊ธฐํšŒ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

pip ์œ ์ง€ ๊ด€๋ฆฌ์ž๋กœ์„œ ๋‚ด ๊ด€์‹ฌ์‚ฌ๋Š” pip๊ฐ€ ์•…์šฉ์˜ ๋ฒกํ„ฐ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Pip๋Š” PyPI๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์Šค๋กœ ๊ฐ€์ •ํ•˜๋ฏ€๋กœ PyPI์— ๋Œ€ํ•œ ์•”์‹œ์  ์‹ ๋ขฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๋ช…๋ฐฑํ•œ ์‹ ๋ขฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ข…์†์„ฑ IMHO์—์„œ ์™ธ๋ถ€ ์†Œ์Šค ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋ณดํ˜ธ ์žฅ์น˜๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ์ƒํ™ฉ์ด ๊ฐœ์„ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ VCS๋ณด๋‹ค pypi์—์„œ ๋งฌ์›จ์–ด๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

IMHO ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ์ž์˜ VCS๋ฅผ ๊ธฐ๋ณธ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜๊ณ  VCS์˜ ๋‚ด์šฉ์ด pypy์—์„œ ์–ป์€ ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ์•”ํ˜ธํ™” ์ฆ๊ฑฐ๊ฐ€ ์žˆ๋Š” ์บ์‹ฑ ํ”„๋ก์‹œ์™€ VCS๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ pypy๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ง์€

0 ๋“ฑ๋ก

dev -- public key --> pypa

1 ์—…๋กœ๋“œ ์ค‘

setuptools -- git+https:/.... --> pypa
pypi --> Tor --> give me that commit --> vcs
pypi <-- Tor <-- here -- vcs
pypi checks the signature matches the dev

2 ์œ ํœด:

pypi --> Tor --> give me that commit --> vcs
pypi <-- Tor <-- here -- vcs
pypi checks it

2 ๊ฒ€์ƒ‰ ์ค‘

flips a coin
if coin == 1:
  pip -- give me package git+https:/... --> pypi
  pip <-- signature || content -- pypi
  pip -- give me the signature --> vcs
  pip <-- signature -- vcs
else:
  pip -- give signature of package git+https:/... --> pypi
  pip <- signature -- pypi
  pip --> Tor --> give me that commit --> vcs
  pip <-- Tor <-- here -- vcs


pip checks if the signature matches the public key and signature from pypa
pip -- give me public key --> keyserver
pip <-- PK -- keyserver
pip checks signature given by VCS against the sdist given by pypy
pip caches public key and repo location

1 ์„ค์น˜๋œ ์†Œ์Šค๋Š” ์„œ๋ช… ๋•Œ๋ฌธ์— VCS์˜ ์†Œ์Šค์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
2 ์ž‘์„ฑ์ž๋„ ์ผ์น˜
3 pypa๋Š” ์ƒˆ ์‚ฌ์šฉ์ž์™€ ์น˜ํŒ…์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์น˜ํŒ…์€ ๊ธฐ์กด ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4 ์ž‘์„ฑ์ž๋Š” pypy์— ์ œ๊ณต๋˜์ง€ ์•Š์€ ์›น ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๊ธฐ์— ํ‘œ์‹œํ•˜์—ฌ ์†์ž„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  pypy์— ๋‹ค๋ฅธ ๋ถ„๊ธฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๊ธฐ๋ฅผ URI์˜ ํ•„์ˆ˜ ๋ถ€๋ถ„์œผ๋กœ ๋งŒ๋“ค๋ฉด ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@KOLANICH pypy/pypa๋ผ๊ณ  ํ•  ๋•Œ PyPI(Python Packaging Index)๋ฅผ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. PyPy๋Š” Python์˜ ๋Œ€์ฒด ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. PyPA(Python Packaging Authority)๋Š” Python Packaging ๊ณต๊ฐ„์—์„œ ์ฃผ์š” ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ž์› ๋ด‰์‚ฌ์ž ๊ทธ๋ฃน์ž…๋‹ˆ๋‹ค. ๋‘๋ฌธ์ž์–ด๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์„ ์‚ผ๊ฐ€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

๊ธฐ์กด์˜ ์ž˜ ์ •๋ฆฝ๋œ ์„œ๋น„์Šค์˜ ๋””์ž์ธ์„ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ฐ”๊พธ์ž๋Š” ์ œ์•ˆ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์›ํ•  ๊ฒฝ์šฐ ๊ธฐ์กด ์›Œํฌํ”Œ๋กœ์˜ ์ „ํ™˜์„ ํ—ˆ์šฉ/์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ด€๋ฆฌ/๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ (๊ฐ€๋Šฅํ•œ) ์ „ํ™˜ ๊ณ„ํš ๋ฐ POC ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ํ˜ธ์ŠคํŒ…์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ PEP 470 ์˜ ๊ณผ๊ฑฐ PyPI์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ฑฐ๋œ ๊ฒƒ์ด์ง€๋งŒ ์ด๋Š” ๊ท€ํ•˜๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ์ƒ๋‹นํžˆ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

PyPI๋Š” ๊ธฐ๋ถ€/ํ›„์› ์ธํ”„๋ผ์—์„œ ์‹คํ–‰๋˜๋Š” ์ž์› ๋ด‰์‚ฌ์ž์— ์˜ํ•ด ์œ ์ง€ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ž์› ๋ด‰์‚ฌ์ž ์œ ์ง€/์‹คํ–‰ ์„œ๋น„์Šค์ธ Tor๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๋„๋ก ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์ฃผ์š” ํ”„๋กœ์ ํŠธ์ด๋ฉฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง์ ‘์ ์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ‘œ์‹œ๋˜์ง€ ์•Š๋”๋ผ๋„ ๊ณ„์† ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๊ฒƒ์€ ์ด ํ† ๋ก ์— ์ ํ•ฉํ•œ ์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. PyPI์˜ ์žฌ์„ค๊ณ„๋ฅผ ์ œ์•ˆํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด https://github.com/pypa/warehouse ์—์„œ ํ† ๋ก ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค

์ œ์•ˆํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ดํ›„ ๋ฆด๋ฆฌ์Šค๋กœ ํ‘ธ์‹œ๋œ ์ด์œ ๋Š” #5571 -- PR์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

PIP ์„ค์น˜ ๋กœ๊ทธ์˜ ๊ฒฝ๊ณ ๋Š” ์ด URL์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์—ฌ๊ธฐ๋‚˜ ์–ธ๊ธ‰๋œ ๋‹ค๋ฅธ ํ‹ฐ์ผ“์— ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์ด๊ฒƒ์€ ํ›จ์”ฌ ๋” ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. PyPI๋ผ๊ณ  ํ•˜๋ฉด ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? PyPI ์ธํ„ฐํŽ˜์ด์Šค(์˜ˆ: Artifactory)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ํŠนํžˆ pypi.org๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์ด์ œ ๋ถ„๋ช…ํžˆ setuptools ( setup.py install ์‹คํ–‰์ด๋ผ๊ณ ๋„ ํ•จ)๋ฅผ ํ†ตํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜์™€ pip install ์‚ฌ์šฉ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์€ ์ด์ œ ํ”ผํด์— ์žˆ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข…์†์„ฑ ๋งํฌ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ์ด ์ƒํ™ฉ์— ์žˆ๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ๋Ÿฌ ์ƒํ˜ธ ์ข…์†์„ฑ ํŒจํ‚ค์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€๋Š” PyPA๊ฐ€ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‚ด๋ฆฐ ๊ฒฐ์ •์— ๋”ฐ๋ผ ์ด๊ฒƒ์„ ์ œ๊ฑฐํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Artifactory ์‚ฌ์šฉ์ž์—๊ฒŒ pip ์“ธ๋ชจ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ƒํ˜ธ ์˜์กด์ ์ธ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋Š” ๊ฐœ์ธ ์ €์žฅ์†Œ๊ฐ€ ์žˆ๋Š” ํšŒ์‚ฌ.

์ด ์ „์ฒด ์ด์•ผ๊ธฐ์—์„œ ๋‚ด๊ฐ€ ํ‹€๋ ธ๊ณ  ๋†“์นœ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๊ณ  ๋งํ•ด์ฃผ์„ธ์š”. ์ €๋Š” PEP 508์„ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ์ง€์ •ํ–ˆ์ง€๋งŒ ์ด ์ ์—์„œ ์‹ค์ œ๋กœ๋Š” ์•„๋ฌด๋Ÿฐ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ƒํ™ฉ์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋‚˜์˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

@wvxvw-traiana PR #5571์„ ๋†“์นœ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ ์ด์ „์— PR(ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค์—์„œ -- 18.0)์€ PEP508 ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์ง€์ •๋œ ์ข…์†์„ฑ ์„ค์น˜๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ›„ PR(์ด๋ฏธ ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฏ€๋กœ 18.1+์— ์žˆ์–ด์•ผ ํ•จ) ํ›„ pip๋Š” ์ข…์†๋œ ํŒจํ‚ค์ง€๊ฐ€ pypi.org์—์„œ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

pypi์˜ ํ•ญ๋ชฉ์— ์˜์กดํ•˜๋Š” ๊ฐœ์ธ ์ €์žฅ์†Œ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋ถ„๋ช…ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
๊ฐœ์ธ ์ €์žฅ์†Œ์˜ ํ•ญ๋ชฉ์— ์˜์กดํ•˜๋Š” pypi.org์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ์ธ ์ €์žฅ์†Œ์˜ ํ•ญ๋ชฉ์— ์˜์กดํ•˜๋Š” ๊ฐœ์ธ ์ €์žฅ์†Œ์˜ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@bstrdsmkr ๊ฐ™์€ ์ถœ์ฒ˜์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด pypi๊ฐ€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๊นŒ? ์ฆ‰

๋‹ค๋ฅธ ๊ฐœ์ธ ์ €์žฅ์†Œ์˜ ํ•ญ๋ชฉ์— ์˜์กดํ•˜๋Š” ๊ฐœ์ธ ์ €์žฅ์†Œ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ.

์ด์— ๋Œ€ํ•œ ์ด์œ ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ง์ ‘ URL ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒจํ‚ค์ง€๊ฐ€ ์ธํ„ฐ๋„ท ์–ด๋””์—์„œ๋‚˜ ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ์ง€๊ณ  ์žˆ๋‹ค๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ ์ดํ•ด์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ URL ๋งํฌ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ๋žŒ๋“ค์€ PyPI(ํŠนํžˆ ์ผ๋ฐ˜์ ์œผ๋กœ ํŒจํ‚ค์ง€ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹Œ PyPI)์—์„œ ์„ค์น˜ํ•˜๊ณ  ์—ฌ๊ธฐ์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์‹ ๋ขฐํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ˆ˜์˜ Python ์‚ฌ์šฉ์ž๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๋Š” PyPI ํŒจํ‚ค์ง€์˜ ์†์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด PyPI์—์„œ ์˜ค๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์ง์ ‘ URL ๋งํฌ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋งํฌ์— ์‚ฌ์šฉํ•˜๋Š” PyPI์—์„œ).
  3. ์ข…์†์„ฑ ๋งํฌ๋Š” setuptools ๊ด€๋ จ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋ฉฐ pip๊ฐ€ ์•„๋‹Œ setuptools์˜ ๋‚ด๋ถ€ ๊ธฐ๊ณ„์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง์ ‘ URL ๋งํฌ์™€ ๋‹ฌ๋ฆฌ ์šฐ๋ฆฌ๋Š” ๋งํฌ๊ฐ€ ์ˆ˜ํ–‰ ํ•˜๋Š” ์ž‘์—…์„ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋Š” ํ‘œ์ค€ ์ง์ ‘ URL ํ˜•์‹์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

setuptools(setup.py install ์‹คํ–‰์ด๋ผ๊ณ ๋„ ํ•จ)๋ฅผ ํ†ตํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜์™€ pip install ์‚ฌ์šฉ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์€ ์ด์ œ ํ”ผํด์— ์žˆ์Šต๋‹ˆ๋‹ค.

true์ธ ๊ฒฝ์šฐ setuptools๊ฐ€ ํ•ฉ์˜๋œ ํ‘œ์ค€์ธ ์ง์ ‘ URL ๋งํฌ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค๊ณผ ํ•จ๊ป˜ ๊ทธ๊ฒƒ์„ ๋†’์ด์‹ญ์‹œ์˜ค.

๋‹ค๋ฅธ ๊ฐœ์ธ ์ €์žฅ์†Œ์˜ ํ•ญ๋ชฉ์— ์˜์กดํ•˜๋Š” ๊ฐœ์ธ ์ €์žฅ์†Œ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ.

์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. PyPI๋Š” ๊ด€๋ จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. ํ•œํŽธ์œผ๋กœ๋Š” ์ด๊ฒƒ์ด ์ €์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ, ์ด "์ˆ˜์ •"์€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด... ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

echo "not-pypi 151.101.61.63" >> /etc/hosts
pip install --index-url not-pypi

๋‚ด ๋น„์ฆˆ๋‹ˆ์Šค๋Š” ์•„๋‹ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ํ‘œ๋ฉด ์ˆ˜์ค€์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. (๋‹ค๋ฅธ ๊ณต๊ฒฉ ๋ฒกํ„ฐ๋Š” setup.py์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์ฃผ์„์—์„œ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

์‚ฌ์šฉ์ž ๊ฐ€ https://github.com/pypa/pip/pull/4175#issuecomment -266305694๋ฅผ ์ฐธ์กฐ

@dpwrussell pypi.org๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐœ์ธ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฐœ์ธ ์ €์žฅ์†Œ๋Š” ๋ณ€๊ฒฝ ํ›„์— ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@wvxvw-traiana ์ง์ ‘ ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. pypi.org์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ๋•Œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋‹น์‹ ์—๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ† ๋ก ๊ณผ ๊ด€๋ จ์ด ์—†์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ์‹ค์ œ๋กœ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์—ฝ๋‹ˆ๋‹ค.

5726์€ IMO๊ฐ€ ์ด์— ํ•„์š”ํ•œ ๋งˆ์ง€๋ง‰ ๋น„ํŠธ์ธ PEP 508 URL์˜ ์‚ฌ์šฉ์„ ์ œ์•ˆํ•˜๋Š” ์–ธ์–ด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์š”์•ฝํ•˜์ž๋ฉด:

  • ์ข…์†์„ฑ ๋งํฌ๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ด์ œ pip 19.0์—์„œ ์ œ๊ฑฐ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
  • ์ด์— ๋Œ€ํ•œ ํ‘œ์ค€ ์ง€์› ๋Œ€์ฒด๋Š” PEP 508 URL ์ข…์†์„ฑ์ž…๋‹ˆ๋‹ค.
  • PyPI์—์„œ ์„ค์น˜ํ•  ๋•Œ ํŒจํ‚ค์ง€์— PEP 508 URL ์ข…์†์„ฑ์ด ์žˆ์œผ๋ฉด pip๊ฐ€ ์„ค์น˜๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

@pfmoore ๋Š” ์—ฌ๊ธฐ์—์„œ ์ด๋Ÿฌํ•œ ๊ฒฐ์ •์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/pypa/pip/issues/4187#issuecomment -415067034

@pradyunsg PEP 508 URL ์ข…์†์„ฑ์€ setup.py์˜ install_requires ์—์„œ ์–ธ์ œ ํ—ˆ์šฉ๋ฉ๋‹ˆ๊นŒ? ๋‚ ์งœ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋‚˜์š”?

pip์˜ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” 10์›”๋กœ ์˜ˆ์ •๋œ 18.1์ž…๋‹ˆ๋‹ค. https://pip.pypa.io/en/latest/development/release-process/์—์„œ pip์˜ 3๊ฐœ์›” ๋ฆด๋ฆฌ์Šค ์ฃผ๊ธฐ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

PEP 508 URL ์ข…์†์„ฑ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์ด ๋˜๊ธฐ ์ „์— https://github.com/pypa/wheel/issues/249 ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PEP 508 URL ์ข…์†์„ฑ์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์ด ๋˜๊ธฐ ์ „์— pypa/wheel#249 ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

pip 18.1 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

PEP 508 URL ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ข…์†์„ฑ์œผ๋กœ ์‚ฌ์šฉ๋˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ์กฐ์น˜๋กœ, PyPI์—์„œ๋„ ํ˜ธ์ŠคํŒ…๋˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€์— ํŒจํ‚ค์ง€๊ฐ€ ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ PyPI์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ pip๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ PyPI๋Š” ์ด๋Ÿฌํ•œ ์™ธ๋ถ€ URL ์ข…์†์„ฑ์ด ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ง์ ‘ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (#4187)

๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ URL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋งŒ PyPI URL์ด ์•„๋‹Œ ๊ฒฝ์šฐ pip๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์™„์ „ํžˆ ์ž˜๋ชป ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ URL ์ข…์†์„ฑ์€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

PyPI์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” @JarnoRFB ํŒจํ‚ค์ง€๋Š” URL ์ข…์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

PyPI์—์„œ ํ˜ธ์ŠคํŒ…๋˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€๋Š” URL ์ข…์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด github์—์„œ ์ง์ ‘ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด url ์ข…์†์„ฑ์ด ํ•ด๊ฒฐ๋˜๊ณ  ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์„ค์น˜์˜ ์˜ˆ:

pip install git+https://github.com/bstrdsmkr/some_package.git

๊ธฐ๋ณธ์ ์œผ๋กœ URL์—์„œ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ URL์— ์˜์กดํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด URL ๋ฐ ๋น„ URL ์ข…์†์„ฑ์„ ๋ชจ๋‘ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์†Œํ•œ ์ถ”๊ฐ€ ์‚ฌํ•ญ:

...URL์—์„œ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ URL์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

...URL(VCS ๋˜๋Š” ๊ธฐํƒ€)์ด๋‚˜ ๋กœ์ปฌ ํŒŒ์ผ ๋˜๋Š” PyPI๊ฐ€ ์•„๋‹Œ ํŒจํ‚ค์ง€ ์ธ๋ฑ์Šค์—์„œ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ...

์œ„์˜ ์„ค๋ช…์— ๋”ฐ๋ผ install_requires๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” pip ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ตœ์ข… ์ƒํƒœ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์œ„์˜ ํƒœ๊ทธ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ˜„์žฌ pip ๋ฌธ์„œ๋Š” ์—ฌ์ „ํžˆ dependency_links ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋งํ•˜๋Š” setuptools์˜ install_requires ๋ฌธ์„œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

๋ฌธ์„œ์— ์ง์ ‘ ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ PyPI๊ฐ€ ์•„๋‹Œ ํŒจํ‚ค์ง€๊ฐ€ URL์˜ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ด "ํœด์‹"์€ pip 18.0์—์„œ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

AFAIK, install_requires์˜ URL ์ข…์†์„ฑ์€ pip 18.1๋ถ€ํ„ฐ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

PEP 508 URL ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ข…์†์„ฑ์œผ๋กœ ์‚ฌ์šฉ๋˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜: ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

์–ด, ๋‚ด ๋ถ€๋ถ„์˜ ์˜คํƒ€ -- @pietrodn ์ด ๋ถ„๋ช…ํžˆ ๋งž์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ ์ ‘ํ•œ (๋‚˜์ฒ˜๋Ÿผ) --process-dependency-links๋กœ ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ์ง€ ๊ฒ์„ ๋จน์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ž‘์ง€๋งŒ ์„ฑ๊ณต์ ์ธ ์˜ˆ๋ฅผ ์—ฌ๊ธฐ์— ๋‚จ๊ธฐ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ์›Œํฌํ”Œ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ์‚ฌ์šฉ์ž๋Š” ์ด์ œ GitHub ๋˜๋Š” ๋กœ์ปฌ ์†Œ์Šค(PyPI ์•„๋‹˜)์—์„œ pip ์„ค์น˜ํ•˜๊ฑฐ๋‚˜, โ€‹โ€‹requirements.txt๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜, โ€‹โ€‹python setup.py install๋กœ pip ์„ค์น˜ํ•˜๊ณ , pip๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Travis-CI์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „ 18 ์ด์ƒ์ด๋ฏ€๋กœ ๋งŽ์€ ๊ธฐ๋ฐ˜์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์œ ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

requirements.txt ํŒŒ์ผ์—์„œ ์‚ฌ๋žŒ๋“ค์ด ํŒจํ‚ค์ง€ "foo"์˜ GitHub dev ๋ถ„๊ธฐ์— ์˜์กดํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

scipy>=0.17
matplotlib>=2.0
foo @ git+https://github.com/foo-organization/foo@dev#egg=foo-9999

setup.py ํŒŒ์ผ์—์„œ:

import os, sys
from setuptools import setup, find_packages

def read_requirements():
    """Parse requirements from requirements.txt."""
    reqs_path = os.path.join('.', 'requirements.txt')
    with open(reqs_path, 'r') as f:
        requirements = [line.rstrip() for line in f]
    return requirements

setup(
    ..., # Other stuff here
    install_requires=read_requirements(),
    )

install_requires ์™€ requirements.txt ํ•ฉ์น˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ๋„ ์žˆ๊ณ , ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์˜ ๊ฒฝ์šฐ์—๋Š” ๋™์˜ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์šฉ์œผ๋กœ๋Š” ์ž˜ ๋งž๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„, ๊น”๋”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํŒจํ‚ค์ง€ "A"์™€ "B"๊ฐ€ ๋ชจ๋‘ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ํŒจํ‚ค์ง€ "A"๊ฐ€ "B"๋ฅผ ์ข…์†์„ฑ์œผ๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒฝ์šฐ "A"๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‹ค์ œ๋กœ "B"์— ๋Œ€ํ•œ requirements.txt๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๋ณดํ†ต์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค) - ๋งž์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋˜ํ•œ ๊ทธ ์ž์ฒด๊ฐ€ ๊ทธ ์„ค์น˜ ์ˆ˜๋Š” ์–ด๋–ค ํ• ์˜ต์…˜์„ ๋ฌด์‹œ ์˜๋ฏธ setuptools์— ์˜ํ•ด ์ด๋ฃจ์–ด ์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ข€ ๋‚˜์œ install_requires ์•„์นจ์„ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ์ •๋ณด๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒฝ์šฐ ๋‚˜๋„ ๋ชฐ๋ผ ...

๋‚˜๋Š” ๋˜ํ•œ ์˜ค๋Š˜ ์•„์นจ์— install_requires ์ž์ฒด๊ฐ€ setuptools์— ์˜ํ•ด ์ˆ˜ํ–‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์†Œ ๋‚˜๋นด๋‹ค๋Š” ๊ฒƒ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  pip ์˜ต์…˜์ด ๋ฌด์‹œ๋˜์—ˆ์ง€๋งŒ ํ•ด๋‹น ์ •๋ณด๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒƒ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค...

install_requires ์™€ setup_requires ํ˜ผ๋™ํ•˜๊ณ  ๊ณ„์‹ญ๋‹ˆ๋‹ค.

์•„, ๊น”๋”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํŒจํ‚ค์ง€ "A"์™€ "B"๊ฐ€ ๋ชจ๋‘ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ํŒจํ‚ค์ง€ "A"๊ฐ€ "B"๋ฅผ ์ข…์†์„ฑ์œผ๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒฝ์šฐ "A"๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‹ค์ œ๋กœ "B"์— ๋Œ€ํ•œ requirements.txt๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๋ณดํ†ต์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค) - ๋งž์Šต๋‹ˆ๊นŒ?

@stevebrasier ์˜ˆ, B๊ฐ€ ์•„๋‹Œ A์— ๋‹ค๋ฅธ ํ•„์ˆ˜ ํŒจํ‚ค์ง€์˜ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ๊ณ ์ •ํ•œ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๋กœ๊ฐ€ ๋„ˆ๋ฌด ์งง์•˜๋‹ค๋Š” ์ ์„ ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜์กด์„ฑ ๋งํฌ๊ฐ€ ์˜ค๋žซ๋™์•ˆ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ด๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” PEP 508 URL์€ 18.1๊นŒ์ง€ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ข…์†์„ฑ ๋งํฌ์—์„œ URL ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐ 3๊ฐœ์›”์ด๋ผ๋Š” ๊ธด ๊ธฐ๊ฐ„์ด ์žˆ์—ˆ๊ณ  ์ด๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋งค์šฐ ์งง์€ ์‹œ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

@rgerkin ์•ˆ๋…•ํ•˜์„ธ์š”, ๊ท€ํ•˜์˜ ์ง€์‹œ๋ฅผ ๋”ฐ๋ฅด๋ ค ํ•˜์ง€๋งŒ ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

PACKAGE@ git+ ssh://[email protected] :OWNER/PACKAGE๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. git@BRANCH
https://pypi.org/simple/PACKAGE/ ์ฝ๊ธฐ
'PACKAGE'์— ๋Œ€ํ•œ ์ƒ‰์ธ ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ฒ ์ž๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?)
๋ชจ๋“  ํŒจํ‚ค์ง€์˜ ์ธ๋ฑ์Šค ๊ฒ€์ƒ‰(์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Œ)
https://pypi.org/simple/ ์ฝ๊ธฐ

ํŒจํ‚ค์ง€@ git+ ssh://[email protected] : ์†Œ์œ ์ž/ํŒจํ‚ค์ง€. git@BRANCH , ์ด๊ฒƒ์€ install_requires์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์™œ ์œ„์˜ ๋‚ด์šฉ์„ ๋ฐ›๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๊นŒ?

@KevinMars git_ssh, bitbucket, a.git ์ ‘๋ฏธ์‚ฌ, ๋ช…๋ช…๋œ ๋ถ„๊ธฐ ๋ฐ ๋ฒ„์ „ ํƒœ๊ทธ ์‚ฌ์šฉ์„ ํฌํ•จํ•˜์—ฌ ์ œ ์˜ˆ์ œ์™€ ๊ท€ํ•˜๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ์‚ฌ์ด์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์ด pip๊ฐ€ URL ๋Œ€์‹  PyPI์—์„œ ๊ฒ€์ƒ‰ํ•˜๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฒ„์ „์˜ pip๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ฐพ์€ ๊ฒƒ์ด ๋ฌด์—‡์ธ๊ฐ€์ฃผ์˜๋กœ : ์‚ฌ์šฉ setup.py ํ•จ๊ป˜ ํŒจํ‚ค์ง€ ์„ค์น˜ python setup.py install ์—ฌ์ „ํžˆ ์™ธ๋ถ€ ์ข…์†์„ฑ์˜ ์„ ์–ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค dependency_links .

setup.py ํŒŒ์ผ์—์„œ:

import os, sys
from setuptools import setup, find_packages

def read_requirements():
    """Parse requirements from requirements.txt."""
    reqs_path = os.path.join('.', 'requirements.txt')
    with open(reqs_path, 'r') as f:
        requirements = [line.rstrip() for line in f]
    return requirements

setup(
    ..., # Other stuff here
    install_requires=read_requirements(),
    )

@rgerkin ์ด ์†”๋ฃจ์…˜์„ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ pbr์„ ์‚ฌ์šฉํ•˜์—ฌ Python ํŒจํ‚ค์ง€๋ฅผ ์„ค์ •ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ด๊ฒƒ์„ pbr์— ๋งž๊ฒŒ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@KevinMars ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ • ์‚ฌํ•ญ์„ ํŒŒ์•…ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? SSH๋ฅผ ํ†ตํ•ด ๊ฐœ์ธ bitbucket ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ํŠน์ • ๋ถ„๊ธฐ๋ฅผ ์š”๊ตฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ --process-dependency-links๊ฐ€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ•˜๋Š” ๋ชจ๋“  ์ผ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋์—†๋Š” ํ† ๋ก ๊ณผ ๋ฏธ๋กœ ๊ฐ™์€ ๋ฌธ์ œ ์ข…๊ฒฐ ๋ฐ ๋ฆฌ๋””๋ ‰์…˜์—์„œ ๊ฒฐ์ •์„ ์ •๋‹นํ™”ํ•˜๋Š” ๊ฒƒ์ด ์„ ํƒํ•œ ์†”๋ฃจ์…˜์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ์ด ์˜ต์…˜์„ ๋– ๋‚˜๋ฉด ์•„๋ฌด๋„ ํ•ด๋ฅผ ๋ผ์น˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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