--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.
...
๋์. ์์กด์ฑ ๋งํฌ์ ๋ํ pip์ ํ์ฌ ๋์์ ์ ๋ง ์ง์ฆ๋ฉ๋๋ค.
[#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์ ๋ช ์ค์ ์ถ๊ฐํ๋ ๊ฒ ์ด์์ ํ์๋ก ํ์ง ์๋ ๋์์ด ํ์ํฉ๋๋ค.
๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๊ฒ์ ์ ๊ฑฐํ๋ ๊ทผ๋ณธ์ ์ธ ๊ฒฐ์ ์ ์ดํดํ์ง ๋ชปํ๊ณ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋์ ๊ดํ๊ณผ ๋ถ์์ผ๋ก ์ด์ด์ง ์ ์๋์ง ์ ์ ์์ง๋ง ๋ด๋ถ ์ฌ์ฉ์ ์ํด ์ ์งํ๋ ํ ์ฃผ์ ๋ฌธ์ ๋ ์๋๋๋ค.
@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์ ๋ํ ์์์ ์ ๋ขฐ๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ๋ด ์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
dependency_links
๋ฉํ๋ฐ์ดํฐ๊ฐ ์๋ ํจํค์ง๊ฐ PyPI์ ์์ต๋๊น?dependency_links
๊ฐ ์๋ ํ๋ก์ ํธ์ ์
๋ก๋๋ฅผ ๊ฑฐ๋ถํ๋๋ก PyPI๋ฅผ ์์ ํ ์ ์์ต๋๊น(๋๋ ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํฉ๋๊น)?pip ์ฌ์ฉ์๊ฐ ์
์ฑ dependency_links
PyPI ํจํค์ง์ ๋ฌผ๋ฆด ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ์ ํ ์ ์๋ค๋ฉด ๋ ๊ฑฑ์ ํ ๊ฒ์
๋๋ค. ์ฌ์ฉ์ ์ง์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ์ ํํ ์ฌ์ฉ์๋ ์ด๋ฅผ ์ ๋ขฐํ ์ง ์ฌ๋ถ๋ฅผ ์ค์ค๋ก ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. (๋๋ ๊ทธ๋์๋ ํ๋๊ทธ๋ฅผ ์ ์งํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์ด๊ฒ์ ์ ์ฌ์ ์ผ๋ก ์๊ฒฉ ์
์ฉ์ด๋ฉฐ ํญ์ ๋ช
์์ ์ผ๋ก ์ตํธ์ธํด์ผ ํฉ๋๋ค).
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค.
--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๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ ํ ํฐ ์๋ฆฌ๋ฅผ ๋ด์ผ ํ๊ณ ์ฌ์ ํ ์ตํธ์ธ ์ํ์ฌ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค.
์ด์ ํ์ดํํ๋๋ฐ ์ ๋ณด๋์ด์. ์ด์ @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๊ฐ ํน๋ณํ ๊ฒฝ์ฐ์ ๋๊น? ์ฆ
๋ค๋ฅธ ๊ฐ์ธ ์ ์ฅ์์ ํญ๋ชฉ์ ์์กดํ๋ ๊ฐ์ธ ์ ์ฅ์์์ ํจํค์ง๋ฅผ ์ค์นํ๋ ๊ฒฝ์ฐ.
์ด์ ๋ํ ์ด์ ์ ๋ํ ์ถ๊ฐ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
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์์ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ์๋ค๊ณ ์๊ฐํ ๋ ๋ค๋ฅธ ์ฌ๋์ด ๋น์ ์๊ฒ ๊ทธ๋ ๊ฒ ํ์ง ๋ชปํ๋๋ก ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
ํ์ฌ ํ ๋ก ๊ณผ ๊ด๋ จ์ด ์์ง๋ง ์ด์ ๋ํ ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ๋ฅผ ์ค์ ๋ก ์ ๋ฐ์ดํธํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ค์ ์ฝ๋๋ค.
์๊ฒ ์ต๋๋ค. ์์ฝํ์๋ฉด:
@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๊ฐ ๋ ์ด์ ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ๊ฐ ํ๋ ๋ชจ๋ ์ผ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋์๋ ํ ๋ก ๊ณผ ๋ฏธ๋ก ๊ฐ์ ๋ฌธ์ ์ข ๊ฒฐ ๋ฐ ๋ฆฌ๋๋ ์ ์์ ๊ฒฐ์ ์ ์ ๋นํํ๋ ๊ฒ์ด ์ ํํ ์๋ฃจ์ ์ด์ง๋ง ์ฌ์ ํ ์ด ์ต์ ์ ๋ ๋๋ฉด ์๋ฌด๋ ํด๋ฅผ ๋ผ์น์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด์ ๋ํ ์ ์ ํ ์ํฌํ๋ก๋ ๋ฌด์์ ๋๊น?
๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. Github์์ ํฌํฌํฉ๋๋ค. ๊ธฐ๋ฅ์ ๊ณง ๋ณํฉ๋์ง ์์ ์์ ์ด๋ฏ๋ก PyPi ๋์ Github ํฌํฌ๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ํ ๋๊ตฌ๊ฐ ์์ต๋๋ค.
์ด์ ๋ชจ๋ ์ฌ์ฉ์๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ ํ ๋ฒ ์ ๊ฑฐ๋ ํ๋๊ทธ์ธ pip๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ตฌ๋ฅผ ์ค์นํ ๋ --process-dependency-links๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๊น?
๋ด๊ฐ ๋์น๊ณ ์๋ ๋ช ๊ฐ์ง ์ต์ ์ด setup.py์ ์์ต๋๊น? ์๋๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์? ์ด๋ฅผ ์ํํ๋ ์ ์ผํ ์คํ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ๋ถ๊ธฐ๋ pypi ํจํค์ง๋ฅผ ํธ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์จ๋ pull ์์ฒญ์ด ๋ณํฉ๋๋ฉด ์ฌ์ฉ์์ ํผ๋์ ๊ฐ์ค์ํฌ ๊ฒ์ ๋๋ค.