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์ ์ฌ์ฉํ์ฌ ์ด๋ป๊ฒ ๋์ผํ ์์ ์ ์ํํ ์ ์์ต๋๊น?
์๋ ์ฝ๋๋ก ์ด ์์ ์ ์ํํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ํ์ฌ ํ๋ก์ ํธ์์ 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 ๊ธฐ๋ฐ ๋น๋ ์์คํ ์ ์ฆ์ ์คํํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฒซ์งธ, ๋ฉด์ฑ ์กฐํญ: ์ ์ ๋ฌธ ์ง์์ ์ฃผ๋ก lib ํจํค์ง์ ๊ดํ ๊ฒ์ ๋๋ค. ์ผ๋ถ ํฌ์ธํธ๋ฅผ ๋์น ์ ์์ต๋๋ค. ๋๋ ํ๋ฆด ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํ๊ณ ์์ผ๋ฉฐ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค!
๋ํ ์ด๊ฒ์ ๋ด ๋จธ๋ฆฌ๋ฅผ ๋ช ๋ฒ ๊ธ๊ฒํ์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๋ํ ์ฝ๊ฐ์ ๋ฆฌ๋ทฐ๋ฅผ ์ ๋ง๋ก ์ํฉ๋๋ค.
์, ์ด์ ์ฌ๊ธฐ๋ก ๊ฐ์๋ค.
@elgertam ์ด๋ผ๋ ๋ฌธ์ฅ์ผ๋ก ์์ํ๊ฒ ์ต๋๋ค.
numpy
๋ฅผ ํ๊ฒฝ์ ์ถ๊ฐํ์ง๋ง ์ฑ์ ์ข ์์ฑ์numpy
๋ฅผ ์ถ๊ฐํ์ง ์์์ต๋๋ค.๊ทธ๊ฒ์ ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ฒ์ ๋๋ค. ๊ณ์ ์ฝ์ผ์๋ฉด ์ ๋ง์ด ๋ฌด์จ ๋ป์ธ์ง ์๊ฒ ๋์ค ๊ฒ๋๋ค.
๋๋๊ฒ๋, ๋น์ ์ด ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ๋ค๋ฉด ๋น์ ์ ์ฌ์ฉ๋ฒ์ ๊ทธ๋ ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค:
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
๊ฐ์ ๊ฒ.๋๋ ์:
Pipfile
๋ ํจํค์ง์ ์ข ์์ฑ์ด ์๋๋ผ ํ๊ฒฝ์ ์ค๋ช ํ๋ ๊ฒ์ ๋๋ค. ๋ณด์๋ค์ํผ ์์Pipfile
๋ ํธ์ง ๊ฐ๋ฅํ ๋ชจ๋์ ๋ก์ปฌ ํจํค์ง์ธ ์ค์นํ๋ ค๋ ํญ๋ชฉ์ ์ ์ํฉ๋๋ค.์ด๊ฒ์ ์ง๊ธ์ ๋ชจ๋ ๋จ์ผ ํจํค์ง๋ก ๊ตฌ๋๋๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ "์ธ๋ชจ์๊ฒ" ๋ณด์ผ ์ ์์ง๋ง
requests[security]
๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ์ค์นํ๊ณ ์ถ์ง๋ง ์ฑ์ ๋ํ ์๊ฒฉํ ์ข ์์ฑ์ ์๋๋๋ค.pipenv install requests[security]
ํ๊ณ ๋ค์์ ์ํํ์ญ์์ค.๊ทธ๋ฆฌ๊ณ ์ง์, ์ฌ๊ธฐ์ ์ถ์์ ์๊ตฌ ์ฌํญ๊ณผ ๊ตฌ์ฒด์ ์ธ ์๊ตฌ ์ฌํญ ๊ฐ์ ์ฐจ์ด์ ์ ๋ํ ์๊ฐ ์์ต๋๋ค.
gunicorn
๋๋ ํ๊ฒฝ์ ํ์ํ ๋ค๋ฅธ ๊ฒ์ ์ค์นํ๋ ค๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ด์ง๋ง ์ฑ ์์ฒด์ ์ผ๋ถ๋ ์๋๋๋ค.๋ด๊ฐ ์ด๊ฒ์ ์ถฉ๋ถํ ์ค๋ช ํ๋ค๋ฉด, ๋น์ ์ ๊ทธ๊ฒ์ด ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋์ด ์์์ ์ ์ ์์ต๋๋ค.
install_requires
์ ์ข ์์ฑ์ ๋ฃ๊ณPipfile
์ ํจํค์ง๋ฅผ ๋ฃ์ ๋ค์ ์ฌํ์ฑ์ ์ํดPipfile.lock
์ ํจ๊ป ํ๊ฒฝ์ ์ป์ต๋๋ค. ํจํค์ง ์ข ์์ฑ).test_require
์ ๊ฒฝ์ฐ ์ด๊ฒ์ด ์ด ๋ชจ๋ ๊ฒ์ ๋ง๋์ง ํ์ ํ ์ ์์์ ์ธ์ ํฉ๋๋ค. IIRC,setuptools
ํน์ ๊ธฐ๋ฅ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ํ ์คํธ๋ฅผ ์ํ ์ถ์์ ์ธ ์ข ์์ฑ ์งํฉ์ด๋ผ๊ณ ์ฃผ์ฅํ ์ ์์ผ๋ฉฐpipenv
์์ ํด๊ฒฐํ๊ณ ์ค์นํ ๋ค์ ๋ชจ๋ ํจํค์ง์ ๋ํดpipenv install --dev
๋ฅผ ์ํํ ๊ฒ์ผ๋ก ์์ํ ์ ์์ง๋ง ์ ๋ ๊ทธ๊ฒ์ด ์ณ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ๋ํ ๋ช ํํ ์๊ฐ์ด๋ ์๊ฒฌ์ด ์์ผ๋ฉฐ ์ด์ ๋ํ ๊ทผ๊ฑฐ๋ ์์ต๋๋ค. ์ฃ์กํฉ๋๋ค.์ด ๋ชจ๋ ๊ฒ์ด ์ด๋ป๊ฒ๋ ์ดํด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.