์ ๋ pipenv๋ก Python ํจํค์ง๋ฅผ ์์
์ค์ด๋ฉฐ setup(install_requires=...)
๋ฅผ Pipfile์ ๋ฐํ์ ์ข
์์ฑ๊ณผ ๋๊ธฐํ๋ ์ํ๋ก ์ ์งํด์ผ ํ๋ ๋ฌธ์ ์ ์ง๋ฉดํด ์์ต๋๋ค. ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๊น?
[๋ต๋ณ 2019-08-23] ์๋์์๋ ๋ ผ์๋๋ ๋ชจ๋ฒ ์ฌ๋ก:
์ค์น ํ๋ก๊ทธ๋จ์ ๋ฐฐํฌ๋๊ฑฐ๋ ๋ฐฐํฌ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ Pipfile๋ง ์ฌ์ฉํฉ๋๋ค.
setup.py๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง๋ก ๋ฐฐํฌ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ ๋ชจ๋ ์ข ์์ฑ์ install_requires์ ๋ฃ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์
pipenv install '-e .'
๋ฅผ ์คํํ์ฌ Pipfile์ด setup.py์ ์ข ์๋๋๋ก ํฉ๋๋ค.
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 ๋ช ๊ฐ์ง ์ด์ ๋ก ํ์๋์์ต๋๋ค.
setup.py
ํ์ผ์ ์ค์ ๋ก ๋๊ธฐํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋๋ค. ๊ทธ ์์ฒด๋ก ์ธ๋ถ ์ฌํญ์ ๋
ผ์ํ๋ ๋งํฌ๋ ๊ธฐ์ฌ๊ฐ ๋ง์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง tl;dr Pipfile
๋ ๋๋ต์ ์ผ๋ก ๋์ผํฉ๋๋ค. ์ต์์ requirements.txt
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
์ ๊ดํ ๊ฒ์
๋๋ค.
์ด๊ฒ. ๋ฌธ์ . ํด์ผํ๋ค. ์๋๋ค. ์ด๋ค. ๋ซ์.
์ด ๋ฌธ์ ๋ ์ข ๋ฃ๋์์ต๋๋ค.
์ ๋ง ์ด๋งํผ ์ ๊ฒฝ์ด ์ฐ์ด๋ฉด ๋๊ตฌ๋ฅผ ์ง์ ๋ง๋ค์ด์ฃผ์ธ์. ์ด ๋ฌธ์ ์ ๋ํ ๊ธฐ๋๊ฐ ๋งค์ฐ ๋๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์๋ฃจ์ ์ ๊ฒ์ํ๋ฉด ๊ด์ฌ์ ๋๊ธฐ๊ฐ ์ด๋ ต์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฌ์ธ๋ ฅ์ผ๋ก 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:
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ค์น ํ๋ก๊ทธ๋จ์ ๋ฐฐํฌ๋๊ฑฐ๋ ๋ฐฐํฌ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ Pipfile๋ง ์ฌ์ฉํฉ๋๋ค.
setup.py๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง๋ก ๋ฐฐํฌ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ ๋ชจ๋ ์ข ์์ฑ์ install_requires์ ๋ฃ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์
pipenv install '-e .'
๋ฅผ ์คํํ์ฌ Pipfile์ด setup.py์ ์ข ์๋๋๋ก ํฉ๋๋ค.[์ ๋ฐ์ดํธ 2019-08-23] ์์ฆ์๋ dev ํจํค์ง๋ฅผ Pipfile์ ๋ณด๊ดํ๊ณ ๋ฐํ์ ์ข ์์ฑ๋ง setup.py์์ ์คํ๋ฉ๋๋ค.