Pipenv: setup.py install_requires ๋ฐ Pipfile์„ ๋™๊ธฐํ™” ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•

์— ๋งŒ๋“  2018๋…„ 01์›” 03์ผ  ยท  49์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pypa/pipenv

์ €๋Š” pipenv๋กœ Python ํŒจํ‚ค์ง€๋ฅผ ์ž‘์—… ์ค‘์ด๋ฉฐ setup(install_requires=...) ๋ฅผ Pipfile์˜ ๋Ÿฐํƒ€์ž„ ์ข…์†์„ฑ๊ณผ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒ์žฅ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

[๋‹ต๋ณ€ 2019-08-23] ์•„๋ž˜์—์„œ๋„ ๋…ผ์˜๋˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€:

์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์— ๋ฐฐํฌ๋˜๊ฑฐ๋‚˜ ๋ฐฐํฌ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ Pipfile๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

setup.py๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋กœ ๋ฐฐํฌ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์ข…์†์„ฑ์„ install_requires์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ pipenv install '-e .' ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Pipfile์ด setup.py์— ์ข…์†๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

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

์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์— ๋ฐฐํฌ๋˜๊ฑฐ๋‚˜ ๋ฐฐํฌ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ Pipfile๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

setup.py๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋กœ ๋ฐฐํฌ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์ข…์†์„ฑ์„ install_requires์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ pipenv install '-e .' ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Pipfile์ด setup.py์— ์ข…์†๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

[์—…๋ฐ์ดํŠธ 2019-08-23] ์š”์ฆ˜์—๋Š” dev ํŒจํ‚ค์ง€๋ฅผ Pipfile์— ๋ณด๊ด€ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์ข…์†์„ฑ๋งŒ setup.py์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

pipenv์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” python API๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•  ๋•Œ ์ˆ˜๋™์œผ๋กœ ๋ชฉ๋ก์„ ์—…๋ฐ์ดํŠธํ•˜์ง€๋งŒ ๋‹ค์Œ์ด ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from setuptools import setup
from pipenv import find_install_requires

setup(
    # ...
    install_requires=find_install_requires()
    # ...
)

์ด ํ•จ์ˆ˜๋Š” pipfiles [packages] ์„น์…˜์˜ ํ‚ค ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ธฐ๋Šฅ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด pipenv์˜ ์ผ๋ถ€๋ผ๋ฉด ์ข‹์„ ๊ฒƒ์ด๋ฏ€๋กœ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Pipenv ์˜ Pipfile ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ง€์›ํ•˜๋Š” ๊ตฌํ˜„์ธ Pipfile์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import pipfile
pf = pipfile.load('LOCATION_OF_PIPFILE')
print(pf.data['default'])

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ setup.py์˜ Pipenv์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. pipenv ๊ฐ€์ ธ์˜ค๊ธฐ(๋˜๋Š” pipfile )๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์ „์— ์‹ค์ œ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•˜๋ฉฐ Pipenv์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ์—ฟ๋ณด๊ธฐ( setup.py egg_info )๋ฅผ ์ด๊ฒผ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. setup.py๋Š” Setuptools์—๋งŒ ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘๊ฐ„ ์†”๋ฃจ์…˜์€ Pipfile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” bumpversion ๊ณผ ์œ ์‚ฌํ•œ ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ ๋ฐฐํฌํ•˜๊ณ  setup.py์—์„œ ์ฝ์œผ์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ CI ๋˜๋Š” ์ปค๋ฐ‹ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์ด ํ•ญ์ƒ ๋™๊ธฐํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ข‹์€ ์ง€์ ์€ ๋‚˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.
์•„๋งˆ๋„ "pipenv install"์ด ๋™๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

2018๋…„ 1์›” 8์ผ ์›”์š”์ผ ์˜คํ›„ 5:04 Tzu-ping Chung ์•Œ๋ฆผ @github.com
์ผ๋‹ค:

Pipfile https://github.com/pypa/pipfile , ๋‹ค์Œ์„ ์ง€์›ํ•˜๋Š” ๊ตฌํ˜„
๊ตฌ๋ฌธ ๋ถ„์„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ• ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ
pf = pipfile.load('LOCATION_OF_PIPFILE')
์ธ์‡„(pf.data['๊ธฐ๋ณธ'])

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ setup.py์˜ Pipenv์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
pipenv(๋˜๋Š” pipfile) ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์ „์— Pipenv์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€
์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ์—ฟ๋ณด๊ธฐ(setup.py egg_info)๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋งŒํผ
setup.py๋Š” Setuptools์—๋งŒ ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘๊ฐ„ ํ•ด๊ฒฐ์ฑ…์€ ๋ฒ”ํ”„ ๋ฒ„์ „๊ณผ ์œ ์‚ฌํ•œ ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ…์ŠคํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” https://github.com/peritus/bumpversion
Pipfile ๊ธฐ๋ฐ˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ ๋ฐฐํฌํ•˜๊ณ  ์ฝ์œผ์‹ญ์‹œ์˜ค.
setup.py์—์„œ. ๊ทธ๋Ÿฐ ๋‹ค์Œ CI ๋˜๋Š” ์ปค๋ฐ‹ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์ด ํ•ญ์ƒ
๋™๊ธฐํ™”.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/pypa/pipenv/issues/1263#issuecomment-355889369 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/ALMBlmmV52kdIL9D4zlMJoQh2JpaGdDbks5tIa_jgaJpZM4RRu3v
.

@uranusjr ์€ ์—ฌ๊ธฐ์—์„œ ๋‚ด ๊ฐ€์ •์„ ํ…Œ์ŠคํŠธํ•˜์ง€๋งŒ setup.py์˜ setup_requires์— pipenv๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  setuptools ๋ช…๋ น์œผ๋กœ pipenv ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ง€์—ฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„๊นŒ์š”? ์•„๋‹ˆ๋ฉด ๋‚˜์œ ์Šต๊ด€์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๊นŒ?

@Korijn ๊ทธ ์ž์ฒด๋Š” ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ˜„์žฌ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๊ฐ Python ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ virtualenv๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด Pipenv ์‚ฌ๋ณธ์„ ์„ค์น˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋งค์šฐ ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pipenv๋Š” ํ•œ ๋ฒˆ๋งŒ ์„ค์น˜ํ•ด์•ผ ํ•˜๋ฉฐ(์ผ๋ฐ˜์ ์œผ๋กœ ์ „์—ญ์ ์œผ๋กœ) ํ”„๋กœ์ ํŠธ์˜ virtualenv ๋‚ด๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ์˜ virtualenv ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌธ์ œ์˜ ์ข…๊ฒฐ๋กœ ์ด์–ด์ง„ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Pipfile ์™€ setup.py ์˜ ์ข…์†์„ฑ์„ ๋ชจ๋‘ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๊นŒ? ๋ฌธ์ œ๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์— ๋ฐฐํฌ๋˜๊ฑฐ๋‚˜ ๋ฐฐํฌ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ Pipfile๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

setup.py๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋กœ ๋ฐฐํฌ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์ข…์†์„ฑ์„ install_requires์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ pipenv install '-e .' ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Pipfile์ด setup.py์— ์ข…์†๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

[์—…๋ฐ์ดํŠธ 2019-08-23] ์š”์ฆ˜์—๋Š” dev ํŒจํ‚ค์ง€๋ฅผ Pipfile์— ๋ณด๊ด€ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์ข…์†์„ฑ๋งŒ setup.py์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

@Korijn์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์—ฌ๊ธฐ์—์„œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Pipfile(๋ฐ requirements.txt)์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ์ž…๋‹ˆ๋‹ค. setup.py๋Š” ํŒจํ‚ค์ง€์šฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(IMO).

@uranusjr ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ์•„๋‹™๋‹ˆ๋‹ค.

Pipenv๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง• ์„ธ๊ณ„(๋ฒˆ๋“ค๋Ÿฌ, ์ž‘๊ณก๊ฐ€, npm, ํ™”๋ฌผ, ์›์‚ฌ ๋“ฑ)์˜ ์ตœ๊ณ ๋ฅผ Python ์„ธ๊ณ„๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Windows๋Š” ์šฐ๋ฆฌ ์„ธ๊ณ„์—์„œ ์ผ๋ฅ˜ ์‹œ๋ฏผ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ virtualenv๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌํ•˜๊ณ  ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜/์ œ๊ฑฐํ•  ๋•Œ Pipfile์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€/์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฒฐ์ •์  ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ•ญ์ƒ ์ค‘์š”ํ•œ Pipfile.lock์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ง„์ˆ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”๋กœ๋Š” pipenv ๋Š” PHP์šฉ ์ž‘๊ณก๊ฐ€์™€ ์œ ์‚ฌํ•œ ์™„์ „ํ•œ ์ข…์†์„ฑ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ pipenv ๋Š” Pipfile ๋ฐ Pipfile.lock์ด ์žˆ์ง€๋งŒ setup.py์— install_requirements๊ฐ€ ์—†๋Š” ์ข…์†์„ฑ์˜ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@vascowhite ๊ท€ํ•˜๊ฐ€ ๋ฌป๋Š” ์งˆ๋ฌธ์€ pipenv์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ python ํŒจํ‚ค์ง• ๋„๊ตฌ ๊ฐ„์˜ ๊ทผ๋ณธ์ ์ธ ๋ถ„๋ฆฌ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Python ์›Œํฌํ”Œ๋กœ์—์„œ setup.py ํŒŒ์ผ์€ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ํŒจํ‚ค์ง€์˜ ์„ค์น˜ ์ข…์†์„ฑ์„ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ requests ์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๊ณ  cffi ๊ฐ€ ์„ค์น˜๋œ ์‚ฌ๋žŒ๋“ค์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ setup.py ์—์„œ ์ด๋ฅผ ์„ ์–ธํ•˜์—ฌ ์‚ฌ๋žŒ๋“ค์ด pip install requests ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ

์š”๊ตฌ ์‚ฌํ•ญ ํŒŒ์ผ๊ณผ ๊ฐ™์€ Pip ํŒŒ์ผ์€ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๊ฐœ๋ฐœ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์ข…์†์„ฑ์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋‹จ์ผ pipfile์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ ์€ ์ด์ „ ์›Œํฌํ”Œ๋กœ๊ฐ€ ๊ณ ์ •๋œ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ํ‰๋ฉดํ™”๋œ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•œ ๋ฐ˜๋ฉด Pipfiles๋Š” ์ตœ์ƒ์œ„ ์š”๊ตฌ ์‚ฌํ•ญ์„ ํฌํ•จํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ณ ์ • ํ•ด์ œ๋ฅผ ์„ ํ˜ธํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ setup.py ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์—๋„ ๋งž๋Š” ์ตœ์ƒ์˜ ์ผ์น˜ ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Pipfiles๊ฐ€ ์žฌ๊ท€ ์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ํŒŒ์ด์ฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. pipenv install ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๊ถ๊ทน์ ์œผ๋กœ setuptools ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์„ค์น˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์„ค์ • ํŒŒ์ผ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

@techalchemy ๋น„์Šทํ•œ ๋‹ต๋ณ€์„ ์ค‘๊ฐ„์— ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๐Ÿ˜‚ (๋ชจ๋‘ ์‚ญ์ œ)

๋‚˜๋Š” ๋˜ํ•œ @vascowhite ๋‹น์‹ ์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค ์ด์ƒํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Pipfile๊ณผ ์ž ๊ธˆ ํŒŒ์ผ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‘ ๊ฐ€์ง€ ๋ณ„๊ฐœ์˜ ์›Œํฌํ”Œ๋กœ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์ธ ์„ธ๊ณ„์—์„œ Pipfile์€ setup.py์˜ install_requires ๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  ๊ฐ€์ƒ ์ข…์†์„ฑ์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด ์ž ๊ธˆ ํŒŒ์ผ์€ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์–ด requirements.txt๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜๋„ ํฌ๋ง์€ ์žƒ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์ ์–ด๋„ ๋‚ด ๊ฒƒ์€ ์•„๋‹˜). ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ๋งŽ์€ PEP๊ฐ€ ์ œ์•ˆ๋˜๊ณ  ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ, setup.py ๋ฐ requirements.txt๊ฐ€ ๋ชจ๋‘ ์—„๊ฒฉํ•˜๊ณ  ์„ ์–ธ์ ์ธ ํ˜•์‹์œผ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ์ƒํ™ฉ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๊ณ„๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์ด ๋Š๋ฆฌ๊ฒŒ ์›€์ง์—ฌ์•ผ ํ•˜์ง€๋งŒ(๋˜๋Š” Python 3.0 ์ฐธ์กฐ) ์‹ค์ œ๋กœ ์›€์ง์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@sweet_ssssssss @sssssssssss ๋งž์•„์š”
๋‘ ๋ถ„ ๋ชจ๋‘ ๋ช…์พŒํ•œ ๋‹ต๋ณ€์„ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ œ ๋งˆ์Œ์†์— ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋ฐ”๋กœ์žก์•„ ์ค๋‹ˆ๋‹ค. ๋ฌธ์„œ๊ฐ€ Pipenv๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ ์ด์ƒ์ด๋ฉฐ ๋ถ€๋ถ„์ ์œผ๋กœ ๋‚ด ํ˜ผ๋ž€์˜ ์›์ธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ํ˜ผ๋ž€์˜ ๋Œ€๋ถ€๋ถ„์€ ๋‚˜์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. :)

PHP์—์„œ ์™”๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์œผ๋กœ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ฒƒ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. Composer๋Š” ๊ทธ์— ๋น„ํ•ด ์‚ฐ๋“ค ๋ฐ”๋žŒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŒŒ์ด์ฌ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ๊ณ  ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ƒํ™ฉ์ด ๊ฐœ์„ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๊ณผ Kenneth Reitz์™€ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์˜ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ผ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ œ ์กฐ์–ธ์„ ๋”ฐ๋ฅด๋ฉด setup.py์™€ pipenv๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์กฐํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์†Œ๋ž€์„ ์–ป์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. :)

๋‚˜๋งŒ ํ—ท๊ฐˆ๋ฆฐ๊ฒŒ ์•„๋‹Œ๊ฑฐ๊ฐ™๋‹ค #1398

๋‚ด๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž˜ ๋„ฃ์–ด :)

setup.py pipenv ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์™”์Šต๋‹ˆ๋‹ค. ํ† ๋ก ์— ๋‚ด 0.2์„ผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

setup.py ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 setup(                                                                                                     
    name='my-pkg-name',                                                                             
    packages=find_packages(),                                                                              
    install_requires=[...],
    extras_require={
        'develop': ['click']
    },
    entry_points={
        'console_scripts': [
            'my-pkg-name-cmdline = my-pkg-name.cli:tool'
        ]
    }

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ €๋Š” ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ์™€ ๊ฐ™์€ ์ž‘์—…์˜ ์Šคํฌ๋ฆฝํŠธ ์ง„์ž…์ ์—์„œ click ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

$ my-pkg-name-cmdline build ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ pipenv install --dev click ๊ฐ€ ์„ค์น˜๋œ ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด pipenv shell/exit ๋ฅผ ์กฐ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์—๋Š” ์•„์ง ๊ฑฐ์นœ ๋ถ€๋ถ„์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํŒจํ‚ค์ง€์— pipenv ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด +1์ž…๋‹ˆ๋‹ค.

์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ pipenv run my-pkg-name-cmdline build ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

@Korijn ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์˜ฌ๋ฐ”๋ฅธ ์›Œํฌํ”Œ๋กœ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค(์—ฌ์ „ํžˆ pipenv๋กœ ์•ฝ๊ฐ„ ์‹คํ—˜ ์ค‘์ž…๋‹ˆ๋‹ค).

์•„์ง๊นŒ์ง€๋Š” ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ์›Œํฌํ”Œ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(starting from scratch)
1- pipenv --three
2- pipenv install [--dev]
3- pipenv install -e . (install application locally)
4- pipenv shell (to enter the virtualenv)

์ด์ œ ๋ช…๋ น์ค„์—์„œ ํŒจํ‚ค์ง€ ๋นŒ๋“œ click ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋กœ์ปฌ๋กœ ์„ค์น˜(3๋‹จ๊ณ„) ํ•˜๊ธฐ ์ „์— virtualenv(4๋‹จ๊ณ„)์— ๋“ค์–ด๊ฐ€๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ pipenv shell ์ „์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋„๋ก ๋‚ด ๋‘๋‡Œ๋ฅผ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค( virtualenv ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ virtualenv๊ฐ€ ํ™œ์„ฑํ™”๋œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•จ).

@apiraino ๋‚˜๋Š” ๋‹น์‹ ์ด ๋ฐ”๋กœ ์—ฌ๊ธฐ์—์„œ ๋ฌผ๊ฑด์„ ์–ป์ง€ ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์—์„œ (๊ฐ€์ ธ์˜ค๊ธฐ) ํด๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋Œ€์‹  install_requires ์— ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค(์ž์‹  ํฌํ•จ)๋„ ํด๋ฆญ์ด ์„ค์น˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. extras_require['dev'] ์— ๋„ฃ๋Š” ๊ฒƒ์€ ์„ ํƒ์  ์ข…์†์„ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํŒจํ‚ค์ง€๊ฐ€ ์—†์–ด๋„ ํŒจํ‚ค์ง€๊ฐ€ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์„ค์น˜ํ•˜๋ฉด ํŠน์ • ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์€ ์‹ค์ œ๋กœ ๋” ์ด์ƒ Pipenv์™€ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ StackOverflow ๋˜๋Š” Python ๊ด€๋ จ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์™€ ๊ฐ™์€ ๋ณด๋‹ค ์ ํ•ฉํ•œ ํฌ๋Ÿผ์— ๊ฐ€์ ธ์˜ค๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

@Korijn pipenv install '-e .' ๋Š” setup.py์˜ install_requires์— ๋‚˜์—ด๋œ ๋ชจ๋“ˆ์„ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š” Pipfile $๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹pipenv 9.0.3์˜ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

setup.py ์˜ install_requires์—์„œ Pipfile ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค

๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ setup.py ์˜ install_requires ์„น์…˜์—์„œ deps๋ฅผ ํฌํ•จํ•˜๋Š” Pipfile ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@benjaminweb ์˜ค๋Š˜๋„ ๋˜‘๊ฐ™์€ ์ผ๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ํ–‰๋™์ด ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

@techalchemy ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ

Pipfile์—๋Š” ์ตœ์ƒ์œ„ ์š”๊ตฌ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ณ ์ • ํ•ด์ œ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ setup.py์˜ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์—๋„ ๋งž๋Š” ์ตœ์ƒ์˜ ์ผ์น˜ ํ•ญ๋ชฉ์œผ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

https://github.com/pypa/pipenv/issues/1263#issuecomment -362600555์— ์–ธ๊ธ‰๋œ ์›Œํฌํ”Œ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด Pipfile์ด ์—†๋Š” ํ”„๋กœ์ ํŠธ์—์„œ pipenv install '-e .' ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ pipenv๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ Pipfile์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€:

[packages]

"e1839a8" = {path = ".", editable = true}

์ด ๊ฒฝ์šฐ virtualenv์— ์„ค์น˜ํ•˜๋„๋ก ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•œ ์œ ์ผํ•œ ํŒจํ‚ค์ง€๋Š” ํŒจํ‚ค์ง€ ์ž์ฒด(์˜ˆ: ".")์ด๋ฏ€๋กœ "." Pipfile์˜ ( [packages] )์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ pipenv install requests ํ•˜๋ฉด ์š”์ฒญ์˜ setup.py์—์„œ install_requires ์ข…์†์„ฑ์ด ํ”„๋กœ์ ํŠธ์˜ Pipfile์—๋„ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์— ํŒจํ‚ค์ง€ ์„ค์น˜ ๋‹จ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด install_requires ์ข…์†์„ฑ ์ด ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ข…์†์„ฑ ํ•ด๊ฒฐ์˜ ์ผ๋ถ€๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

Pipfile๊ณผ ๋‹ฌ๋ฆฌ Pipfile.lock์€ ์ „์ฒด virtualenv์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •ํ™•ํ•œ ์ข…์†์„ฑ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํŠน์ • ๋ฒ„์ „์— ์ž ๊ฒจ ์žˆ๋Š” install_requires ์ข…์†์„ฑ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ Pipfile.lock์„ ๋ณด๋ฉด install_requires ์ข…์†์„ฑ์ด ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ์ง€ ์™„์ „ํžˆ ์˜คํ•ดํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @techalchemy ๋˜๋Š” @uranusjr ์ด ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ๊ณ  ๋ฐฉ์‹์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋‹น์‹ ์˜ ์ƒ๊ฐ์€ ๋‚˜์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ตœ๊ทผ Setuptools์˜ ๋ฐœ์ „๊ณผ Flit๊ณผ ๊ฐ™์€ ๋„๊ตฌ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ‹์ง„ TOML ํ˜•์‹์œผ๋กœ ํŒจํ‚ค์ง€์˜ ์ข…์†์„ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ์–ธ๊ธ‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค(setup.py์˜ ์š”๊ตฌ ์‚ฌํ•ญ ๋ฌธ์ž์—ด ๋Œ€์‹ ). Pipfile ๋Œ€์‹  pyproject.toml์—์„œ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@uranusjr ๊ทธ๊ฒƒ์€ Pipfile์ด Setuptools ๋˜๋Š” Flit๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง• ๋„๊ตฌ(setup.py ๋˜๋Š” pyproject.toml์„ ํ†ตํ•ด)์— ์˜ํ•ด ์•„์ง ์บก์ฒ˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ดํ•˜๋ฉด ๋œ๋‹ค๋Š” ๋ง์”€์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด setup.py๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ:

install_requires=['A'],
extras_require={
    'dev': ['B'],
},

๊ทธ๋Ÿฐ ๋‹ค์Œ Pipfile์—๋Š” ๋‹ค์Œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

[[source]]

url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"


[packages]

"e1839a8" = {path = ".", editable = true}


[dev-packages]

"e1839a8" = {path = ".", extras = ["dev"], editable = true}

pipenv install ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ”„๋กœ๋•์…˜์šฉ ์ข…์†์„ฑ A๊ฐ€ ์„ค์น˜๋˜๊ณ  pipenv install --dev ๋Š” ๊ฐœ๋ฐœ์šฉ ์ข…์†์„ฑ A ๋ฐ B๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋ฏธ Setuptools ๋˜๋Š” Flit์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด [packages] ๋˜๋Š” [dev-packages] ์•„๋ž˜์˜ Pipfile์— ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์š”์ฒญ ์„ ์˜ˆ๋กœ ๋“ค๋ฉด ๊ฐœ๋ฐœ ์ข…์†์„ฑ์ด Pipfile์— [dev-packages] ์•„๋ž˜์— ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ด๋˜๋Š” ์ด์œ ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์ง€๋งŒ install_requires ๋ฐ test_requirements ์ข…์†์„ฑ์€ ๋ชจ๋‘ ์„ค์ •์—์„œ ์บก์ฒ˜๋ฉ๋‹ˆ๋‹ค. .ํŒŒ์ด.

Pipfile์— ์ข…์†์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ ํ•ด์•ผ ํ•˜๋Š” ์œ ์ผํ•œ ์ด์œ ๋Š” Setuptools ๋˜๋Š” Flit์„ ์‚ฌ์šฉ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€? ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด ์•„๋‹Œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ƒฅ ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. extras_require[dev] ์— ๊ฐœ๋ฐœ ์ข…์†์„ฑ์„ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ง€ ๊ด€๋ก€์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. dev-packages OTHO๋Š” ์ž˜ ์ •์˜๋œ ํ‚ค์ž…๋‹ˆ๋‹ค. extras_require[dev] ๋Š” ๋˜ํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ pip install package[dev] ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ ์ด๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์ข‹์•„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

packages ์— ๊ด€ํ•ด์„œ๋Š” ์•„๋‹ˆ์˜ค, ์‹ค์ œ๋กœ install_requires IMO๋ณด๋‹ค ๋” ํ•ฉ๋ฆฌ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ฐฝ์˜์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์ƒ๊ฐํ•ด ๋‚ผ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@JulienPalard ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ ํ์‡„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. Pipfiles ๋ฐ setup.py ํŒŒ์ผ์€ ์‹ค์ œ๋กœ ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋…ผ์˜ํ•˜๋Š” ๋งํฌ๋œ ๊ธฐ์‚ฌ๊ฐ€ ๋งŽ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ tl;dr Pipfile ๋Š” ๋Œ€๋žต์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ requirements.txt
  2. ํ”„๋กœ์ ํŠธ(ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ)์—์„œ setup.py ๊ฐ€ ๊ด€๋ฆฌ๋˜๋Š” virtualenv๋กœ ํ™•์ธ๋˜๋„๋ก ํ•˜๋ ค๋ฉด ์›Œํฌํ”Œ๋กœ๋Š” pipenv install -e . ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. -- ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Pipfile ์— ๋‹จ์ผ ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. install_requires Pipfile.lock ์— ๋„ฃ์Šต๋‹ˆ๋‹ค. install_requires ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด virtualenv๋ฅผ ์ตœ์‹  ๋‚ด์šฉ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์ตœ์‹  ๋ฒ„์ „์˜ pipenv lock && pipenv sync ์™€ ๋™์ผํ•œ pipenv update ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ Pipfile ๋Š” requirements.txt ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. requirements.txt ๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ํ”Œ๋žซ ๋ฐฉ์‹์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐ˜๋ฉด Pipfile & setup.py ์—”ํŠธ๋ฆฌ ๋ ˆ๋ฒจ ์ข…์†์„ฑ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Pipfile.lock ๋ฐ requirements.txt ์— ์œ ์‚ฌํ•œ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๋Š” POC ๋™๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
https://gist.github.com/iddan/f190c3c7d54f4fc4655da95fb185e641

@iddan ๊ทธ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚ด๊ฐ€ ๋งํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ ํ•ญ๋ชฉ์€ ์ข…์†์„ฑ์˜ ์ตœ์ƒ์œ„ ๋ชฉ๋ก์„ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ ํ•˜๋‚˜๋Š” _์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜_( setup.py )์šฉ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” _๊ฐœ๋ฐœ์šฉ_( Pipfile ).

setup.py ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „์ž์˜ ๊ฒฝ์šฐ $#$3 requirements.txt #$ ์—์„œ์™€ ๊ฐ™์ด ๊ฐœ๋ฐฉํ˜• ๋˜๋Š” ์™„์ „ํžˆ ๊ณ ์ •๋œ ์ข…์†์„ฑ์„ ์„ ์–ธํ•˜๋Š” ๋™์ผํ•œ ์˜ต์…˜์ด ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์—ฌ๊ธฐ์—์„œ ๊ฐœ๋ฐฉํ˜• ์ข…์†์„ฑ ๊ณ ์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Pipfile ์—„๊ฒฉํ•˜๊ฑฐ๋‚˜ ๋Š์Šจํ•œ ํ•€๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฅผ ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„์˜ _ํ‰ํ‰ํ•˜์ง€ ์•Š์€_ ๋ชฉ๋ก์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ requirements.txt ํŒŒ์ผ์—์„œ๋„ ์™„์ „ํžˆ ์œ ํšจํ•˜๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ„์˜ ์ฑ…์ž„ ๋ถ„๋ฆฌ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ•์—ฐ๊ณผ ๋ชจ๋“  ํŠœํ† ๋ฆฌ์–ผ, ๊ทธ๋ฆฌ๊ณ  PyPA์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์‹œ์ง€์—์„œ ์ด๊ฒƒ์ด ๊ฐ•์กฐ๋˜๋Š” ๊ฒƒ์„ ๋“ฃ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Pipfile.lock ๋ฐ requirements.txt ๋Š” ๊ฐ™์€ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. Pipfile.lock requirements.txt ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ค‘๊ฐœ์ž Pipfile ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์š”๊ตฌ ์‚ฌํ•ญ ํŒŒ์ผ์—์„œ ์ž ๊ธˆ ํŒŒ์ผ์„ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Pipfile.lock ๋Š” ์ „์ด์  ํด๋กœ์ € ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์ข…์†์„ฑ ํ•ด๊ฒฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ์ค‘๊ฐœ์ž Pipfile ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์›๋ž˜ ์งˆ๋ฌธ์— ๊ด€ํ•ด์„œ๋Š” ๋‹จ์ˆœํžˆ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋กœ ํฌํ•จํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” setup.py ํŒŒ์ผ์„ Pipfile ์™€ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. pipenv lock ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด setup.py ํŒŒ์ผ์˜ ์ข…์†์„ฑ์ด ์ž๋™์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€ @iddan ๋˜๋Š” ์„ค์ • ํŒŒ์ผ์— ๋‹ค์‹œ ์“ฐ๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ํŒŒ์„œ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ setup.py ๋Œ€ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€ํ•œ Donald Stufft์˜ ๊ธฐ์‚ฌ๋ฅผ ์ฝ๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. txt ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์ฐจ์ด์ ๊ณผ Pipenv์— ๊ตฌ์ฒด์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ด€๋ฆฌ์ž ์ค‘ ํ•œ ๋ช…์ด ์ด ์„ค๋ช… ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” K Health์— ๋…๋ฆฝ ์‹คํ–‰ํ˜• ์„œ๋น„์Šค์™€ ํŒจํ‚ค์ง€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋œ ์ €์žฅ์†Œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒจํ‚ค์ง€ ์†Œ๋น„์ž์™€ ์„œ๋น„์Šค์˜ ๊ฐœ๋ฐœ/๋ฐฐํฌ ๊ตฌ์„ฑ ๊ฐ„์˜ ์ตœ์ƒ์œ„ ์ข…์†์„ฑ์„ ๊ณต์œ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Pipenv๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Pipfile ์˜ ์ถœ๋ ฅ์„ setup.py ๋กœ ์–ป๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

#2148์˜ ๋ณ€ํ˜•์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค(Requirements.txt๋ฅผ Pipfile๋กœ ๋Œ€์ฒด).

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ setup.py ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ. ๋ฌธ์ œ. ํ•ด์•ผํ•œ๋‹ค. ์•„๋‹ˆ๋‹ค. ์ด๋‹ค. ๋‹ซ์€.

์ด ๋ฌธ์ œ๋Š” ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. Pipenv๋Š” ํŒจํ‚ค์ง• ๋„๊ตฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค .
  2. Pipenv์— ํŒจํ‚ค์ง• ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  3. ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ ์ค‘์— Pipenv๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์ข…์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
  4. Pipfile์€ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. Pipfile ํ˜•์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒจํ‚ค์ง• ๋„๊ตฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pipenv๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ์ž์‹  ์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์ œํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

๋˜ํ•œ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ •์ค‘ํ•˜๊ฒŒ ๋Œ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค. ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด ํ–‰๋™ ๊ฐ•๋ น์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ์ƒ์‚ฐ์ ์ธ ํ† ๋ก ์„ ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ž์› ๋ด‰์‚ฌ์ž์ด๋ฉฐ ๋‹จ์ˆœํžˆ ๊ฐœ์ธ์˜ ์†Œ์›์„ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๊ฒŒ์‹œ๋ฅผ ๊ท€์ฐฎ๊ฒŒํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋” ์ด์ƒ์˜ ๋…ผ์˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ์ž ๊ทธ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์š”์ ์„ ๋ถ„๋ช…ํžˆ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€๋งŒ ์ž˜ํ•˜๋ฉด ๋œ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

@Korijn ๋‚˜๋Š” ๋‹น์‹ ์ด extra_requires๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ setup.py๋ฅผ Pipfile๊ณผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  Pipfile.lock์˜ dev ์„น์…˜์— extra_require ํŒจํ‚ค์ง€๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋นˆ ํ™˜๊ฒฝ์— ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ  pipenv install --dev ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ Pipfile.lock์—๋Š” extra_require ์š”๊ตฌ ์‚ฌํ•ญ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— pipenv install_require ์—๋งŒ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

setup.py

import os  # noqa: D100
from setuptools import setup, find_packages


def read(fname):
    """Read a file and return its content."""
    with open(os.path.join(os.path.dirname(__file__), fname)) as f:
        return f.read()


setup(
    name='auditor_client',
    version='0.0.0',
    description='Auditor client package',
    long_description=read('README.md'),
    packages=find_packages(exclude=['tests']),
    install_requires=['requests==2.9.1'],
    extras_require={'dev': ['flake8', 'flake8-docstrings', 'pytest', 'coverage', 'tox']},
    setup_requires=["pytest-runner"],
    tests_require=["pytest"]
)

ํ•ํŒŒ์ผ

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

[packages]
"e1839a8" = {editable = true, path = "."}

[requires]
python_version = "3.6"

[dev-packages]
"e1839a8" = {editable = true, extras = ["dev"], path = "."}

Pipfile.lock

{
    "_meta": {
        "hash": {
            "sha256": "e58b833e497814c83a2f0b93ad21d33a2af8b72721b20e9607a6c9135978422d"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "e1839a8": {
            "editable": true,
            "path": "."
        },
        "requests": {
            "hashes": [
                "sha256:113fbba5531a9e34945b7d36b33a084e8ba5d0664b703c81a7c572d91919a5b8",
                "sha256:c577815dd00f1394203fc44eb979724b098f88264a9ef898ee45b8e5e9cf587f"
            ],
            "version": "==2.9.1"
        }
    },
    "develop": {
        "e1839a8": {
            "editable": true,
            "path": "."
        },
        "requests": {
            "hashes": [
                "sha256:113fbba5531a9e34945b7d36b33a084e8ba5d0664b703c81a7c572d91919a5b8",
                "sha256:c577815dd00f1394203fc44eb979724b098f88264a9ef898ee45b8e5e9cf587f"
            ],
            "version": "==2.9.1"
        }
    }
}

Pipfile.lock์ด extra_require dev ํŒจํ‚ค์ง€๋ฅผ ์ถ”์ ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์ด ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ, ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ฒ„๊ทธ/์ œํ•œ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๋ฒ„๊ทธ/์ด์Šˆ๋ฅผ ์ œ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์ฐพ์„ ์ˆ˜ ์—†์ง€๋งŒ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ํŠธ๋ž˜์ปค์—์„œ ์—ด๋ฆฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์—ด๊ธฐ ์ „์— ๊ธฐ์กด ๋ฌธ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์‹ญ์‹œ์˜ค. ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค :)

์ด๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ pipfile์—์„œ ๋™์ผํ•œ ๊ธฐ๋ณธ ํ•ญ๋ชฉ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. dev ์„น์…˜๊ณผ ๊ธฐ๋ณธ ์„น์…˜์—์„œ๋„ ์ข…์†์„ฑ์„ ์ง€์ •ํ•˜๋ฉด ๊ธฐ๋ณธ ์„น์…˜์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด ๊ธฐ๋ณธ ์„น์…˜์ด ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ๊ณ  ์‹คํ—˜์„ ์ง„ํ–‰ํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์‹œ๊ฐ„์ด ์—†์œผ๋ฏ€๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ๊ฐœ๋ฐœ ์ข…์†์„ฑ์ด ์ถฉ๋Œ์„ ์ˆจ๊ธฐ๊ณ  ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋  ๋•Œ ์ข…์†์„ฑ ์ถฉ๋Œ๊ณผ ๋†€๋ผ์›€์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๋Œ€ํ•ด ๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@techalchemy ์ด ๊ฒฝ์šฐ ๋‚ด ๊ฐœ๋ฐœ ์ข…์†์„ฑ์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? pipenv๋ฅผ ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚ด ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณด์•˜๊ณ  packages / dev-packages ๊ตฌ๋ถ„์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. packages {editable = true, extras = ["dev"], path = "."} ๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ด pipenv-setup ํŒจํ‚ค์ง€๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค

pipfile/lockfile์„ setup.py์— ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

$ pipenv-setup sync

package e1839a8 is local, omitted in setup.py
setup.py successfully updated
23 packages from Pipfile.lock synced to setup.py

$ pipenv-setup sync --dev ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฐœ๋ฐœ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋Œ€์‹  pipfile์„ ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด $ pipenv-setup sync --pipfile

๋ฐ $ pipenv-setup check ๋Š” ๊ฒ€์‚ฌ๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ๋ช…๋ น์œผ๋กœ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์„ธ์š” ๐Ÿ’ฏ

pipenv-setup ํŒจํ‚ค์ง€๋ฅผ pipenv์— ๋ณ‘ํ•ฉํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@peterdeme

pipenv-setup ํŒจํ‚ค์ง€๋ฅผ pipenv์— ๋ณ‘ํ•ฉํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@uranusjr @techalchemy ์œ„์˜ ๋…ผ์˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ pipenv๋Š” ๋‹ค์†Œ ๋‹ค๋ฅธ ์ฒ ํ•™์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ด€๋ฆฌ์ž๊ฐ€ ๋™์˜ํ•œ๋‹ค๋ฉด pull ์š”์ฒญ์„ ์ œ์ถœํ•˜๊ณ  pipenv-setup ํ†ตํ•ฉ์„ ์‹œ๋„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ๋œ json ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ญ์ƒ Pipfile.lock ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. setup.py install_requires ์— ๋Œ€ํ•œ non-dev ์ข…์†์„ฑ์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
"default" ํ‚ค๋Š” version ์ˆซ์ž ๋ฐ markers ์™€ ํ•จ๊ป˜ ํŒจํ‚ค์ง€ ์ด๋ฆ„์˜ ์ค‘์ฒฉ๋œ "dicts"๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
์™ธ๋ถ€ ์ˆ˜์ž…ํ’ˆ์— ์˜์กดํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@Kilo59 ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๋‹ค. ์–ธ๊ธ‰ํ•  ํŒ์€ Pipfile.lock์„ setup.py์— data_file๋กœ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค(๋˜๋Š” MANIFEST.in์— ํฌํ•จ). ๊ณ ์ •๋œ ์ข…์†์„ฑ์ด ์žˆ๋Š” ์ž ๊ธˆ ํŒŒ์ผ์šฉ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— pipfile์€ Pipfile์—์„œ ์˜๋ฏธ ์ฒด๊ณ„ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์›ํ•  ๊ฒฝ์šฐ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ข…์†์„ฑ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์—ฌ๋Ÿฌ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Madoshakalaka ๋•๋ถ„ ์— ๋„๊ตฌ๊ฐ€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” Setup.py์˜ ์ข…์†์„ฑ์ด Pipfile์˜ ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ๊ณผ ๋‹ค๋ฅด๋‹ค๋Š” ๋‹ค๋ฅธ ๋™๋ฃŒ๋“ค๊ณผ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ˆ˜๋™ ์ž‘์—… ์—†์ด ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜คํƒ€/์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์€์ƒ‰ setup.py๋„ ์ข‹์€ ํ„ฐ์น˜์˜€์Šต๋‹ˆ๋‹ค.+1:

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