Pipenv: [์งˆ๋ฌธ] setup.py์™€ ์–ด๋–ป๊ฒŒ ํ†ตํ•ฉํ•˜๋‚˜์š”?

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

requirements.txt ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from pip.req import parse_requirements
requirements = [str(r.req) for r in
                parse_requirements('requirements.txt', session=False)]
test_requirements = [str(r.req) for r in
                     parse_requirements('requirements-test.txt', session=False)]

Pipfile์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์ฒซ์งธ, ๋ฉด์ฑ… ์กฐํ•ญ: ์ œ ์ „๋ฌธ ์ง€์‹์€ ์ฃผ๋กœ lib ํŒจํ‚ค์ง€์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ํฌ์ธํŠธ๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ‹€๋ฆด ๊ถŒ๋ฆฌ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค!
๋˜ํ•œ ์ด๊ฒƒ์€ ๋‚ด ๋จธ๋ฆฌ๋ฅผ ๋ช‡ ๋ฒˆ ๊ธ๊ฒŒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ๋ฆฌ๋ทฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ž, ์ด์ œ ์—ฌ๊ธฐ๋กœ ๊ฐ‘์‹œ๋‹ค.

@elgertam ์ด๋ผ๋Š” ๋ฌธ์žฅ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

[...] Pipfile์„ ์‚ฌ์šฉํ•˜๋ฉด install_requires๊ฐ€ Pipfile์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. numpy๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ pipenv install numpy ๋ฐ ์ƒˆ ํ•ญ๋ชฉ์ด ๋‚ด Pipfile์˜ [ํŒจํ‚ค์ง€] ๊ทธ๋ฃน [...]์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

numpy ๋ฅผ ํ™˜๊ฒฝ์— ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ์•ฑ์˜ ์ข…์†์„ฑ์— numpy ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ„์† ์ฝ์œผ์‹œ๋ฉด ์ œ ๋ง์ด ๋ฌด์Šจ ๋œป์ธ์ง€ ์•Œ๊ฒŒ ๋˜์‹ค ๊ฒ๋‹ˆ๋‹ค.

์ฆ‰, pip freeze > requirements.txt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์ƒ์„ฑํ–ˆ๋˜ requirements.txt์™€ ์‚ฌ์šฉ๋ฒ•์ด ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋†€๋ž๊ฒŒ๋„, ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋‹น์‹ ์˜ ์‚ฌ์šฉ๋ฒ•์€ ๊ทธ๋ ‡๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  • ์ด์ „ ์ž‘์—… ํ๋ฆ„: pip install stuff -> pip freeze > requirements.txt -> requirements.txt install_requires ํ”ผ๋“œ
  • ์ƒˆ๋กœ์šด(์‹œ๋„ํ•œ) ์›Œํฌํ”Œ๋กœ: pipenv install stuff -> Pipfile ์ž๋™ ์—…๋ฐ์ดํŠธ๋จ -> Pipfile ๋กœ install_requires ์— ํ”ผ๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์˜๋„ํ•œ ์•„์ด๋””์–ด: install_requires -> pipenv install -> ํ™˜๊ฒฝ ๋ฐ Pipfile.lock ์— ํ•ญ๋ชฉ ์ถ”๊ฐ€๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜๋„ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ์•ฑ์„ ์„ค์น˜ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๋ช…์‹œํ•œ Pipfile ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
@isobit์— ์˜ํ•ด ์—ฐ๊ฒฐ๋œ requests Pipfile ๊ฐ™์€ ๊ฒƒ.

๋˜๋Š” ์˜ˆ:

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[dev-packages]
pytest = ">=2.8.0"
tox = "*"

[packages]
"-e ." = "*"

Pipfile ๋Š” ํŒจํ‚ค์ง€์˜ ์ข…์†์„ฑ์ด ์•„๋‹ˆ๋ผ ํ™˜๊ฒฝ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ์œ„์˜ Pipfile ๋Š” ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“œ์˜ ๋กœ์ปฌ ํŒจํ‚ค์ง€์ธ ์„ค์น˜ํ•˜๋ ค๋Š” ํ•ญ๋ชฉ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ง€๊ธˆ์€ ๋ชจ๋‘ ๋‹จ์ผ ํŒจํ‚ค์ง€๋กœ ๊ตฌ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ "์“ธ๋ชจ์—†๊ฒŒ" ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ requests[security] ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์„ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์•ฑ์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ์ข…์†์„ฑ์€ ์•„๋‹™๋‹ˆ๋‹ค. pipenv install requests[security] ํ•˜๊ณ  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[dev-packages]
pytest = ">=2.8.0"
tox = "*"

[packages]
"-e ." = "*"
requests = { extras = ['security'] }

๊ทธ๋ฆฌ๊ณ  ์งœ์ž”, ์—ฌ๊ธฐ์— ์ถ”์ƒ์  ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ ๊ฐ„์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. gunicorn ๋˜๋Š” ํ™˜๊ฒฝ์— ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๊ฒƒ์„ ์„ค์น˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด์ง€๋งŒ ์•ฑ ์ž์ฒด์˜ ์ผ๋ถ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

@vphilippon์—์„œ ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Pipfile์˜ [ํŒจํ‚ค์ง€]๊ฐ€ install_requires ๋˜๋Š” tests_require์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋„ˆ๋ฌด ์ œํ•œ์ ์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์ถฉ๋ถ„ํžˆ ์„ค๋ช…ํ–ˆ๋‹ค๋ฉด, ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์ด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
install_requires ์— ์ข…์†์„ฑ์„ ๋„ฃ๊ณ  Pipfile ์— ํŒจํ‚ค์ง€๋ฅผ ๋„ฃ์€ ๋‹ค์Œ ์žฌํ˜„์„ฑ์„ ์œ„ํ•ด Pipfile.lock ์™€ ํ•จ๊ป˜ ํ™˜๊ฒฝ์„ ์–ป์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ข…์†์„ฑ).

test_require ์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์ด ๋ชจ๋“  ๊ฒƒ์— ๋งž๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Œ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. IIRC, setuptools ํŠน์ • ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ถ”์ƒ์ ์ธ ์ข…์†์„ฑ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ pipenv ์—์„œ ํ•ด๊ฒฐํ•˜๊ณ  ์„ค์น˜ํ•œ ๋‹ค์Œ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด pipenv install --dev ๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ €๋Š” ๊ทธ๊ฒƒ์ด ์˜ณ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ƒ๊ฐ์ด๋‚˜ ์˜๊ฒฌ์ด ์—†์œผ๋ฉฐ ์ด์— ๋Œ€ํ•œ ๊ทผ๊ฑฐ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ๋“  ์ดํ•ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

์•„๋ž˜ ์ฝ”๋“œ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ Pipfile์„ ๋กœ๋“œํ•˜๊ณ  pip ํ˜ธํ™˜ ๋ชฉ๋ก์— ์ข…์†์„ฑ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

from pipenv.project import Project
from pipenv.utils import convert_deps_to_pip

pfile = Project(chdir=False).parsed_pipfile
requirements = convert_deps_to_pip(pfile['packages'], r=False)
test_requirements = convert_deps_to_pip(pfile['dev-packages'], r=False)

์ถ”๊ฐ€ ์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š” :)

์œ„์˜ ๋‚ด์šฉ์€ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. setup.py install (๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ)์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ๊ฐ€์ƒ ํ™˜๊ฒฝ์— ์„ค์น˜๋œ Pipenv์— ๋”ฐ๋ผ setup.py ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์œ ์ผํ•œ ํ•ด๊ฒฐ์ฑ…์€ Pipenv๋ฅผ ํ”„๋กœ์ ํŠธ๋กœ ๋ฒค๋”ํ™”ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Š” ์ด์ƒ์ ์ด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜๋Š” from pipenv... ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— setup.py๋ฅผ ํ•ดํ‚นํ•˜์—ฌ Pipenv๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ. ๋ˆ„๊ตฌ๋“ ์ง€ ์ด๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ์•„์ด๋””์–ด๋‚˜ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

Python ์ปค๋ฎค๋‹ˆํ‹ฐ(PyPA ๋“ฑ)์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ~๊ดด๋กญํž˜~ ์ œ์•ˆํ•˜์—ฌ Pipenv๋ฅผ ํ–ฅํ›„ Python ๋ฆด๋ฆฌ์Šค์— ๊ณต์‹์ ์œผ๋กœ ํฌํ•จ๋œ ๋„๊ตฌ๋กœ ์ถ•๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๐Ÿ˜„

setup_requires ์— pipenv ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋ ๊นŒ์š”? ๋ถˆํ–‰ํ•ด ๋ณด์ด๋Š” install_requires ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

@kennethreitz "์ด๊ฒƒ"์ด ๋ฌด์Šจ ๋œป์ธ๊ฐ€์š”? setup.py, @nateprewitt ์†”๋ฃจ์…˜ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ๋‘ ์ œ์•ˆ๊ณผ์˜ ํ†ตํ•ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋Š” pipenv๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

pipenv๋Š” ์„ค์น˜์— ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ์ด๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋Š” ์•„๋‹ˆ๋ฏ€๋กœ setup.py์— ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Kenneth๊ฐ€ ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒƒ์€ setup.py์—์„œ pipenv๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์€ cli ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๊ณ  ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2017๋…„ 10์›” 17์ผ ์˜ค์ „ 9์‹œ 37๋ถ„์— Iddan Ahhronson [email protected] ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋Š” pipenv๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

๊ทธ๋ž˜์„œ setup.py์—์„œ @nateprewitt ์˜ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@iddan : Pipenv ๋ฒ„์ „์„ ๋‚ด ํ”„๋กœ์ ํŠธ ๊ณจ๊ฒฉ์œผ๋กœ ๊ณต๊ธ‰ํ•˜์—ฌ Pipenv ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/elgertam/cookiecutter-pypackage/blob/master/%7B%7Bcookiecutter.project_slug%7D %7D/setup.py). ์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์ง€๋งŒ setup.py ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ํ…Œ์ŠคํŠธํ•  ๊ธฐํšŒ๊ฐ€ ๋งŽ์•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

setup.py๋ฅผ ๋กœ๋“œํ•  ๋•Œ CLI๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ( @nateprewitt ์˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ)๋Š” ์ƒ๋‹นํžˆ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

pip ์— Pipfile ํ˜•์‹์„ ์ดํ•ดํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ๋‚ด๋ถ€ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ์ด ํ•ดํ‚น์ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@iddan , ๊ทธ ์ฝ”๋“œ๋Š” ์˜ค๋กœ์ง€ Pipfiles ์ข…์†์„ฑ์„ pip๊ฐ€ ์ฝ์„ requirements.txt ์Šคํƒ€์ผ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Kenneth๊ฐ€ ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Pipenv๋Š” setup.py์™€ ๊ฐ™์€ ๋ฐฐํฌ์šฉ์ด ์•„๋‹Œ ํ™˜๊ฒฝ ๊ด€๋ฆฌ ๋ฐ ๋ฐฐํฌ ๋„๊ตฌ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Pipfile์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ๋ฌธ์„œํ™”ํ•˜๊ณ  ์„ค์น˜ ์ง€์นจ์„ ์œ„ํ•ด pipenv.org์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ pip๋ฅผ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์‹ญ์‹œ์˜ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ Python ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ๋งˆ๋‹ค pip๋ฅผ ์„ค์น˜ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  pipenv๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์„ ๋•Œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•˜์‹ญ๋‹ˆ๊นŒ?

@nateprewitt , ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ( pip ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด) ์ข…์†์„ฑ ๋ชฉ๋ก์˜ ๋ณต์‚ฌ๋ณธ์„ setup.py ๋˜๋Š” requirements.txt ์— ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ? ๋‚ด Pipfile์„ ๋‹จ์ผ ์ •๋ณด ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ์‹ฌํ•˜๊ฒŒ ์ฐฉ๊ฐํ•˜์ง€ ์•Š๋Š” ํ•œ, https://github.com/kennethreitz/pipenv/issues/209#issuecomment -278185133์˜ ์ฝ”๋“œ๋Š” ํœ (=์ด์ง„ dist)์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ sdist (= ์†Œ์Šค dist)๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

sdist๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด setup.py ๊ฐ€ ์‹ค์ œ๋กœ ์„ค์น˜ ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ pipenv ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์ด๊ฑฐ ์•ผ. @tuukkamustonen , ๋‚ด ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” sdist์ž…๋‹ˆ๋‹ค. pip install ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ํŒจํ‚ค์ง€ ์‚ฌ์šฉ์ž๊ฐ€ pipenv ๋ฅผ ์„ค์น˜ํ•˜๋„๋ก ์š”๊ตฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— $ setup.py ์™ธ๋ถ€์—์„œ $ install_requires ๋ฅผ ํŒŒ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. setup.py (์ฆ‰, ์ˆ˜๋™์œผ๋กœ ๋˜๋Š” ๋นŒ๋“œ์˜ ์ผ๋ถ€๋กœ)?

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ๊ณ  ์žˆ๋‹ค๋ฉด Kenneth์™€ ๋‹ค๋ฅธ ์œ ์ง€ ๊ด€๋ฆฌ์ž๋Š” ์šฐ๋ฆฌ๊ฐ€ pytest ๋˜๋Š” ์ผ๋ฐ˜ ํŒจํ‚ค์ง€ ์ข…์†์„ฑ์ฒ˜๋Ÿผ Pipenv ๋ฅผ ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” pip Pipenv ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ฆ‰, pip ๋Š” Python์ด ์„ค์น˜๋  ๋•Œ ๋˜๋Š” virtualenv ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Kenneth๊ฐ€ "์ด ์ผ์„ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค."

์ฆ‰, @isobit ์€ Pipfile ๊ฐ€ ๋‹จ์ผ ์ •๋ณด ์†Œ์Šค์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ œ ์ƒ๊ฐ์„ ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. Pipfile์„ ์„ ํ˜ธํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๊ฒƒ๋„ ์žˆ์Œ). ์ฒซ์งธ, ๋นŒ๋“œ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด Pipfile์— ์˜์กดํ•˜๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด requirements.txt์— ์˜์กดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋‘˜์งธ, ๊ธฐ์—ฌ์ž๊ฐ€ Pipfile ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งน๋ชฉ์ ์œผ๋กœ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค python setup.py install ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์ขŒ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pipenv ๋˜๋Š” Pipfile ์ธ์‹ pip๊ฐ€ ์•„์ง ํ‘œ์ค€ Python ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ฉฐ Pipenv๊ฐ€ ์‹ค์ œ๋กœ Pipfile์— ๋Œ€ํ•œ ์ฐธ์กฐ ๊ตฌํ˜„์ž„์„ ๊ณ ๋ คํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

1) ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ์—์„œ ํ”„๋กœ์ ํŠธ๊ฐ€ Pipenv ์— ์˜์กดํ•œ๋‹ค๊ณ  ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค. setup.py #$ ์—์„œ Pipenv ์— ๊ณ„์† ์˜์กดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Python ํ™˜๊ฒฝ์— Pipenv ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, ์ฝ”๋“œ ๊ธฐ์—ฌ์ž๋Š” setup.py ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด Pipenv ๋ฅผ virtualenv ์— ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
2) Pipfile ์— ๋”ฐ๋ผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” requirements.txt ์— ์—ฌ์ „ํžˆ setup.py ๊ฐ€ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ pip ๋ฐ setuptools ์™€ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ requirements.txt ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ๊ฐ€๋Šฅํ•œ ๋ณ€ํ˜•์€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด ๋นŒ๋“œ ์‹œ requirements.txt ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
3) Pipenv ๋ฒ„์ „์„ ํ”„๋กœ์ ํŠธ์— ๊ณต๊ธ‰ํ•˜๊ณ  setup.py from _vendor.pipenv.project import Project... ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ํ•œ ๊ฐ€์ง€ ๋ณ€ํ˜•์€ ์ „์—ญ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์‹คํŒจํ•  ๋•Œ ๊ณต๊ธ‰์—…์ฒด ๋ฒ„์ „์—์„œ๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
4) ์—ฌ๊ธฐ์— ์ œ์‹œ๋˜์ง€ ์•Š๊ณ  ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ๋งŒํผ ๋˜‘๋˜‘ํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ์˜ต์…˜.

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ (3)(https://github.com/kennethreitz/pipenv/issues/209#issuecomment-300550425 ์ฐธ์กฐ)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Pipenv๋Š” ๋ถ„๋ช…ํžˆ Pipfile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” virtualenv๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๊ณ  ๋ฐ˜๋“œ์‹œ Pipfile ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Pipenv ์ฝ”๋“œ์— ์ง์ ‘ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ฝ์€ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ž˜๋ชป ๋งํ•˜๊ฑฐ๋‚˜ ์‹ฌ๊ฐํ•œ ๋ง์„ ํ•œ ๊ฒฝ์šฐ @nateprewitt๋กœ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ requirements.txt ์˜ ์›๋ž˜ ์˜ค์šฉ(IMO)์—์„œ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. pipenv ์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‚˜๋Š” Donald Stufft์˜ setup.py vs requirements.txt์˜ ๋ฉ‹์ง„ ๊ธฐ์‚ฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
https://caremad.io/posts/2013/07/setup-vs-requirement/

TL;DR(ํ•˜์ง€๋งŒ ์ •๋ง ์ฝ์–ด์•ผ ํ•˜์ง€๋งŒ): setup.py ์˜ install_requires ๋Š” ํŒจํ‚ค์ง€์˜ ์š”๊ตฌ ์‚ฌํ•ญ(์ข…์†์„ฑ)์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. requirements.txt (์—ฌ๊ธฐ์„œ๋Š” Pipfile / Pipfile.lock ์ฝค๋ณด๋กœ ๋Œ€์ฒด๋จ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๊ฒƒ์„ ์ถฉ์กฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ •ํ™•ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋‚˜์—ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด setup.py ์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
requirements.txt install_requires ๋ฅผ ์ฑ„์šฐ๋Š” ๊ฒƒ์€ ๋’ค๋กœ ๊ฐ€๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

setup.py ์˜ install_requires =/= requirements.txt (๋˜๋Š” Pipfile / Pipfile.lock ).
Pipfile (๋˜๋Š” ์˜คํžˆ๋ ค Pipfile.lock )๋Š” ์•ฑ ํ™˜๊ฒฝ์— ์„ค์น˜ํ•  ํŒจํ‚ค์ง€์˜ ๋‹จ์ผ ์†Œ์Šค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
setup.py ์˜ install_requires ๋Š” ์œ ํšจํ•œ Pipfile.lock ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฐ์€ ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ ๋‹ต์žฅ์„ ์•„์ฃผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค, Vincent, ๊ทธ๋ฆฌ๊ณ  Pipfile.lock ๊ฐ€ requirements.txt #$ ์— ๋Œ€ํ•œ ์™„์ „ํ•œ(๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์€) ๋Œ€์ฒดํ’ˆ์ด๋ผ๋Š” ๊ฒƒ์— ์ ˆ๋Œ€์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ ๋ช‡ ๊ฐœ์›” ๋™์•ˆ Pipenv๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฐ๊ณผ Pipfile ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด install_requires ๊ฐ€ Pipfile ์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. numpy ๊ฐ€ ํ•„์š”ํ•˜๋ฉด pipenv install numpy ๋ฐ ์ƒˆ ํ•ญ๋ชฉ์ด ๋‚ด Pipfile์˜ [packages] ๊ทธ๋ฃน์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. numpy = "*" . ์ฆ‰, pip freeze > requirements.txt ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์ƒ์„ฑํ–ˆ๋˜ requirements.txt ์™€ ์‚ฌ์šฉ๋ฒ•์ด ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ Pipenv๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋…ํŠนํ•œ ๋ฐฉ์‹์ผ ๋ฟ์ด๋ฉฐ ๊ทธ๋ ˆ์ธ์— ๋ฐ˜๋Œ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋˜ํ•œ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด๋ถ€์˜ .venv/ ์— virtualenv๋ฅผ ์„ค์น˜ํ•˜๋ฏ€๋กœ ์ €๋Š” ๋ถˆ๋Ÿ‰ Pythonista์ž…๋‹ˆ๋‹ค). setup.py ์™€ Pipfile ์‚ฌ์ด์— ๋ฒฝ์ด ์žˆ๋‹ค๋Š” Python ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ทœ์น™์„ ์‰ฝ๊ฒŒ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ | Pipfile.lock | requirements.txt .

@vphilippon, ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@vphilippon ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๊ฑฐ๊พธ๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ˜๋Œ€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. $์˜ -e . ์™€ ๊ด€๋ จํ•˜์—ฌ Donald๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Pipfile์—์„œ requirements.txt install_requires ์˜ ์ถ”์ƒ deps๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. requirements.txt . ์ด๋ฏธ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ(#339) ์•„๋ฌด๋ฐ๋„ ๊ฐ€์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด๋ฏธ Pipfile ๊ตฌ๋ฌธ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐฉ๊ธˆ ์š”์ฒญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Pipfile ์ด ํŒจํ‚ค์ง€ ์„น์…˜์—์„œ "e1839a8" = {path = ".", editable = true, extras=["socks"]} ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ๊ฒƒ์ด Pipfile ์˜ˆ์ œ ์—์„œ ๋ถ„๋ช…ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฌธ์„œ๋Š” ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, ๋ฉด์ฑ… ์กฐํ•ญ: ์ œ ์ „๋ฌธ ์ง€์‹์€ ์ฃผ๋กœ lib ํŒจํ‚ค์ง€์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ํฌ์ธํŠธ๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ‹€๋ฆด ๊ถŒ๋ฆฌ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค!
๋˜ํ•œ ์ด๊ฒƒ์€ ๋‚ด ๋จธ๋ฆฌ๋ฅผ ๋ช‡ ๋ฒˆ ๊ธ๊ฒŒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ๋ฆฌ๋ทฐ๋ฅผ ์ •๋ง๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ž, ์ด์ œ ์—ฌ๊ธฐ๋กœ ๊ฐ‘์‹œ๋‹ค.

@elgertam ์ด๋ผ๋Š” ๋ฌธ์žฅ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

[...] Pipfile์„ ์‚ฌ์šฉํ•˜๋ฉด install_requires๊ฐ€ Pipfile์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. numpy๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ pipenv install numpy ๋ฐ ์ƒˆ ํ•ญ๋ชฉ์ด ๋‚ด Pipfile์˜ [ํŒจํ‚ค์ง€] ๊ทธ๋ฃน [...]์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

numpy ๋ฅผ ํ™˜๊ฒฝ์— ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ์•ฑ์˜ ์ข…์†์„ฑ์— numpy ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ„์† ์ฝ์œผ์‹œ๋ฉด ์ œ ๋ง์ด ๋ฌด์Šจ ๋œป์ธ์ง€ ์•Œ๊ฒŒ ๋˜์‹ค ๊ฒ๋‹ˆ๋‹ค.

์ฆ‰, pip freeze > requirements.txt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์ƒ์„ฑํ–ˆ๋˜ requirements.txt์™€ ์‚ฌ์šฉ๋ฒ•์ด ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋†€๋ž๊ฒŒ๋„, ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋‹น์‹ ์˜ ์‚ฌ์šฉ๋ฒ•์€ ๊ทธ๋ ‡๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  • ์ด์ „ ์ž‘์—… ํ๋ฆ„: pip install stuff -> pip freeze > requirements.txt -> requirements.txt install_requires ํ”ผ๋“œ
  • ์ƒˆ๋กœ์šด(์‹œ๋„ํ•œ) ์›Œํฌํ”Œ๋กœ: pipenv install stuff -> Pipfile ์ž๋™ ์—…๋ฐ์ดํŠธ๋จ -> Pipfile ๋กœ install_requires ์— ํ”ผ๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์˜๋„ํ•œ ์•„์ด๋””์–ด: install_requires -> pipenv install -> ํ™˜๊ฒฝ ๋ฐ Pipfile.lock ์— ํ•ญ๋ชฉ ์ถ”๊ฐ€๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜๋„ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ์•ฑ์„ ์„ค์น˜ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๋ช…์‹œํ•œ Pipfile ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
@isobit์— ์˜ํ•ด ์—ฐ๊ฒฐ๋œ requests Pipfile ๊ฐ™์€ ๊ฒƒ.

๋˜๋Š” ์˜ˆ:

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[dev-packages]
pytest = ">=2.8.0"
tox = "*"

[packages]
"-e ." = "*"

Pipfile ๋Š” ํŒจํ‚ค์ง€์˜ ์ข…์†์„ฑ์ด ์•„๋‹ˆ๋ผ ํ™˜๊ฒฝ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ์œ„์˜ Pipfile ๋Š” ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“œ์˜ ๋กœ์ปฌ ํŒจํ‚ค์ง€์ธ ์„ค์น˜ํ•˜๋ ค๋Š” ํ•ญ๋ชฉ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ง€๊ธˆ์€ ๋ชจ๋‘ ๋‹จ์ผ ํŒจํ‚ค์ง€๋กœ ๊ตฌ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ "์“ธ๋ชจ์—†๊ฒŒ" ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ requests[security] ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์„ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์•ฑ์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ์ข…์†์„ฑ์€ ์•„๋‹™๋‹ˆ๋‹ค. pipenv install requests[security] ํ•˜๊ณ  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true

[dev-packages]
pytest = ">=2.8.0"
tox = "*"

[packages]
"-e ." = "*"
requests = { extras = ['security'] }

๊ทธ๋ฆฌ๊ณ  ์งœ์ž”, ์—ฌ๊ธฐ์— ์ถ”์ƒ์  ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ ๊ฐ„์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. gunicorn ๋˜๋Š” ํ™˜๊ฒฝ์— ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๊ฒƒ์„ ์„ค์น˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด์ง€๋งŒ ์•ฑ ์ž์ฒด์˜ ์ผ๋ถ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

@vphilippon์—์„œ ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Pipfile์˜ [ํŒจํ‚ค์ง€]๊ฐ€ install_requires ๋˜๋Š” tests_require์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋„ˆ๋ฌด ์ œํ•œ์ ์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์ถฉ๋ถ„ํžˆ ์„ค๋ช…ํ–ˆ๋‹ค๋ฉด, ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์ด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
install_requires ์— ์ข…์†์„ฑ์„ ๋„ฃ๊ณ  Pipfile ์— ํŒจํ‚ค์ง€๋ฅผ ๋„ฃ์€ ๋‹ค์Œ ์žฌํ˜„์„ฑ์„ ์œ„ํ•ด Pipfile.lock ์™€ ํ•จ๊ป˜ ํ™˜๊ฒฝ์„ ์–ป์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ข…์†์„ฑ).

test_require ์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์ด ๋ชจ๋“  ๊ฒƒ์— ๋งž๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Œ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. IIRC, setuptools ํŠน์ • ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ถ”์ƒ์ ์ธ ์ข…์†์„ฑ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ pipenv ์—์„œ ํ•ด๊ฒฐํ•˜๊ณ  ์„ค์น˜ํ•œ ๋‹ค์Œ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด pipenv install --dev ๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ €๋Š” ๊ทธ๊ฒƒ์ด ์˜ณ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ƒ๊ฐ์ด๋‚˜ ์˜๊ฒฌ์ด ์—†์œผ๋ฉฐ ์ด์— ๋Œ€ํ•œ ๊ทผ๊ฑฐ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ๋“  ์ดํ•ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@vphilippon ์„ค๋ช…์„ ์ž˜ ํ•ด์ฃผ์…”์„œ ๋‚ฉ๋“์ด ๊ฐ”๋˜ ๊ฒƒ ๊ฐ™์•„์š”.

TL;DR: setup.py ์— ์ถ”์ƒ์ ์ด๊ณ  ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•œ ์ข…์†์„ฑ์„ ์ง€์ •ํ•œ ๋‹ค์Œ Pipfile ๋ฐ Pipfile.lock ์— ์ปจํ…์ŠคํŠธ(๋”ฐ๋ผ์„œ ๊ตฌ์ฒด์„ฑ)๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํ™˜์ƒ์ ์ธ "-e ." = "*" ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

https://github.com/kennethreitz/pipenv/issues/209#issuecomment -337409290์˜ ๋ฌธ์ œ๋Š” ์•ฑ์„ ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์„ ์–ป์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋ง์€, ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋  _library_๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” install_requires ๊ฐ€ ์ƒ๋‹นํžˆ ๋Š์Šจํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค(=์ •ํ™•ํ•œ ๋ฒ„์ „์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ ์—†์Œ). ๋„ค. ๊ทธ๋Ÿฌ๋‚˜ ์›น ์•ฑ(๋˜๋Š” ๋ชจ๋“  ์•ฑ)์„ ๋นŒ๋“œํ•˜๊ณ  ์›๊ฒฉ ์„œ๋ฒ„ ๋˜๋Š” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ๋ฐฐํฌํ•  ๋•Œ ๊ณ ์ •๋œ ์ข…์†์„ฑ์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. install_requires ์— ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ์ง€์ •ํ•˜๋”๋ผ๋„ ์ „์ด ์ข…์†์„ฑ์€ ์ž ๊ฒจ ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์„ค์น˜ ์‹œ ์ „์ด ์ข…์†์„ฑ์˜ ๋‹ค๋ฅธ(์ตœ์‹ ) ๋ฒ„์ „์ด ์‹ค์ œ๋กœ ๋‹ค์šด๋กœ๋“œ๋˜์–ด ๋ฐฐํฌ๊ฐ€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ „์ด ์ข…์†์„ฑ์˜ ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ์ˆ˜๋™์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค.)

์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์šฐ๋ฆฌ๋Š” requirements.txt ์Šคํƒ€์ผ ์ž ๊ธˆ ํŒŒ์ผ(์ „์ด์  ์ข…์†์„ฑ์— ๋Œ€ํ•ด์„œ๋„ ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ์ง€์ •ํ•จ)์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ pipenv๊ฐ€ pipenv lock -r (์˜ˆ: pipenv lock --no-dev -r )์—์„œ ๊ฐœ๋ฐœ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ œ์™ธํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ requirements.txt ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. install_requires ๋กœ ์ฝ์Šต๋‹ˆ๊นŒ?

Donald Stufft์˜ ๊ธฐ์‚ฌ๋ฅผ ์ธ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์ฆ‰, ์•ฑ์€ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์•ฑ์€ ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ ์„ธํŠธ๊ฐ€ ์„ค์น˜๋œ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. ์•ฑ ์ข…์†์„ฑ์€ ๋‹จ์ผ ํŒจํ‚ค์ง€ install_requires ๊ฐ€ ์•„๋‹ˆ๋ผ requirements.txt (๋˜๋Š” Pipfile / Pipfile.lock )๋กœ ํ‘œํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ, ๊ณ ์ •๋œ ์ข…์†์„ฑ์˜ ์ „์ฒด ์„ธํŠธ(์ „ํ™˜์  ์ข…์†์„ฑ ํฌํ•จ)๋Š” ํŒจํ‚ค์ง€์˜ setup.py ๊ฐ€ ์•„๋‹ˆ๋ผ ์•ฑ์— ๋Œ€ํ•œ requirements.txt ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•ฑ ๋ฐฐํฌ๊ฐ€ pip install myapp==1.0.0 ๊ฐ€ ์•„๋‹ˆ๋ผ pip install -r requirements.txt (๋˜๋Š” pipenv install ๊ฐ€ ์žˆ๋Š” Pipfile.lock )๋ผ๋Š” ๊ฐœ๋…์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ requirements.txt ์—๋Š” myapp==1.0.0 ๋Š” ๋ฌผ๋ก  ๊ณ ์ •๋œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ข…์†์„ฑ ๋ฐ ์ „์ด ์ข…์†์„ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์ข€ ๋ฉ€๋ฆฌ ๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ฐฐํฌ๋œ "์•ฑ"์ด ํŒจํ‚ค์ง€ ์ง‘ํ•ฉ์— ์˜ํ•ด ๊ตฌ๋™๋˜๋Š” ์ปจํ…์ŠคํŠธ์—์„œ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ์ž์ฒด๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๋‹จ์ผ ํŒจํ‚ค์ง€๊ฐ€ ์—†์œผ๋ฏ€๋กœ "ํŒจํ‚ค์ง€๋Š” ์•ฑ์ด ์•„๋‹ˆ๋‹ค"๋ผ๋Š” ๊ฐœ๋…์ด ๊ฝค ์ผ์ฐ ๋‚ด ์–ผ๊ตด์— ๋˜์ ธ์กŒ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„ .

๋‚˜๋Š” Pipenv/Pipfile/Pipfile.lock์ด ์ด ์•„์ด๋””์–ด๋ฅผ ๋”ฐ๋ฅธ๋‹ค๋Š” ๊ฐ•ํ•œ ๋Š๋‚Œ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Pipfile.lock ์—์„œ setup.py ์˜ install_requires ๋กœ ๊ฐ€๋Š” ๊ฐ„๊ฒฉ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์‹ค์ œ๋กœ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@maintainers ์ด ๋ชจ๋“  ๊ฒƒ์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์˜์กด์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋น„์ „์„ ์„ค๊ตํ•ด ์™”์ง€๋งŒ ๋‹น์‹ ์„ ๋Œ€์‹ ํ•ด์„œ ๋งํ•˜๊ณ  ์‹ถ์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

@vphilippon ๋‹ค๋ฅธ ๊ด€์ ๊ณผ ์šฉ์–ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ถ๊ทน์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์„ค์น˜ํ•  ๊ณ ์ •๋œ ์ข…์†์„ฑ ๋ชฉ๋ก์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณ ์ •๋œ ๋ฒ„์ „์ด ์žˆ๋Š” requirements.txt (๋˜๋Š” ์ด๋Ÿฌํ•œ ์„ ์–ธ๋œ ์ข…์†์„ฑ์ด ์žˆ๋Š” ํŒจํ‚ค์ง€๋Š” ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ). ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ๊ทธ๋Ÿฌํ•œ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

pip-compile ( of pip-tools )๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด requirements.in requirements.txt ๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—๋Š” ๋‚ด ์•ฑ์— ํ•„์š”ํ•œ ๋น„๊ฐœ๋ฐœ ์ข…์†์„ฑ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์‘๋‹ต์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ ์ •๋œ ์ข…์†์„ฑ์„ ์ง์ ‘ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ($# requirements.txt setup.py ์— ์ด๋ฏธ ์žˆ๋Š” ๊ฒƒ๊ณผ ์•ฝ๊ฐ„ ์ค‘๋ณต๋จ), ๋˜ํ•œ ์ „์ด ์ข…์†์„ฑ? ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค...

pipenv lock --no-dev -r ๊ฐ€ ์žˆ์œผ๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@tuukkamustonen ํ˜ผ๋ž€์„ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์‹ค์ œ๋กœ install_requires ๋Œ€ requirements.txt / Pipfile / Pipfile.lock ์˜ ์•„์ด๋””์–ด๋งŒ ๋‹ค๋ฃจ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ณ ์ •๋œ ๋ฒ„์ „์ด ์žˆ๋Š” requirements.txt(๋˜๋Š” ๊ทธ๋Ÿฌํ•œ ์„ ์–ธ๋œ ์ข…์†์„ฑ์ด ์žˆ๋Š” ํŒจํ‚ค์ง€๋Š” ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ)์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ตฌ๋ถ„์ด ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ์—ฌ๊ธฐ์—๋Š” ๋‹ค๋ฅธ ๊ด€์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ์‹œ๋‹ค. ์ฐธ๊ณ ๋กœ ํŠน์ • ๋ฌธ์ œ์— ๋…ธ์ด์ฆˆ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ฃผ์ œ๋ฅผ ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. IMO๋ผ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋” ๋งŽ์€ ํ† ๋ก ๊ณผ ๊ณต์œ ๊ฐ€ ํ•„์š”ํ•œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ pipenv๊ฐ€ pipenv lock -r์—์„œ ๊ฐœ๋ฐœ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ œ์™ธํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ถ๊ทน์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์„ค์น˜ํ•  ๊ณ ์ •๋œ ์ข…์†์„ฑ ๋ชฉ๋ก์„ ์›ํ•ฉ๋‹ˆ๋‹ค. [...] ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ๊ทธ๋Ÿฌํ•œ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. [...] pip-compile(pip-tools)์„ ์‚ฌ์šฉํ•˜๋ฉด requirements.in์—์„œ ๊ทธ๋Ÿฌํ•œ requirements.txt๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚ด ์•ฑ์— ํ•„์š”ํ•œ ๋น„๊ฐœ๋ฐœ ์ข…์†์„ฑ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์•„, ์ฒ˜์Œ์— ๊ทธ ๋ถ€๋ถ„์„ ๊ฑด๋„ˆ๋›ฐ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ์˜ณ์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. pipenv install --not-dev-stuff ๋ผ๊ณ  ๋งํ•˜๊ณ  ๋น„๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด 2๊ฐœ์˜ ๋ณ„๋„ ์„น์…˜์„ ๊ฐ–๋Š” ์š”์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ง€๊ธˆ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” setup.py ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ƒˆ๋กœ์šด ๋ฌธ์ œ์—์„œ ๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ์‹ค์ˆ˜๋ฅผ ํ–ˆ๋‹ค. ๋‚˜๋Š” ์‹ค์ œ๋กœ ๊ฐœ๋ฐœ ํŒจํ‚ค์ง€ ์—†์ด Pipfile.lock ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์ง€๋งŒ , ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์—์„œ ๊ธฐ์กด Pipfile / Pipfile.lock , pipenv install dev ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ @tuukkamustonen ์˜ ์š”์ ์„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ "ํ”„๋กœ๋•ํŠธ ํ™˜๊ฒฝ"์„ ์„ค์น˜ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ๋งํ•œ ๊ฒƒ์€ ๋‚ด ์‹ค์ˆ˜์˜€์Šต๋‹ˆ๋‹ค.

ํœด, ๋”ฐ๋ผ์žก์„ ๊ฒƒ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํฌ๊ฒŒ ์ž˜๋ชป ์•Œ๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ, #209(์ฃผ์„)์˜ ์ฝ”๋“œ๋Š” ํœ (=์ด์ง„ dist)์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€๋งŒ sdist(=์†Œ์Šค dist)๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@tuukkamustonen ์ด๊ฒƒ์€ ๋ฐฐํฌ์šฉ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ์Šคํฌ๋ฆฝํŠธ ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ setup.py์— ํฌํ•จํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๋ช‡ ๋‹ฌ ์ „์— pipenv lock -r ๊ฐ€ ์žˆ๊ธฐ ์ „์˜ ๋ฐ˜ ํ•ดํ‚น ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ packages ๋ฐ dev-packages ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Pipfile์ด ๋” ์ผ๋ฐ˜์ ์ธ ํ‘œ์ค€์ด ๋  ๋•Œ๊นŒ์ง€ ๊ฐœ์ธ์ ์œผ๋กœ (3)(#209(์ฃผ์„) ์ฐธ์กฐ)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Pipfile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” virtualenv๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๋ฉฐ, ๋ฐ˜๋“œ์‹œ Pipfile ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

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

๊ด€๋ฆฌ์ž ์—ฌ๋Ÿฌ๋ถ„์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„์ด ์ด ๋ชจ๋“  ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋ณด๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์˜์กด์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋น„์ „์„ ์„ค๊ตํ•ด ์™”์ง€๋งŒ ๋‹น์‹ ์„ ๋Œ€์‹ ํ•ด์„œ ๋งํ•˜๊ณ  ์‹ถ์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ ๋™์•ˆ ์šฐ๋ฆฌ์˜ ๋น„์ „๊ณผ ๋งค์šฐ ์ž˜ ์ผ์น˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @vphilippon์„ ์ž˜ ํ‘œํ˜„ํ•˜์—ฌ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ปดํŒŒ์ผํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ํ† ๋ก ์˜ ๋‹ค๋ฅธ ๊ด€๋ จ ๋ถ€๋ถ„์ด #942๋กœ ์˜ฎ๊ฒจ์ง„ ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋ฌด ๊ฒƒ๋„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ €์—๊ฒŒ ํ•‘์„ ์ฃผ์„ธ์š”.

์ €๋Š” https://github.com/pypa/pipfile/issues/98 ์—์„œ ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์„ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด DX๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ณ  ์‹ค์šฉ์ ์ธ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐ?

import json, jmespath

install_requires = []
with open('Pipfile.lock') as f:
    context = json.loads(f.read())
    install_requires.extend(map(
        lambda n, v : n + v,
        jmespath.search('default | keys(@)', context),
        jmespath.search('default.*.version', context),
    ))

setup(
    name='foobar',
    packages=find_packages(),
    setup_requires=['jmespath'],
    install_requires=install_requires,
)

@cornfeedhobo ๋‚ด ์ดํ•ด๋Š” setup_requires๊ฐ€ pip์™€ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

setup.py๋Š” ์ผ๋ฐ˜ Python ์ฝ”๋“œ๋กœ ํ‰๊ฐ€๋˜๋ฏ€๋กœ jmespath๋ฅผ ๋จผ์ € ์„ค์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ˜ํ”Œ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. setup_requires ์ธ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์•„๋ฌด ๊ฒƒ๋„ ๋‹ฌ์„ฑํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ๊ทธ ์ •๋„๊นŒ์ง€ ๋„๋‹ฌํ•˜๋ฉด jmespath๊ฐ€ ์„ค์น˜๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค๋ฅธ ํ˜ธ์—์„œ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ atm์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ด์Šˆ ํŠธ๋ž˜์ปค ์ „์ฒด์— ์ค‘๋ณต๋œ ํ† ๋ก ์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ๋” ์ด์ƒ ์•„๋ฌด๊ฒƒ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ๋‹ค์‹œ ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค: ์ œ๋ฐœ ๊ตฌ์ถ•๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ๋„ฃ์ง€ ๋งˆ์„ธ์š”- ์ ์ ˆํ•œ ๋Œ€์ฒด๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์™„๋ฒฝํ•œ ์ด์œ ๊ฐ€ ์—†๋Š” ํ•œ ๋‚ด๋ถ€ setup.py์— ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ setup.py ๋ฅผ ํฌํ•จํ•˜๋Š” ํŒจํ‚ค์ง€๋Š” virtualenv์— jmespath๊ฐ€ ์„ค์น˜๋œ Pipenv์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pipenv๋Š” ๊นจ๋—ํ•œ ํ™˜๊ฒฝ์—์„œ setup.py egg_info ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  jmespath ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์œ ์Šต๊ด€์ž…๋‹ˆ๋‹ค. ํ”ผํ•ด์ฃผ์„ธ์š”.

@epot ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ–ˆ๋‹ค

@uranusjr ์„ธ๋ถ€ ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ์ž˜ ์ƒ๊ฐํ•œ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €๋Š” ์ด ์ „์ฒด ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•˜๋Š” ์ค‘์ด๋ฏ€๋กœ ๋” ๋‹นํ™ฉ์Šค๋Ÿฌ์›Œ์„œ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pypa/pipfile#98๋„ ์ถ”์  ์ค‘์ž…๋‹ˆ๋‹ค.

jmespath ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด?

import json


install_requires = []
tests_require = []

with open('Pipfile.lock') as fd:
    lock_data = json.load(fd)
    install_requires = [
        package_name + package_data['version']
        for package_name, package_data in lock_data['default'].items()
    ]
    tests_require = [
        package_name + package_data['version']
        for package_name, package_data in lock_data['develop'].items()
    ]

@mschwager ๋ฒ„์ „์„ ๊ณ ์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋ ค์›€์„ ๊ฒช์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. #1921์€ == ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜ˆ์ด๋ฉฐ ๊ฒฐ๊ตญ ์‚ฌ์šฉ์ž์˜ ๋นŒ๋“œ๋ฅผ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

์ฃ„์†กํ•˜์ง€๋งŒ ํŒจํ‚ค์ง€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด setup.py ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ํŒจํ‚ค์ง€์˜ ์ข…์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด requirements.txt / Pipfile ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” setup.py ์™€ requirements.txt / Pipfile ์‚ฌ์ด์—์„œ ๋™์ผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ Pipfile ๋ฅผ ํ†ตํ•ฉํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. setup.py ๋Š” ์ด๋ฏธ requirements.txt ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. Pipfile ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

requirements.txt ๋ฅผ ์—†์• ๊ณ  Pipfile ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๋™์ผํ•ด์•ผ _๊ฐ€์ง€๋Š”_ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๊ธ‰์ง„์ ์ธ ๊ฐ€์ •์ด๋ฉฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ์š”๊ตฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ๋“ค์ด _ํ•  ์ˆ˜ ์žˆ๋Š”_ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Pipenv๋Š” ๊ทธ๊ฒƒ์„ ๋ฐฐ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„ ๋ฐ–์ด๋ฉฐ ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์™„์ „ํžˆ ๋นŒ๋“œํ•˜๊ณ  pip 10.0์— implrmrnet๋œ PEP 518 ์„ ํ™œ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์‹œ๊ฐ„ ์ง€์›์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด setup.py๊ฐ€ Pipfile์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์‹คํ˜„ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค :)

setup.py์˜ ์ถ”์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ๋„ ์žˆ์ง€๋งŒ ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋ง์€ golang์€ ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ lib๋ฅผ ์ž์‹ ์˜ ํฌํฌ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? setup.py ํ†ตํ•ฉ์ด ๋ฒ”์œ„์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ pipenv์˜ ์žฅ๊ธฐ ๋กœ๋“œ๋งต์ด ๋ฌด์—‡์ธ์ง€ ๋ณด๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์—์„œ ๋„๊ตฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ์‹์œผ๋กœ๋“  setup.py๋ฅผ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ์ ˆํ•œ setup.py๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  pipenv๊ฐ€ ์‚ฌ์‹ค์ƒ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค. setup.py๋ฅผ ํฌํ•จํ•˜๋„๋ก ๋ฒ”์œ„๋ฅผ ํ™•์žฅํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ?

pipenv๊ฐ€ npm ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ํ•ด๋‹น package.json์€ ์›๊ฒฉ ์„ค์น˜๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. pipenv๊ฐ€ setup.py์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ฑฐ๋‚˜ ๊ต์ฒดํ•  ์ˆ˜ ์—†์–ด ๋ฒ”์œ„ ๋‚ด๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ง์ด ๋˜๋Š” ๊ฑด๊ฐ€์š” ์•„๋‹ˆ๋ฉด ๋ฏธ์นœ ์•ฝ์„ ๋จน๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๊นŒ?

ํ•„์ˆ˜ํ’ˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ ๋‹ค๋ฉด, ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ Pipfile ๊ธฐ๋ฐ˜ ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ์ฆ‰์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

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