maya
ํดํน ๋๋ ๋ช ๊ฐ์ง ๊ตํ์ ์ป์๊ณ , ๊ทธ ๊ฒฐ๊ณผ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ pipenv
์ ๊ถ์ฅ ์ฌ์ฉ์ ์ ์ํ์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ ์์ ๊ฒํ ํ๊ณ ํฉ์์ ๋๋ฌํ๋ฉด (์
๋ฐ์ดํธ๋) ํ
์คํธ๊ฐ pipenv
๋ฌธ์๊ฐ ๋ ์ ์์ต๋๋ค.
pipenv
ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ๋ฅผ ์ํ ํจํด ๋ฐ ์ํฐํจํดํธ์งํ๋ค
๋ค์์ ๋ค๋ฅธ ํ์ด์ฌ ๋ฒ์ ๊ณผ OS์์ ์คํ๋์ด์ผ ํ๋ ์ผ๋ฐ(๋๋ถ๋ถ ์คํ ์์ค) ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค. ์๊ฒฉํ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์์ ๊ฐ๋ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค(์ด์จ๋ ๋ชจ๋ ๋ฌธ์ ์น์
์ ๊ฒํ ํด์ผ ํจ).
ํธ์ง ๋
TL;DR : pipenv
ํ์ผ์ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ์ ์ถ๊ฐํ๋ฉด ์ถ๊ฐ ๋ณต์ก์ฑ์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณด์์ ์๋ฌด๊ฒ๋ ์ถ๊ฐํ์ง ์์ผ๋ฉด์ ์ผ๋ถ ์ค๋ฅ๋ฅผ ์จ๊ธธ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก Pipfile
, Pipfile.lock
๋ฐ .env
๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค ์ ์ด์์ ์ ์ธํ์ญ์์ค.
.gitignore
์๋ ํ์ผ์ ๊ด๊ณ์์ด pipenv
์ ๋ชจ๋ ๊ธฐ๋ฅ ์
ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก setup.py
์๋ ํ๋ก์ ํธ๋ฅผ ์๋ฏธํ๋ฉฐ, ํ์ด์ฌ ๋ฒ์ ๋ฐ/๋๋ OS๊ฐ ๋ค๋ฅธ ๋ค์ํ ํ๋ซํผ์์ ๋ฐฐํฌ ๋ฐ ์ฌ์ฉ์ ๋์์ผ๋ก ํฉ๋๋ค.
maya
, requests
, flask
๋ฑ์ด ์์
๋๋ค.
๋ค๋ฅธ ์ชฝ(ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋)์๋ ํน์ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ, OS๋ฅผ ๋์์ผ๋ก ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ผ๋ฉฐ ์ข ์ข ์๊ฒฉํ๊ฒ ์ผ๊ด๋ ํ๊ฒฝ์ ๋ฐฐํฌ๋ฉ๋๋ค.
pipfile
Pipfile ๋ setup.py ์์ ์ด๋ฌํ ์ฐจ์ด์ ์ ๋งค์ฐ ์ ์ค๋ช
ํฉ๋๋ค.
pipenv
(๋ฐฐํฌ ๋๊ตฌ)๋?pipenv
๋ ๋ค์์ ํ์ฉํ๋
Pipfile.lock
)์ฌ๋ฌ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ์ผ๊ด๋ Python ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ฑฐ๋ ๊ฐ๋ฐํด์ผ ํ ๋ ๋์์ด ๋ฉ๋๋ค.
pipenv
ํจํค์ง ๋๊ตฌ๋ฅผ ํธ์ถ ํ๋ ๊ฒ์ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๊ฑฐ๋ ์์ฑ์ ๊น์ด ๊ด์ฌํ ๊ฒ์ผ๋ก ์์ ์คํด์ ์์ง ๊ฐ ์์ต๋๋ค. ์, pipenv
๋ ๋ง์ ๋์์ด ๋ ์ ์์ง๋ง(๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ก์ปฌ ๊ฐ๋ฐ์์) ํด๋ฅผ ๋ผ์น ์ ์์ต๋๋ค(์ฌ๊ฐํ ์๊ฐ ์์ด ์ฌ์ฉํ ๋ ์ข
์ข
CI ํ
์คํธ์์).
TL;DR : pipenv
๋ Pipfile.lock
ํ์ผ์ ์ค๋ช
๋ ์น์ธ๋ ๊ตฌ์ฒด์ ์ธ ์ข
์์ฑ ์ python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ถ์ ์ข
์์ฑ์ ์ ์ํ ์๋ง ์์ต๋๋ค(๋ฐ๋ผ์ Pipfile.lock
์ ๊ณตํ ์ ์์).
pipenv
๋ ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๋ ๋ฐฐํฌ ์๋๋ฆฌ์ค์์ ๋น์ ๋ฐํฉ๋๋ค.
Pipfile
)Pipfile.lock
์ด๋ํ๋ ๊ตฌ์ฒด์ ์ธ ์ข
์์ฑ์ ์์ฑํฉ๋๋ค.Pipfile.lock
์ ์น์ธ๋ Python ํ๊ฒฝ์ ์ ์๋ก ๋ฆด๋ฆฌ์คํฉ๋๋ค.pipenv sync
๋ฅผ ์ฌ์ฉํ์ฌ "ํฉ๊ธ" Pipfile.lock
์ ์ ์ฉํ์ฌ ๋์ผํ ํ์ด์ฌ ํ๊ฒฝ์ ์ป์ ์ ์์ต๋๋ค.๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ตฌ์ฒด์ ์ธ ์ข ์์ฑ์ ์ ์ํด์๋ ์ ๋๋ฏ๋ก ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ๋ฉด ์ด๋ฌํ ๋ณด์์ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์ด ๊ท์น์ ์ด๊ธฐ๋ฉด(๋ฐ๋ผ์ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ๊ตฌ์ฒด์ ์ธ ์ข ์์ฑ์ ์ ์ธํ๋ ค๊ณ ํจ) ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
setup.py
์ ์๋ ์ข
์์ฑ ์จ๊ธฐ๊ธฐsetup.py
๋ install_requires
๋ฅผ ํตํด ๋ชจ๋ ์ถ์ ์ข
์์ฑ์ ์ ์ํฉ๋๋ค.
Pipfile
์ด๋ฌํ ์ข
์์ฑ์ ์ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ์จ๊ธธ ์ ์์ต๋๋ค.
install_requires
์ข
์์ฑ์ด ์์ต๋๋ค.Pipfile
๋ ์ข
์์ฑ์ ๋ํ ํน์ ๊ท์น(๋ฒ์ ๋ฒ์ ๋ฑ)์ ์ ์ํ์ง๋ง install_requires
๋ ์ ์ํ์ง ์์ต๋๋ค.์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ค์ ๊ท์น์ ๋ฐ๋ฅด์ญ์์ค.
Pipfile
๋ํ๋์ง ์์์ผ ํฉ๋๋ค.[packages]
์น์
Pipfile
๋ ์ค ํ๋๋ฅผ ๋น์ฐ๊ฑฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด์ ๋จ ํ๋์ ์ข
์์ฑ์ ์ ์ํด์ผํ๋ค.Pipfile.lock
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฅ์์ Pipfile.lock
(์ผ๋ฐ์ ์ผ๋ก "๋ณด์์์ ์ด์ ๋ก")๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์๋ชป๋์์ต๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
Pipfile.lock
๋ฅผ ์ ๊ฑฐํ๊ณ .gitignore
tox
์ ๊ฒฝ์( usedevelop
์จ๊ธฐ๊ธฐ)tox.ini
์ ๋ค์๊ณผ ๊ฐ์ commands
์น์
ํญ๋ชฉ์ด ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ:
pipenv install
pipenv install --dev
pipenv lock
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ข ์ข ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
pipenv install
๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด๋ง ์ค์นํ๊ณ tox
๋ (๊ธฐ๋ณธ์ ์ผ๋ก) ์ค์นํฉ๋๋ค. ๊ทธ๋ ๋ค ์ด์ค์ฑ์์ ๊ทธ๊ฒ์ ๋ํ์ ๋ฐฉ์ง usedevelop=True
๋ฐ usedevelop=False
์์ tox.ini
๋๋ฌธ์ Pipenv
ํ๋์ ๋ณํ (๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ํํ ํ ์ tox.ini
๋ ๋ค๋ฅธ ํ๊ฒฝ์์ ์ฐจ์ด๋ฅผ ํ์ฉํฉ๋๋ค).์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
pipenv
์ tox.ini
. ์์ฒญ ๋ณด๊ธฐ pipenv
์คํจ ์ ๋น๋ ์ค๋จpipenv
์(๋) ๊ฐ๋ฐ ์ค์ด๋ฉฐ ์ธ์ ๊ฐ๋ ์ค๋จ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ก ์ธํด CI ๋น๋๊ฐ ์ค๋จ๋๋ ๊ฒฝ์ฐ pipenv
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ธฐ์กด ๋๊ตฌ(๋ณดํต ์ข ๋ ์ฑ์ํจ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉ์งํ ์ ์๋ ์ค๋ฅ๊ฐ ์์ต๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
pipenv
๋ฅผ CI ๋น๋ ์คํฌ๋ฆฝํธ, tox.ini
๋๋ ์ ์ฌํ ์์น์ ์ถ๊ฐํ๊ธฐ ์ ์ ๋ ๋ฒ ์๊ฐํ์ญ์์ค. ์ถ๊ฐํจ์ผ๋ก์จ ์ป๋ ๊ฐ์น๊ฐ ๋ฌด์์ธ์ง ์์ญ๋๊น? ๊ธฐ์กด ๋๊ตฌ๋ก ์์
์ ์ํํ ์ ์์ต๋๊น?python ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ์์ pipenv
์ญํ ์ ๋ํ ์ฃผ์ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
pipenv
์ค์ ๋ก ์ ๊ณตํ๋ ๊ฐ์น๋ ๋ฌด์์
๋๊น? A: Virtualenv ๊ด๋ฆฌ ๋๊ตฌ.pipenv
๊ด๋ จ ์ฌ์ฉ ์ฌ๋ก๋ ๋ฌด์์
๋๊น? A: virtualenv๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.๋ช ๊ฐ์ง ๋ ์์ธํ ์ ๋ณด์ ํธ๋ฆญ์ด ๋ค๋ฐ๋ฆ ๋๋ค.
pipenv
๋ ํจํค์ง์ ๋ณด์์ ์ถ๊ฐํ์ง ์์ต๋๋ค.๋ชจ๋ ์ฌ๋์ด ํ๊ธฐ ๋๋ฌธ์ ๋๋ ์ถ๊ฐ ๋ณด์์ ๊ธฐ๋ํ๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ์ ํธ์ํ์ง ๋ง์ญ์์ค. ๋น์ ์ ์ค๋ง์ํฌ ๊ฒ์ ๋๋ค.
๊ตฌ์ฒด์ ์ธ(๋ฐ ์น์ธ๋) ์ข ์์ฑ์ ์ฌ์ฉํ์ฌ ๋ณด์์ ์ค์ ํ๋ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ค ๋จ๊ณ์์ ์ํํด์ผ ํฉ๋๋ค.
Pipfile
, Pipfile.lock
๋ฐ .env
ํ์ผ์ ์ ์ฅ์์์ ์ ์ธํ์ผ์ .gitignore
๋ฃ์ต๋๋ค.
Pipfile
๋ setup.py
์ด๋ฏธ ์ ์๋์ด ์๋ ์๊ตฌ ์ฌํญ์ ๋๋ถ๋ถ ๋๋ ์ ๋ถ๋ฅผ ์๋์ ๊ฐ์ด ์ฝ๊ฒ ์ฌํํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ .env
ํ์ผ์๋ ์๋ง๋ ๊ฐ์ธ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ ๊ฒ์ด๋ฏ๋ก ๊ณต์ ํด์๋ ์ ๋ฉ๋๋ค.
์ด๋ฌํ ํ์ผ์ ์ ์ฅ์ ์ธ๋ถ์ ๋ณด๊ดํ๋ฉด ์ ์ ํ์ง ์์ ์ํฉ์์ pipenv
๋ฅผ ์ฌ์ฉํ ๋ CI ๋น๋์์ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
pipenv
๊ฐ๋ฐ์์ ๊ฐ์ธ ๋๊ตฌ ์์pipenv
๋ virtualenv ๊ด๋ฆฌ ๋๊ตฌ๋ก์ ๊ฐ๋ฐ์์ ์์
์ ๋จ์ํํ ์ ์์ต๋๋ค.
๋น๊ฒฐ์ (๋น๊ณต๊ฐ) pipenv
๊ด๋ จ ํ์ผ์ ๋น ๋ฅด๊ฒ ์ฌ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ์
๋๋ค. ์:
$ cd <project_repository>
$ # your library will bring the dependencies (via install_requires in setup.py)
$ pipenv install -e .
$ # add more dev tools you preffer
$ pipenv install --dev ipython pdbpp
$ # start hacking
$ pipenv shell
...
ํธ๋ฆฌํ ํ๊ฒฝ๋ณ์ ์ค์ ๋ฐฉ๋ฒ์ด ํ์ํ์๋ฉด .env
ํ์ผ์ ์ฌ์ฉํ์ธ์.
๊ธฐ์ตํ์ญ์์ค: pipenv
์ฌ์ฉ๋์ CI ๋น๋์์ ์ ์ธํ๋ฉด ์ถ์ด ๋ ๋จ์ํด์ง๋๋ค.
setup.py
๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ์ข
์์ฑ ์ ์ธsetup.py
์์ extras_requires
์น์
์ ์ฌ์ฉํฉ๋๋ค.
from setuptools import setup
setup(
name='mypackage',
....,
install_requires=["jinja2", "simplejson"],
extras_require={
'tests': ['pytest', 'pyyaml'],
'pg': ['psycopg2'],
},
....
)
tests
extra์ ๋ํด ์ ์ธ๋ ๋ชจ๋ ์ข
์์ฑ์ ์ค์นํ๋ ค๋ฉด:
$ pipenv install -e .[tests]
ํญ์ install_requires
์ข
์์ฑ์ด ํฌํจ๋ฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์ข ์์ฑ์ ๊ธฐ๋ณธ ๋ฐ ๊ฐ๋ฐ ์น์ ์ผ๋ก ๋ถํ ํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ง๋ง ์์๋๋ ์๋๋ฆฌ์ค์์๋ ์ค์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ์ธ์์ ์ ๋๋ค. ์ปดํ์ผํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์กฐ๊ธ ๋ ์์ธํ ๋ฆฌ๋ทฐํ๊ฒ ์ต๋๋ค.
/cc @uranusjr @jtratner @ncoghlan
maya
๋ฌธ์ ์ ๋ํ ์ผ๋ถ ์ฐธ์กฐ:
pendulum>=1.0
์์ : ๋ฒ์ ์ด Pipfile์ ์์์ง๋ง setup.py์์ ๋๋ฝ๋จ)pipenv
๋ฌธ์ ๊ฐ ์ ์ฒด Travis ์คํ์ ์ค๋จ์ํจ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ PR)๋๋ ์ด๊ฒ์ ์ข์ํ๋ค. Pipenv์ ๋ฌธ์๋ Python Packaging User Guide ์ ์ด๊ฒ์ ์ถ๊ฐํด์ผ ํ ์๋ ์์ต๋๋ค.
์ ์กฐ์ธ์ ๊ฒฐ๊ณผ๋ "๊ฒฐ์ ๋ก ์ /์ฌํ ๊ฐ๋ฅํ CI ๋น๋๋ฅผ ํฌ๊ธฐ"ํ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ, ์ด๋ ์ ์๊ฒ ๋งค์ฐ ํฐ ๋ฐํจํด์ผ๋ก ๋ณด์ ๋๋ค.
์ฌ์ ํ ๊ฒฐ์ ๋ก ์ ํ์ฉํ ๋์์ผ๋ก ๋ฌด์์ ์ ์ํ๊ณ ์์ต๋๊น?
@tsiq-oliverc ๊ฒฐ์ ์ ๋น๋๋ ํ์ฌ ๊ทธ ์๋ฆฌ๋ฅผ ์ฐจ์งํ๊ณ ์์ผ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ์์ ์ ๋๋ค.
Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฐ์ ๋ก ์ ๋น๋๋ฅผ ์ํํ๋ ค๋ ๋ค์ ์๋๋ฅผ ์์ํด ๋ณด์ญ์์ค.
Pipfile.lock
๊ธฐ๋ฐ์ผ๋ก ํด์ผ ํฉ๋๋ค.Pipfile
์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ์ ์ข
์์ฑ์ผ๋ก ์ธํด ์๋ก ๋ค๋ฅธ Pipfile.lock
๊ฐ์ง ์ ์์ต๋๋ค.Pipfile.lock
์ธ์คํด์ค๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. CI ๋น๋ ์ค์ Pipfile.lock
์๋์ผ๋ก ๋น๋ํ๋ฉด ๊ฒฐ์ ์ฑ์ด ์ถ๊ฐ๋์ง ์์ต๋๋ค.์ด๊ฒ์ ๋ง์ ์ถ๊ฐ ๋
ธ๋ ฅ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ์ป๋ ๊ฒ์ ๋ค๋ฅธ ์ปจํ
์คํธ์ ์ค์น๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ(์: 1์ฃผ์ผ ํ์ ํ์ค ์ค์น๊ฐ ์
๊ทธ๋ ์ด๋๋ ์ข
์์ฑ์ ์ ํํฉ๋๋ค) ์ฌ์ค์์ ์๋ฌด ๊ฒ๋ ์ป์ง ๋ชปํ๋ Pipfile.lock
๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ํ์ฌ๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์ถฉ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ด๋ถ์ ์๊ฒฉํ ์ข ์์ฑ์ ์ ์ํด์๋ ์ ๋๋ค๋ ์ฌ์ค์ ๋๋ค.
python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๊ฒฐ์ ๋ก ์ ๋น๋๋ฅผ ์ป๋ ๋ ๋ค๋ฅธ ๋์์ด ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ค๋ช ํ์ญ์์ค.
@vlcinsky - ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋น์๊ฐ ๋ค๋ฅธ ๋ฒ์ ์ ์ข ์์ฑ ๋ฑ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ์ดํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌ์๊ฐ ์ด๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ์คํ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ชฉํ๋ ์๋ง๋ ํจ์ฌ ๋ ์์ ๋ฒ์์ผ ๊ฒ์ ๋๋ค. ํนํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ง ๊ด๋ฆฌ์์ ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(๋๋ต ๋๋ฑํจ).
์ด ์ธ ๊ฐ์ง ์ค ํ๋๋ผ๋ ์ถฉ์กฑ๋์ง ์์ผ๋ฉด ํ์ง ๊ด๋ฆฌ์ ๋ฐ๋๋๋ ๊ฒ์ ๋๋ค.
์, ์๋น์์๊ฒ Python ๋ณํ A, B ๋ฐ C๋ฅผ ์ง์ํ๋๋ก ๋ณด์ฅํ๊ณ ํ๋์ ์ ๊ธ ํ์ผ(๋ฑ)์ด ์๋ฆฌ์ง ์์ ์ ๋๋ก ๋ค๋ฅด๊ฒ ๋์ํ๋ค๋ฉด ์ธ ๊ฐ์ ์ ๊ธ ํ์ผ(๋๋ ๋ฌด์์ด๋ ).
๊ทธ๋ฌ๋ ์ค์ ๋ก ์ผ๋ง๋ ์ฌ์ด์ง ์๊ธฐ ์ํด Pipenv๋ฅผ ์ถฉ๋ถํ ์ฌ์ฉํ์ง ์์์ต๋๋ค.
ํ์ฌ CI ์์คํ
์ ๋ํ ๋ช ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ์๋ Pipfile
์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค.
ํ์ฌ ์ ์ฒด์ ๋ณด์ ์ง์นจ์ ์ค์ํ๊ธฐ ์ํด ์ข ์์ฑ ์ ๊ธ(+ํด์ฑ)์ด ์ ๋์ ์ผ๋ก ํ์ํ๋ฉฐ ํ์ฌ ๊ณต์์ ์ผ๋ก ์ง์๋๋ ๋ฒ์ ์ด ํ๋๋ง ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ Python ๋ฒ์ ์ผ๋ก ํ ์คํธํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ pipenv๊ฐ virtualenv๋ฅผ ํฌํจํ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ ์ ๋จ์ํํ๋ค๋ ์ฌ์ค์ ์ข์ ๋ถ์์ฉ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ์ป๋ ๊ฒ์ ๋ค๋ฅธ ์ปจํ ์คํธ์ ์ค์น๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ(์: 1์ฃผ์ผ ํ์ ํ์ค ์ค์น๋ ์ ๊ทธ๋ ์ด๋๋ ์ข ์์ฑ์ ์ ํํฉ๋๋ค) ์ฌ์ค์์ ์๋ฌด ๊ฒ๋ ์ป์ง ๋ชปํ๋
Pipfile.lock
๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ํ์ฌ๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋ณดํธ์ ์ผ๋ก ์ฌ์ค์ด ์๋๋๋ค. ์ํฐํ๋ผ์ด์ฆ ์ํํธ์จ์ด์ ์ธ๊ณ์๋ ์ฌ์ ํ ๊ณต์์ ์ผ๋ก ์ง์๋๋ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ํ๊ฒฝ์ด ์์ผ๋ฉฐ ์ข ์์ฑ์ ๋ณด์ ๋ฌธ์ ๋ก ์ธํด ๊ณ ๊ฐ์ด ์ข ์์ฑ์ ์ ๋ฐ์ดํธํ๋ ๋์ ์ ํ์ด ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
(์, ์ฌ๊ธฐ์์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค ...)
@Moritz90 ๊ทํ์ ์๋๋ฆฌ์ค๋ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์ python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๊ฒ์ด๋ฉฐ pipenv
๊ฐ ํจ์ฌ ๋ ๊ฒฐ์ ์ ์ธ ํ๊ฒฝ์ด๊ธฐ ๋๋ฌธ์ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ด ์ค๋ช
์ ์ปจํ
์คํธ๊ฐ ํจ์ฌ ๋ ๊ฐ๋ณ์ ์ธ flask
, request
, maya
๋ฑ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ชฉํ๋ก ํฉ๋๋ค. maya
์์ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๋ฉด ๋ง์ ๊ฒฝ์ฐ pipenv
์ฌ์ฉํ๋ฉด ์ค์ ๋ฌธ์ (์ผ๋ฐ์ ์ผ๋ก ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ง๋๋ ๋ฌธ์ ๋ฅผ ์จ๊น)๋ฅผ ๋ฐ์์ํค๋ ๋ฐ๋ฉด ๋ง์ ์ถ๊ฐ ๋๋ ์ถ๊ฐ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์ด ์ข์ ๊ฐ์ ๋๊ผ์ต๋๋ค. ๊ฐ.
๊ฒฐ์ ์ ๋น๋๋ฅผ ์ป๋ ๊ฒ์ ์ข์ ์ผ์ด์ง๋ง ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ชปํ๋ฉด ๋ ๋ฎ์ ํ์ง์ ๊ฒฐ๊ณผ์ ๋ํด ์ถ๊ฐ ๋น์ฉ์ ์ง๋ถํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ ๊ฐ ๋ฐฉ์งํ๊ณ ์ถ์๋ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋น๋๊ฐ ์ ๋์ ์ผ๋ก ๊ฒฐ์ ์ ์ธ ๊ฒ์ ์ํ์ง ์๋ ๊ฒฝ์ฐ ์ค ํ๋๋ผ๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค. ==
์ข
์์ฑ์ ๊ณ ์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ฌ ๋ฒ์ ์ ๋ํ ์ง์์ ์ ์งํ๊ธฐ๋ก ์ฝ์ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ทธ๋ฐ ์์ผ๋ก ์ค๊ณํด์ผ ํฉ๋๋ค. CI์์ ๋น๋๋ฅผ ๊นจ๋ ์ข
์์ฑ ์
๊ทธ๋ ์ด๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ๊ทธ๋ฅผ ๋
ธ์ถํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ข์ ๊ฒ์
๋๋ค. ์์ ํ ๊ฒฐ์ ์ ์ธ ์ข
์์ฑ(Pipenv์์ ๊ด๋ฆฌ)์ ์ด๋ฅผ ๋ง์คํนํฉ๋๋ค. ๋น์ ์ด ๊ทธ๊ฒ์ ์ํ ๋ ๊ฒฐ์ ์ ์ผ ์ ์๋ค๋ ๊ฒ์ ์ฌ์ ํ โโ์ ์ตํ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ต์ ์ด ์๋๋๋ค.
@uranusjr - ๋ฌผ๋ก ์
๋๋ค. ๋๋ ์๋ง์ด "๋น๊ฒฐ์ ์ ๋น๋"๋ผ๋ฉด ์๋จ์ ์กฐ์ธ์ด ์๋ฏธ๊ฐ ์์ ์ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ฌ์ค, ์ด๊ฒ์ ๊ฑฐ์ ๋
ผ๋ฆฌ์ ์ผ๋ก ๋๋ฑํ๋ฉฐ ํจ์ฌ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋งํ ์ ์์ต๋๋ค. "๊ฒฐ์ ๋ก ์ ๋น๋๋ฅผ ์ํ์ง ์์ผ๋ฉด ๊ฒฐ์ ๋ก ์ ๋น๋๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ด ๋ชฉ์ ์ธ ๋๊ตฌ( pipenv
)๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค." ๐.
๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋์งํ ๋ชฉํ๋ ์๋๋๋ค.
@tsiq-oliverc ๋ฉ์ง ๋ฒ์ ์ ์ - ์ง์ค ํ ๋ก ์ ์ง์ํฉ๋๋ค. ํ ๊ฐ์ง ์๊ตฌ ์ฌํญ์ ๋ ์ถ๊ฐํ๊ฒ ์ต๋๋ค . CI ๊ฒฐ์ ๋ก ์ ํ ์คํธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์ ๊ฐ๋ฅํ ๋ฌธ์ ๋ฅผ ์จ๊ธฐ์ง ์์์ผ ํฉ๋๋ค.
Pipenv.lock
๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก virtualenv๋ฅผ ๋ง๋ค๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ CI ํ
์คํธ๋ฅผ ์คํํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ํํด์ผ ํ๋ ๊ธฐ๋ฅ์ ์ผ๋ถ์ธ ์ ์ ํ ์ข
์์ฑ์ ์ค์นํ์ต๋๋ค. ์ด์ ๊ด๋ จํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ป๊ฒ๋ ์์๋๋ฉด ์ฌ์ ์ค์น๋ ํ๊ฒฝ์์ ์ด ๋ฌธ์ ๋ฅผ ์จ๊ธธ ์ ์์ต๋๋ค.
๋์๊ฒ๋ CI๋ฅผ ๊ฒฐ์ ์ ์ธ ๋ฐฉ์์ผ๋ก ์คํํ๋ ๊ฒ๋ณด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๋ ๊ฒ์ด ๋ ์ค์ํด ๋ณด์ ๋๋ค. ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด(์: ๊ฒฐ์ ๋ก ๋ ์ง์ํ ์ ์๋ ๋น๊ณต๊ฐ pypi ์ธ๋ฑ์ค ๋ค์์ ํ ์คํธ ์คํ) ๋ฌธ์ ๊ฐ ์์ง๋ง ์ถฉ๋์ด ์๋ ๊ฒฝ์ฐ ์ฐ์ ์์๊ฐ ์์ต๋๋ค.
์คํดํ์ง ๋ง์ธ์. ๋น๊ฒฐ์ ์ ๋น๋๋ฅผ ์คํํ๊ณ ์ถ์ ๋ง์
@vlcinsky ๋ฌผ๋ก ์ ๋๋ค. ์ ๋ฐ์ดํธ๋ ๋ฌธ์์๋ ์ด๋ฅผ ๋ฐ์ํ๋๋ก ์ ๊ฒฝํ์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค. ํ์ฌ ๋ฌธ์๋ ์ฅ๋จ์ ์ ์ ์ค๋ช ํ๊ณ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ setup.py์ install_requires๋ฅผ ํตํด ์ถ์ ์ข ์์ฑ์ ์ ์ํฉ๋๋ค. [...]
์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ Pipfile์์ ์ข ์์ฑ๊ณผ ์ด๋ฅผ ๊ฐ์ ธ์ฌ ์์น๋ฅผ ์ ์ํ๊ณ ์ด ํ์ผ์ ์ฌ์ฉํ์ฌ Pipfile.lock์์ ๊ตฌ์ฒด์ ์ธ ์ข ์์ฑ ์ธํธ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. [...]
๋ฌผ๋ก Pipfile ๋ฐ pipenv๋ ๊ฐ๋ฐ ๋๋ ํ ์คํธ ํ๊ฒฝ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ์์๊ฒ ์ฌ์ ํ ์ ์ฉํฉ๋๋ค.
๋ฌผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ตฌ๋ถ์ด ๋ช ํํ์ง ์์ ํ๋ก์ ํธ๋ ์์ต๋๋ค.
(์ ๊ฒฝ์ฐ์ ํด๋น๋๋ ๋ถ๋ถ์ ๊ฐ์กฐ ํ์ํ์ต๋๋ค.)
๊ทธ๋๋ก ์ ์ง๋๋๋ก ํ๊ณ ์ถ์ต๋๋ค. ๊ทํ์ ์๋ณธ ๊ฒ์๋ฌผ์๋ PyPI์ ๊ฒ์๋ ์คํ ์์ค ํ๋ก์ ํธ์ ๋ํ ๋ฉด์ฑ โโ์กฐํญ ์์ด ํฌ๊ด์ ์ธ ์ค๋ช ์ด ๋๋ฌด ๋ง์ด ํฌํจ๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@Moritz90 ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๋๋ ๊ทธ ์ด์ ์ ๊ฐ์กฐํ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง ๋ ๋์ ๋๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
@Moritz90 ๊ทํ์ ์๊ฒฌ์ ๋ฐ์ํ์ฌ ์๊ฐ๊ธ์ ์ถ๊ฐํ์ต๋๋ค.
@vlcinsky - ๋ง์ด ๋ฉ๋๋ค. ๋๋ ๋น์ ์ด ๋ช ์์ ์ผ๋ก ๋น๊ฒฐ์ ์ ๋น๋๋ฅผ ์ํ์ง ์๋๋ค๋ ๊ฒ์ ์ดํดํ์ง๋ง, ๋น์ ์ด ์ํ๋ ๊ฒ๊ณผ ๋ถ๊ฐํผํ๊ฒ ๋๋ฑํ๋ค๊ณ ์๊ฐํฉ๋๋ค(์ฆ, ์ ์คํธ๋ฆผ ์ข ์์ฑ์ด ์ ๋ฐ์ดํธ๋ ๋ ๋ฌธ์ ๋ฅผ ํฌ์ฐฉํ๊ธฐ ์ํด).
ํฐ ์๋ฆฌ๋ก ์๊ฐํด๋ณด๋ฉด ์ด ์์ถฉ๋๋ ๋ ๊ฐ์ง ๋ชฉํ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น? ํ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ 2๋จ๊ณ CI ํ๋ก์ธ์ค๋ฅผ ๊ฐ๋ ๊ฒ์ ๋๋ค.
Pipfile.lock
๋ฅผ ํ์ฉํ๋ฏ๋ก ์์ ํ ์ฌํ ๊ฐ๋ฅํฉ๋๋ค.pipenv update
๋ฅผ ์คํํ ๋ค์ ํ
์คํธ๋ฅผ ์คํํ์ฌ ๋ชจ๋ ์ข
์์ฑ์ ์ต์ ํญ๋ชฉ์ ๊ฐ์ ธ์ต๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ธ ํ์ผ์ด ์๋ ๋์๊ณผ ๋์ผํ๋ค๊ณ ์๊ฐํฉ๋๊น?).@tsiq-oliverc ๊ฒฐ์ ์ ๋น๋๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ค์ ์ค์ ์ ์๊ฐํฉ๋๋ค.
pipenv
pipenv
๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นํ๋ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด๋ฅผ ์ค์นํ๋ ๊ฒ๊ณผ ์ ์ฌํ์ง๋ง ์์
์ ์ํํ๋ ์ฝ๋๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ์คํ ๋ค๋ฆ
๋๋ค.
$ git clone <repo_url> <project_dir>
$ cd <project_dir>
$ pip install pipenv
$ $ # clean pypi cache and make it ready to cache somehow - not described here
$ pipenv install -e .[test]
$ # if we need extra testing packages in pipenv
$ pipenv install <extra_test_packages>
$ # record current requirements expressed in `Pipfile.lock`
$ pipenv lock
$ # if needed, record the `Pipfile.lock` somewhere
์ด๋ฌํ ์์ ์ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Pipfile.lock
(๊ฐ๋ฐ์๊ฐ ํ๊ฒฝ์ ์ฝ๊ฒ ์ฌํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์)๋จ๊ณ๊ฐ ์์ต๋๋ค:
tox
, pip
๋ฑ์ ๊ฐ์ ์คํํ๋๋ก ํ๊ฒฝ์ ๊ตฌ์ฑํฉ๋๋ค.pipenv
)Pipfile.lock
๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ ๋ฐ ์ฌ์ฉ๋ pypi ํจํค์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๊ฐ๋ฐ์ ์ฌ์ดํธ์์ ํ๊ฒฝ์ ์ฌํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.๋ ๋ค๋ฅธ ์ฅ์ ์ ์ด ์ค์ ์์ ๊ฐ๋ฐ์๊ฐ Pipfile
๋๋ Pipfile.lock
์ ์ง ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ํ ๋ค๋ฅธ ์ปจํ
์คํธ์์ ํ
์คํธ๋ฅผ ์คํํ๋ ๊ฒ์ ํญ์ ๋์ผํฉ๋๋ค( Pipfile.lock
๋ ํญ์ ์ฃผ์ด์ง ์ปจํ
์คํธ์์ ๋ค์ ๋น๋๋ฉ๋๋ค).
pypi ์บ์๋ ์ฝ๊ฐ์ ์ฐ๊ตฌ๊ฐ ํ์ํ ๋ถ๋ถ์
๋๋ค. ๊ฐ๋จํ ๋๋ ํ ๋ฆฌ๋ก ์ถฉ๋ถํ๊ณ pipenv
๊ฐ ์ด๋ฏธ ๋์์ด ๋ ๊ฒ์
๋๋ค. ๋ฌธ์ #1731์ด ๋๋ฝ๋ ๋ถ๋ถ์ผ ์ ์์ต๋๋ค.
์ข
์์ฑ ํด๊ฒฐ์ ์ํํ๋ ํจํค์ง๋ก์ ์ฐ๋ฆฌ์ ๋ง์ ํ
์คํธ๋ ๊ฒฐ์ ์ ๋น๋์ ์์กดํฉ๋๋ค. ์ฆ, ์๋ ค์ง ๋ด์ฉ์ ์ทจํ๊ณ ํด๊ฒฐ๋ ๊ทธ๋ํ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ด๋ฅผ ์ํด pytest-pypi
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด ์ฃผ์ ์ ๋ํ ํ๋ฐํ ํ ๋ก ์ ์ข์ํ์ญ์์ค. ๋์์ค๊ฐ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ฉฐ ํญ์ ์๋ ค์ง ์ข ์์ฑ๊ณผ ๊ณ ์ ๋์ง ์์ ์ข ์์ฑ์ ๋ํด ํ ์คํธํด์ผ ํฉ๋๋ค.
ํญ์ ์๋ ค์ง ์ข ์์ฑ๊ณผ ๊ณ ์ ๋์ง ์์ ์ข ์์ฑ์ ๋ํด ํ ์คํธํด์ผ ํฉ๋๋ค.
๋๋ ์ด ์ ์์ ๋ ๋ฒ์งธ๋ก ํ๋ค. ์ฌ์ ๊ฐ๋ฅํ ๋น๋์ ๋ํด ํญ์ ๋ช ์์ ์ธ "์๋ ค์ง ์ํธํ ์ํ"๋ฅผ ์ ์งํ๊ณ ์ ๋ฐ์ดํธ๊ฐ ์๋ก์ด ๋ถ/๋ฒ๊ทธ ์์ ๋ฒ์ ๋ ์๋ํ๋์ง ํ์ธํ๋ ๊ฒ ์ธ์๋ ์ ๋ฐ์ดํธ๊ฐ ์ค๋จ๋๋ ๊ฒฝ์ฐ ๋๋ฒ๊น ์ ๋จ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
(๋ด ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ผ๋ก๋ ์ด์์ ์ธ ์ํฉ์ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ ๋ถ ๋ฒ์ ์ ์ค์นํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ ์คํธํ ๊ตฌ์ฒด์ ์ธ ์ข ์์ฑ ๋ฒ์ ์ ํญ์ ์ง์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์ด์ง๋ง, ์ด๋ ๋งค์ฐ ๋ ผ๋์ ์ฌ์ง๊ฐ ๋ง์ ์๊ฒฌ์ด๋ฉฐ ๋ชจ๋ ์ฌ๋์ด ํ์ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. semver๋ฅผ ๋ฐ๋ฅด์ญ์์ค.)
@Moritz90 @techalchemy @uranusjr @tsiq-oliverc
๋ค์์ ์ด์ ํ ๋ก ์ ์์ฝ์ ๋๋ค.
Pipfile.lock
ํ์ผ์ ์ ์งํด์ผ ํฉ๋๊น?์ง์๋๋ ๊ฐ OS ๋ฐ Python ์ธํฐํ๋ฆฌํฐ๋ ๊ฐ๋ฅํ ์คํ ์ปจํ ์คํธ์ ๋งคํธ๋ฆญ์ค์ ๊ธฐ์ฌํฉ๋๋ค.
์๋ฅผ ๋ค์ด Flask๋ ๋ค์์ ์ง์ํฉ๋๋ค(์ต์ํ ์ ์ฅ์์์ ๋ณผ ์ ์๋ CI ํญ๋ชฉ).
๋ค๋ฅผ ์ ์๋ 9๊ฐ์ ๋ค๋ฅธ ์คํ ์ปจํ ์คํธ๋ฅผ ๋ง๋ญ๋๋ค.
๊ฐ ์คํ ์ปจํ
์คํธ๋ ์๋ก ๋ค๋ฅธ Pipfile.lock
๊ฐ์ง ์ ์์ต๋๋ค.
๋๊ฐ ๊ทธ๋ค์ ์ ์งํ ๊ฒ์ธ๊ฐ?
์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Pipfile.lock
์ ์ง(์ด๋ค ํ๋ซํผ์ด ๋ฌด์๋๊ธฐ๋ฅผ ์ข์ํฉ๋๊น?)์ ์: CI๊ฐ pipenv install -e .
ํ์ผ์ ์์ฑํ๋๋ก ํฉ๋๋ค. ์ ์ฅ์์ ํฌํจํ์ง ๋ง๊ณ ๊ฐ๋ฐ์๊ฐ ์๋ํ๋ ๋น๋์ ๊ฒฐ๊ณผ๋ก ์ ์ ํ Pipfile.lock
๋ฅผ ์ ํํ๋๋ก ๋์์ฃผ์ธ์.
pypi์ ๋ํ ์ข ์์ฑ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ์์ ํ ๋ ๊ฐ๋ฐ์๋ ์คํจํ ํ ์คํธ์์ ํ๊ฒฝ์ ์ฌํํ๊ธฐ ์ํ ๊ฐ๋จํ ์๋จ์ด ํ์ํ ์ ์์ต๋๋ค.
์ ์:
pipenv install -e .
๋ค์์ pipenv lock
Pipfile.lock
๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.Pipfile.lock
๋ฅผ ์ ํํฉ๋๋ค.Pipfile.lock
์ tox.ini
Pipfile.lock
๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.setup.py
๋ฐํ์ผ ํฉ๋๋ค.setup.py
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์๋ ์ ์์ผ๋ฉฐ( install_requires
์ข
์์ฑ ๋๋ฝ, ๋ฒ์ ์ง์ ์ ๋๋ฝ ๋ฑ) CI ํ
์คํธ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์จ๊ธฐ์ง ์์์ผ ํฉ๋๋ค(์์ฒด์ ์ผ๋ก ์๋ต๋ ์ข
์์ฑ์ ์ฌ์ ์ค์นํ์ฌ).
์ ์:
pipenv install -e .
๋ฅผ ์ ๋ขฐํ์ฌ ์ผ๋ฐ ์ค์น์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค(ํ์ฌ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์).pipenv
์ ์ธ)๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ pip freeze
์ถ๋ ฅ์ด pipenv
์ํด ์ค์น๋ ํญ๋ชฉ์ ํ์ ์งํฉ์์ ๋น๊ตํ ์ ์์ต๋๋ค.์ผ๋ถ ์ข ์์ฑ ์ ๋ฐ์ดํธ๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค๋จ์ํฌ ์ ์์ต๋๋ค. CI๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ํ ์คํจ๋ฅผ ๊ฐ์งํด์ผ ํฉ๋๋ค.
์ ์:
Pipfile.lock
์์ฑํ๋ค๋ฉด ์ด๊ฒ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค(์ด์จ๋ ๊ณ ์ ํด์ ๋ชจ๋์์ ์คํํ๊ธฐ ๋๋ฌธ์)์ ์๋ ๋ชจ๋ ๋ชจ๋์์ pipenv
ํ์ผ์ ์ ์ฅ์์ ๋ณด๊ดํ์ง ์์ผ๋ ค๊ณ ๋
ธ๋ ฅํ์ต๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ด ๋ณต์กํ ์์
(์๋ํ!!!)์ ์ ์ง ๊ด๋ฆฌํ์ง ๋ชปํ๋๋ก ์ ์ฅํฉ๋๋ค.
๋ด ์๋ณธ ํ
์คํธ์ ๋ฌ๋ฆฌ ๋ ๋ฒ์งธ ๋ฐ ์ธ ๋ฒ์งธ ๋ชจ๋๋ CI ์คํฌ๋ฆฝํธ์์ pipenv
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ๋ ์ ์ ์์ ์ข ์์ฑ์ ๊ฐ์ง ๊ฐ๋จํ ํจํค์ง์ ๋๋ค.
pipenv
์๋ ์ด์ ์ฒ๋ผ ์คํํ๊ณ ์ฐ๋ฆฌ์๊ฒ ๊ฐ๋จํ๊ฒ ์ ์งํ์ญ์์ค.
์ข ์์ฑ์ด ๋ฌธ์ ๋ฅผ ์์ ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ณ CI๋ฅผ ๋ ๋ณต์กํ๊ฒ ๋ง๋๋ ๊ฒ์ ์ ๋นํํ์ง ์๋ ๋๋ฌธ ๊ฒฝ์ฐ์ ๋๋ค.
CI ํ
์คํธ๊ฐ ์คํ๋ ๋๋ง๋ค ํ์ฌ ์ฌ์ฉ๋๋ ํ๊ฒฝ์ ์์ ํ ์ค๋ช
ํ๋ ์๋ก์ด Pipfile.lock
๋ฅผ ์์ฑํฉ๋๋ค.
Pipfile.lock
๋ CI ์ธ๊ณต๋ฌผ์ด ๋ฉ๋๋ค.
์ผ์ด ์๋ชป๋๋ฉด ๊ฐ๋ฐ์๋ ๊นจ์ง ๋น๋์์ Pipfile.lock
๋ฅผ ์ ํํ๊ณ ๋ก์ปฌ์ ์ ์ฉํ๊ณ ํ
์คํธ ๋ฐ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๋๊ตฐ๊ฐ ๋ฐฐํฌํ๋ ค๋ ๊ฒฝ์ฐ ๋ง์ง๋ง์ผ๋ก ์ฑ๊ณตํ ๋น๋์ Pipfile.lock
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์กด์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ค์ ๋ฌธ์ ์ผ ๋ CI๋ ํ ๋ฒ Pipfile.lock
์์ฑํ์ฌ ์ผ์ ๊ธฐ๊ฐ(ํ ๋ฌ?) ๋์ ๊ณ์ ์ฌ์ฉํฉ๋๋ค.
์ด๊ฒ์ ์ ์ด๋ ๋ ๊ฐ์ ๋ค๋ฅธ ์์
์ด ์์ด์ผ ํ๋ฏ๋ก CI ์ค์ ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค(ํ๋๋ Pipfile.lock
, ๋ค๋ฅธ ํ๋๋ ์ด๋ฅผ ์ ์ฉํ๊ณ ํ
์คํธ์์ ์ฌ์ฉ).
๊ฒฝ๊ณ : Pipfile.lock
๋ ํ์ฌ ์
๋ฐ์ดํธ๋์ด์ผ ํฉ๋๋ค. setup.py
๋ ์ข
์์ฑ์ ๋ณ๊ฒฝํฉ๋๋ค.
๋นํ๊ธฐ์๋ ๋๊ฒฐ ์ํ๋ฅผ ๋ฌด์ํ๊ณ ๊ณ ์ ๋์ง ์์ ๋ฒ์ ์ ํ์ธํ๋ Scrat ๋ค๋์ฅ ์ ํ์ ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.
๋ณด์๋ค์ํผ, ๊ฒฐ์ ๋ก ๊ณผ ๋ณต์ก์ฑ์ ๋ชจ๋๋ณ๋ก ์ฆ๊ฐํฉ๋๋ค.
๋ด ์ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ชจ๋ ์ด์ต์๋ ๋น์ฉ์ด ๋ญ๋๋ค.
์ฌ๊ธฐ์ ๋ชฉํ๊ฐ ๋ฌธ์์ ์กฐ์ธ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด๋ผ๋ฉด ์์งํ "์ ํ์ ์ฌ์ง๊ฐ ์์ ๋๊น์ง ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ฒ ์ฌ๋ก(์ฌํ ๊ฐ๋ฅํ ๋น๋)๋ฅผ ๋ฐ๋ฅด์ญ์์ค"์ ๊ทน์ ์ผ๋ก ๋ค๋ฅธ ๋ง์ ํ๋ ๊ฒ์ ๋ฌด์ฑ ์ํ๊ฒ ๋๊ปด์ง๋๋ค.
@vlcinsky "๋ชจ๋: ์์ฑ ๋ฐ ๋ด์ธ"์ด๋ผ๋ ์ ๋ชฉ ์๋์์ ๋ง์ง๋ง์ผ๋ก ์ฑ๊ณตํ Pipfile.lock
๋ ์๋ฅผ ๋ค์ด Jenkins ์ํฐํฉํธ๋ก ์ ์ธํ์ฌ ํญ์ ์ฃผ์์ ๋ณด๊ดํด์ผ ํ๋ค๊ณ ์ธ๊ธํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ์ ํตํด ๋๋ถ๋ถ์ ํ๋ก์ ํธ์ ํด๋น ์ค์ ์ ๊ถ์ฅํ๋ ๊ฒ์ด ์ข์ต๋๋ค. @tsiq-oliverc์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฒซ ๋ฒ์งธ ๋ชจ๋๋ฅผ ๊ถ์ฅํ์ง ์์ต๋๋ค.
์๊ฐํ๋ฉด ํ ์๋ก ์ด ๋ฌธ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐ ์ค์ด๋๋ผ๋ CI ๋น๋์ pipenv
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ์์ด๋์ด์ธ ์ด์ ์ ๋ํ ์น์
์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@tsiq-oliverc ๋๋ค์์ ์ผ๋ฐ ํ์ด์ฌ ํจํค์ง๋ "์คํ, ํฌ๋ ์คํธ, ์คํ" ๋ชจ๋์ ์์ต๋๋ค. ๋๋ tox
๋ฐ pytest
๋ฅผ ๋์
ํ๋ ๋ฐ ์์ด ์ด๋ฌํ ํจํค์ง ์ค ๋ช ๊ฐ๋ฅผ ๋์์ต๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ด ์ฃผ์ด์ง ํจํค์ง ํ์ง์ ๊ธฐ์ฌํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ด๋ป๊ฒ ํ๋ฉด ์ ํ ์ ์๋์ง์ ๋ํ ๋ช
ํํ ์์ด๋์ด๊ฐ ์์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด์ ๋ ๋ค๋ฅธ ํ๋ฅญํ ๋๊ตฌ๊ฐ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ธ ํ์ด์ฌ ํ๋ก์ ํธ์์ pipenv
์ ์ ํ๊ฒ ์ฌ์ฉํ์ฌ ํ์ง์ ๊ธฐ์ฌํ๋ ๋ฐฉ๋ฒ์ด ๊ถ๊ธํฉ๋๋ค. ๋๋ ์ ๋นํ๊ณ ๋ฐ๋ฅด๊ธฐ ์ฌ์ด ํ๋ ๋๋ ๋ ๊ฐ์ ์ ์๋ํ๋ ๋ ์ํผ๋ฅผ ์ฐพ๊ณ ์ถ์ต๋๋ค.
Flask ํ๋ก์ ํธ์ ๋ญ๋ผ๊ณ ๋งํ๊ฒ ์ต๋๊น?
Pipfile.lock
ํ์ผ 9๊ฐ๋ฅผ ์ถ๊ฐํ๊ณ ์
๋ฐ์ดํธ ์ ์ฑ
์ ์ค์ ํ์๊ฒ ์ต๋๊น?Pipfile.lock
์ธ๊ณต๋ฌผ์ ์์ฑํ๋๋ก Travis ๋ฐ Appveyor์ฉ CI ์คํฌ๋ฆฝํธ๋ฅผ ์์ ํ์๊ฒ ์ต๋๊น?๋ชฉํ๋ ๊ธฐ๋ฅ์ ์ธ ์์ ์คํ์ผ์ ์ฐพ๋ ๊ฒ์ ๋๋ค. ๋ฌธ์๋ก ๋๋๋ ๊ฒฝ์ฐ ์ข๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@vlcinsky ๋๋ (1)๊ณผ (4)๊ฐ ๊ทธ๋ฌํ ํ๋ก์ ํธ์ ๋ํ ๊ถ์ฅ ์ฌํญ์ด์ด์ผ ํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๊ธฐ์กด Pipfile.lock
๊ฐ ์์ผ๋ฉด ๋น๋์ ์ฌ์ฉ๋ ๋ฒ์ ์ ๋ฏธ๋ฆฌ ์ ์ ์์ง๋ง(ํ์ฌ ํ๊ฒฝ ์ธ๋ถ์์๋ ๊ด์ฐฎ์) ์ ๊ธ ํ์ผ์ ์์ฑํ๊ณ ๋ณด๊ดํ๋ฉด ์ฌ์ ํ ์ฌํ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ๋น๋ ์ค.
ํธ์ง : ๋ด ๊ถ์ฅ ์ฌํญ์ tl;dr ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
pipenv
๋ ์ด ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.Pipfile.lock
๋ฅผ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ปค๋ฐํ๊ณ ๋ฐฐํฌ์ ์ฌ์ฉํฉ๋๋ค. (์ด๋ ์ด๋ฏธ ๊ธฐ์กด ๋ฌธ์์์ ๋ค๋ฃน๋๋ค.)Pipfile.lock
๋ฅผ ์์ฑํ๊ณ ๋์ค์ ์ฌ์ฉํ ์ ์๋๋ก ๋ณด๊ดํ์ญ์์ค.(๋ฌผ๋ก ์ค์ ๋ฌธ์์๋ ์ข ๋ ์์ธํ ๋ด์ฉ๊ณผ ์์ ๊ฐ ์์ด์ผ ํฉ๋๋ค.)
@ Moritz90 ๋น์ ์ด ์ ์ํ๋๋ก "์์ฑ ๋ฐ ๋ด์ธ"์ ์์ ํ์ต๋๋ค.
Re (1): ๋งํ๊ธฐ ์ฝ๊ณ , ๋ ๊ตฌ์ฒด์ ์ด์ง ์๊ณ ๋ ์คํํ ์ ์์ต๋๋ค.
Re(4): ์, "์์ฑ ๋ฐ ๋ด์ธ"์ด ๊ฐ์ฅ ์คํ ๊ฐ๋ฅํ ๋ชจ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ Flask์ ๊ฒฝ์ฐ ๊ฐํ ํ์ง ์์ ๊ฒ์ ๋๋ค(์ ์ด๋ ํ์ฌ๋ก์๋).
๊ธฐ์
ํ๊ฒฝ์ ๊ธฐ์กด Pipfile.lock
์กด์ฌ: (๋ฐ)์๋ ๋๋ ์๋์ผ๋ก ์ด๋ป๊ฒ๋ ์์ฑ๋์ด์ผ ํฉ๋๋ค. ๊ธฐ์
ํ๊ฒฝ์์๋ ๊ณต์ฉ pypi์์ ์ง์ ์ค์นํ์ง ์๊ณ ์ผ๋ถ ๊ฐ์ธ์ฉ pypi๋ฅผ ์ฌ์ฉํ๊ณ ์น์ธ๋ ํจํค์ง๋ง ์ ๊ณตํฉ๋๋ค( devpi-server
๋ ์ฌ๋ฌ ์ธ๋ฑ์ค, ๊ฒ์๋ ํจํค์ง์ ์ ์ด๋ ๋ณ๋์ฑ, ์ธ๋ถ์ ๋ํ ์น์ธ๊ณผ ๊ฐ์ ํ๋ฅญํ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ํจํค์ง ๋ฑ) Pipfile.lock
๋น๋ ํ๋ก์ธ์ค๊ฐ ์ด๋ฌํ ํ๊ฒฝ์์ ์คํ๋๋ฉด ์น์ธ๋ ๊ฒ๋ง ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ ๋ฒ์ ์ด ๊ฑฐ๊ธฐ์ ๋ํ๋๋ ค๋ฉด ๋๊ตฐ๊ฐ ์ผ์ด๋ ์น์ธํด์ผ ํฉ๋๋ค. ๋ค์ CI ๋น๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋์ง ํ
์คํธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ pipenv check
์ฌ์ฉํ๋ฉด ๋ณด์ ๋ฌธ์ ํ
์คํธ๋ ์๋ํํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ์ํฌํ๋ก๋ ๋๊ตฐ๊ฐ๊ฐ (๋ฐ)์๋์ผ๋ก ๋ง๋๋ ๊ฒ๋ณด๋ค ๋ ์์ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์ ํ๊ฒฝ์ ๋ํ ๋์ ์ง์์ ๋งค์ฐ ์ ํ์ ์ ๋๋ค.
์๋ ํ์ธ์ pipenvํ์ ๋๋ค. ๋๋ ์ด ํ ์คํธ์์ ๋ง์ ๊ฒ์ ๊ณต์ ํฉ๋๋ค. ์ด๊ฒ์ ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ ๋ Pipfile/pipenv์ ํ๊ณ๋ฅผ ๋ ์ ์ดํดํ๋ ๋ฐ ๋ง์ ๋์์ด ๋ฉ๋๋ค. ๊ณต์ pipenv ๋ฌธ์์ ํตํฉ๋ ์ด ํ ์คํธ ๋๋ ์ด ํ ์คํธ์ ์ผ๋ถ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
๋ ผ์ํ๊ณ ์ถ์ ๋ค์ ์์ ์์ด ์์ต๋๋ค.
์์ ํ ์ฌ์ฌ์ฉํ ์ ์๊ณ ๋ด๋ถ pypi ๋ฑ์ ๊ฒ์๋ ๋ด๋ถ Python ํจํค์ง์ ๊ฒฝ์ฐ, ์ฌ์ง์ด ๋ด ์์ ์ Python ํจํค์ง(์: cfgtree , txrwlock , pipenv-to-requirements )์ ๋ํด์๋ ์ด๋ฏธ ์๊ณ ์๊ฑฐ๋ ์ฌ์ฉํ๊ณ ์๋ ํจํค์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค. , ์ด๋ฌํ ์ธ๋ถ ์ฌํญ์ ์ถ์ํํ๊ณ Python ๊ฐ๋ฐ์์ ์ถ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค: PBR.
PBR ์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ฝ๊ณ requirements.txt
์ ๋ฐฐํฌ ํจํค์ง์ ๋ฃจํธ ํด๋์๊ณผ ์ฃผ์
๋ฐ๊ฒฌ install_requires
์ setup.py
. ๊ฐ๋ฐ์๋ ๋์จํ ์ข
์์ฑ ์ ์ธ์ผ๋ก requirements.txt
๋ฅผ ์ ์งํ๊ธฐ Pipfile
์ด ๊ณต์์ ์ผ๋ก PBR ๋ด๋ถ์ ํตํฉ๋ ๋๊น์ง requirements.txt
์์ Pipfile
requirements.txt
๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ pipenv-to-requirements ๋ฅผ ์ฌ์ฉํด์ผ ๋๊ธฐํ๋๊ณ ๋ ๋ค ์ปค๋ฐ๋ฉ๋๋ค. ์์ค์ ์๊ณ PBR์ ๋ฐฐํฌ ํจํค์ง๊ฐ ๋น๋๋ ํ ์ฌ๋ฐ๋ฅด๊ฒ ์ฃผ์
์ ์ํํฉ๋๋ค. pipenv
๋ฅผ ์ฌ์ฉํ์ฌ requirements.txt
๋ฅผ ์์ฑํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์์
Pipfile์์ง์ง ๊ฐ ์ฝ์ ์ ๊ทธ๋์, PBR์ ๋ํ Pipfile
(๊ทธ๋ฆฌ๊ณ ์ ๊ธ ํ์ผ์)๊ณผ๋ก ์ฃผ์
install_requires
์ด ํจ๊ปํ๋ ๊ฒ์ฒ๋ผ requirements.txt
.
๋ค๋ฅธ ์ ์ฌํ ํจํค์ง๊ฐ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฌ๋๋ค์ด ์ํ์ง ์๋ ๋ค๋ฅธ ์์ ๋ ์ํํ๊ธฐ ๋๋ฌธ์ ๋๋ค(git history ๋ฒ์ , AUTHORS ๋ฐ ChangLog ์๋ ์์ฑ).
๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ์๋ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์์ฑ, ์ ์ง ๊ด๋ฆฌ ๋ฐ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฝ๋ค๊ณ ๋๋ผ๋ฏ๋ก ์ด ๊ฒฝํ์ ๊ณต์ ํ์ง ์๋ ๊ฒ์ด ์ฌํ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ ํ์ฌ์์ ์ต์ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๋ "๊ถ์ฅ" ๋ฐฉ๋ฒ์ผ๋ก ํ๋ณดํ๊ณ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ pipenv์ ๋ํ ๋ชจ๋ ์ด๋ ค์์ ๋ํด "์์์"์ ๊ฐ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ฒฐ๊ตญ ์์
์ด ์๋ฃ๋๊ณ ๊ฐ๋ฐ์๋ ์ง๊ธ๊น์ง ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค. python ๊ต์ก์ ์ผ๋ถ๋ก ํ์ฌ์ ์๋ก์ด python ๊ฐ๋ฐ์์๊ฒ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ๋จผ์ install_requires
์๋์ผ๋ก ์ ์ง ๊ด๋ฆฌํ๋ python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ ๋ค์ PBR
๋ก ์ ํํ์ฌ ๋ ์ฌ์์ง๋ ๋ฐฉ๋ฒ( ์์งํ ์ ๋ ์ฌ๋ฐ๋ฅธ semver ๋ฒ์ ํ๊ทธ๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ pbr์ ์๋งจํฑ ์ปค๋ฐ ๊ธฐ๋ฅ ์ ํฌ์
๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ ์ฉ ํ์ผ์ ์ฌ์ฉํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข ์์ฑ์ ์ ์ธํ๋ ์ด์ ์ค ์ผ๋ถ๋ readthedocs ๋๋ pyup๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค(pyup์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฐ๊ฒฐ๋ ๋ ๋ ์๋ฏธ๊ฐ ์๋๋ผ๋).
๋๋ ๋ฐ๋์ ์ด ๋ฐฉ๋ฒ์ ํ์ด์ฌ ํจํค์ง๋ฅผ ์ํํ๋ "ํ์ค" ๋ฐฉ๋ฒ์ผ๋ก ํ๋ณดํ๊ณ ์ถ์ง๋ ์์ต๋๋ค. ์ค์ ๋ก๋ "OpenStack" ๋ฐฉ๋ฒ์ด์ง๋ง ์ ๊ฒฝํ์ ๊ณต์ ํ๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ ์ฌํ๊ฑฐ๋ ๋ชจ์๋ ๊ฒฝํ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๊ทธ๋ค์ ์๊ฒฌ์ ๋ฃ๊ณ ๋ด ๊ด์ ์ ์ ๋ฐ์ดํธํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
ํ, ๋ฌธ์์ ์๋ ์ผ์ข ์ "์ปค๋ฎค๋ํฐ" ์น์ ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ธ์? ๋ ๊ฐ์ ์ฌ์ฉ์๊ฐ pipenv ํ์ ์ ์ฒด ์น์ธ ์์ด๋ ๊ทธ๊ฐ pipenv๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฒฝํ์ ๊ณต์ ํ ์ ์๋๋ก?
์ถ์ : ์ด ์ค๋ ๋๋ฅผ ๋๋ฝํ๊ณ ์ถ์ง ์๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ ์ฉ ๋ฌธ์ ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
@vlcinsky (1)๋ ์คํํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค. ์ ๊ธ ํ์ผ์ ์ ์ฅ์์ ๋ฃ์ผ์ญ์์ค.
์ ์๊ฐ์๋ ์ด ๊ธฐ๋ณธ ์ ๋ต์ด ๋ ์ด์ ์ถฉ๋ถํ์ง ์์ผ๋ฉด ๊ตฌ์ฒด์ ์ธ ์กฐ์ธ์ ์ ๊ณตํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๊ฒ์ ํ์คํ ์ฌ์ค์ด์ง๋ง ํน์ ๋ฌธ์ ๊ฐ ์ฌ๋ก๋ณ๋ก ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค๋ฅธ ์์ผ๋ก ๋งํ๋ฉด ์๋ฃจ์ ์ CI ์ํฌํ๋ก์์ ์ ๊ณตํ๊ธฐ๋ฅผ ์ํ๋ ์ถ๊ฐ ๋ณด์ฅ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
@gsemet ๊ทธ๊ฑฐ ์์? ์ง๋ 2๋
๋์ ๋ง๋ ๋ชจ๋ ํ์ด์ฌ ํจํค์ง๋ pbr
๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ ๋ง ํ๋ฅญํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฅํ ํ pbr์์ Pipfile์ ์ง์ํ๋ ค๋ ๊ทํ์ ์๋๋ฅผ ๋ฐ๋ฆ
๋๋ค(์ผ๋ถ ์์ง์๊ฐ๋ฝ, ํฌํ ๋ฑ).
์ด ๋ฌธ์ ์ ๊ฒฝ์ฐ(์ผ๋ฐ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ pipenv
ํจํด ๋ฐ ์ํฐํจํด ๊ฒ์) ๋ ๊ฐ์ง ์ด์ ๋ก ์๋์ ์ผ๋ก pbr
๋ฅผ ์๋ตํ์ต๋๋ค.
pbr
๋ฅผ ์ข์ํ์ง ์์ผ๋ฉฐ(๋น์ ์ด ์ธ๊ธํ์ต๋๋ค) ํ ๋ก ์ ๋ฐฉํดํ ๊ฒ์
๋๋ค.ํํธ, ๋๋ pbr ์ ํธ๊ฐ๋ฅผ ์ํ ๋น์ ์ ๋ ์ํผ๋ฅผ ์ ๋ง ๊ธฐ๋ํ๊ณ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฝ์ ๊ฒ์ด๋ค.
@tsiq-oliverc ๋น์ ์ ๋ชป์ ๋ฐ์์ต๋๋ค: ๋น์ ์ ์ ๊ธ ํ์ผ์ ๋น์ ์ ์ ์ฅ์์ ๋ฃ์ผ์ธ์
์ด๊ฒ์ด ๋ฐ๋ก ์ ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ์์ํ๊ฒ ๋ ๋๊ธฐ์
๋๋ค. ์ด ๋ฌธ์ ์ ์์ ๋ถ๋ถ์ ๋ค์ ์ฝ์ผ๋ฉด Pipfile.lock
์ถ๊ฐํ๋ฉด CI ํ
์คํธ๊ฐ ์ค๋จ๋ ์ ์๋ ๋ช ๊ฐ์ง ์ฌ๋ก์ ๋ํ ์ค๋ช
์ ์ฐพ์ ์ ์์ต๋๋ค(๋น๋ ์คํ ์ค๋จ ๋๋ ๋ฌธ์ ์จ๊ธฐ๊ธฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฐ์ง๋ ์ ์์ ๋๋ ์๋ชป๋ ์ข
์์ฑ ์ค์น ์ฃผ์ด์ง ์ปจํ
์คํธ์ ๋ํด...).
์ด ์์ ์ด ์ ๋๋ก ์ํ๋๋ ์ ์ฅ์(์ผ๋ฐ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ๋ณด์ฌ์ฃผ์๋ฉด ๊ธฐ์ ๊ฒ์ ๋๋ค. ๋๋ ์ด๋ค ์ํ์ด ์๋์ง ๋๋ ์ด๋ค ์ผ์ด ์๋ฃ๋์ง ์์๋์ง ๋ณด์ฌ์ฃผ๊ณ ์ถ์ต๋๋ค.
๋ฉ์๋ ! ๋๋ ๋ํ ์ด ์ฟ ํค ์ปคํฐ๋ฅผ ์ ์ง
@vlcinsky ๋ง์ต๋๋ค. ๊ทธ๋์ ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ ๋ฅผ ์ด๊ฑฐํ๊ณ ๊ทธ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์๋ด ์๋ค ๐ (Pipenv๋ฅผ ์ฌ์ฉํ๋ ๊ณ ํ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ชจ๋ฅด์ง๋ง ์ฃผ๋ก ๋ด๊ฐ ๋ณด์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.)
๋ด๊ฐ ๋งํ ์์๋ ํ, ๋ค์์ ์๋ ๊ฒ์๋ฌผ์ ํน์ ์ฆ์์ ๋๋ค.
pipenv install -e .
, ๋ง์ต๋๊น?@tsiq-oliverc ๊ทํ์ ์๊ฒฌ์ ์ ์๊ฒ ์๊ฐ์ ์ฃผ์๊ณ ์ ์๋ ์๋ฃจ์ ์ ์ฌํ ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ๋ฐ ๊ธฐ์ฌํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ค์์ ๋ฐ๋ณต์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ๊ธ ํ์ผ( Pipfile.lock
)์ repo์ ๋ฃ๋ ์ ์๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ค์ ๊นจ์ง setup.py ์ข
์์ฑ์ ์จ๊น๋๋ค. . pipenv install -e .
์ ๋ด๊ฐ ์ ์ํ ๊ฒ์ ๋ฐ๋ฅด์ง๋ง ์ด๊ฒ์ Pipfile.lock
์ฌ์ฉ๋ฒ์ด ์๋๋ผ ๊ทธ๊ฒ์ (์ฌ) ์์ฑํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ๋๊ตฐ๊ฐ Pipenv.lock
๋ณด๊ดํ๊ณ ํจํค์ง๋ฅผ ์ค์นํ๊ธฐ ์ ์ virtualenv๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์
๋๋ค.
re ์์กด์ฑ์ ๋ค๋ฅธ ํ์ด์ฌ ๋ฒ์ ์ด๋ ๋ค๋ฅธ OS์์ ์ ํจํ์ง ์์ ์ ์์ต๋๋ค . ์๋ ๋ง์ต๋๋ค. Python 2.7์ฉ์ผ๋ก ์ค์น๋ doit
๋ ์ต์ ๋ฒ์ ์ด Python 2.x์ ๋ํ ์ง์์ ์ค๋จํ์ผ๋ฏ๋ก ์ด์ ๋ฒ์ ์ด์ด์ผ ํฉ๋๋ค. watchdog
์ข
์์ฑ์ ํ๋ซํผ ์ข
์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. Linux์์๋ inotify, Windows์์๋ ๋ค๋ฅธ ๊ฒ, OSX์์๋ ๋ค๋ฅธ ๊ฒ์
๋๋ค. ๋ด ์ ๊ณ ๊ฐ์ "์ด๊ฒ์ ์ ๋ ์ผ์ด๋์ง ์์ ๊ฒ์
๋๋ค"๋ผ๊ณ ๋งํ๊ณค ํ์ผ๋ฉฐ ์ํฉ์ 50%์์ 2์ฃผ ์ด๋ด์ ๋ฐ์ํ์ต๋๋ค. ์ด๊ฒ์ CI ์คํฌ๋ฆฝํธ์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ์๋๋๋ค.
re ๊ฐ๋ฐ์๋ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค. .. 15๋ช
์ ๊ธฐ์ฌ์๊ฐ ์๋ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ํด ๋ณด์ญ์์ค. ์ด๋ณด์๋ ํผ๊ณคํ ์ฝ์ด ๊ฐ๋ฐ์๊ฐ Pipfile.lock
๋ฅผ ์ฌ์์ฑํ๋ ๊ฒ์ ์๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ์ ์ : maya
๋๋ ์ฌ์ํ๋๋ก ์์ฒญ ๋ฐ์๋ค ํจํค์ง Pipfile.lock
์๋ก์ด ์์กด์ฑ์ ์ถ๊ฐ๋ก setup.py
. ๊ทธ๊ฒ ๊ผญ ํ์ํ ์ผ์ด์๋์? ๋ด๊ฐ ์ ๋๋ก ์
๋ฐ์ดํธ ํ์ต๋๊น? ์ง์๋๋ ๋ชจ๋ ์คํ ์ปจํ
์คํธ์ ๋ํด ์
๋ฐ์ดํธํ์ต๋๊น? ๋๋ต์ ์๋์ค, ํ์คํ์ง ์์, ์๋์ค์
๋๋ค. ์ด์จ๋ , ๊ทํ์ ์ ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค(๊ทํ์ ์๊ฒฌ ์์ ์ค๋ช
๋ ์๋ฃจ์
์ ์๊ฐ์ ์ฃผ์์ต๋๋ค).
re Competing with tox : Tox๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ํ๊ฒฝ์ ๋ง๋ค๊ณ ๊ทธ ์์์ ํ
์คํธ ์คํ์ ์๋ํํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ tox.ini
๋ python 2.7, 3.4, 3.5, 3.6 ๋ฐ ๊ธฐํ ํ์ํ ๋ชจ๋ ๊ฐ์ ํ๊ฒฝ์ ์ ์ํ๊ณ ์ฌ๊ธฐ์ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ํ
์คํธ ์ค์ํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ง์งํ ํ
์คํฐ์ ํ๋ฆฝ ๋ powertool์
๋๋ค. pipenv
๋ ์ด ๋ชฉ์ ์ ์ํ ๋๊ตฌ๊ฐ ์๋์ง๋ง ํ์ํ ๊ฒ์ ์ค์นํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋ ์ ์์ต๋๋ค. ์ด๋ค ๋ฉด์์ ๋๋ ๋น์ ์ ์กฐ์ธ์ ๋ฐ๋๊ณ ๊ฐ๋ฅํ๋ฉด pipenv
๋ณด๋ค ์ฐ์ํ ๋๊ตฌ(tox)๋ฅผ ์ฌ์ฉํ ๊ฒ์ ์ ์ํ์ต๋๋ค.
๋ค์ Pipenv๊ฐ ์คํจํฉ๋๋ค. ์ด๊ฒ์ ์ ๋ง ๋ถํํ ์ผ์
๋๋ค. ๋ก์ปฌ ํธ์คํธ์์ ์ ์คํ๋๋ CI ํ
์คํธ(tox ๊ธฐ๋ฐ)๊ฐ ์์์ง๋ง Travis๋ฅผ ํตํด ์คํํ ๋ pipenv
๋ฌธ์ ๋ก ์ธํด ์คํจํ์ต๋๋ค. ์ง๊ธ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์์ ์ฌํญ์ด ๋ฆด๋ฆฌ์ค๋ ๋๊น์ง ๊ณ ์ ์ด ๋์์ด ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์งํ๋๋ ๋ฐฉ์์
๋๋ค. ๋๋ ๊ธฐ๋ค๋ฆด ๊ฒ์
๋๋ค.
๋ด ์๋ ๊ฒ์๋ฌผ์ ์ผ๋ถ๋ ์
๋ฐ์ดํธ๋์ด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. CI ์คํฌ๋ฆฝํธ์์ pipenv
๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ํ ์์น์ ์์ต๋๋ค(๋์ค์ ์ฌ์ฉํ ์ ์๋๋ก virtualenv ๊ตฌ์ฑ์ "๋ด์ธ").
@tsiq-oliverc "์ ์๋ ค์ง" ๋ฒ์ ๊ณผ ์ต์ ๋ฒ์ ๋ชจ๋์ ๋ํด ํ ์คํธํ๋ผ๋ ๊ทํ์ ์ ์์ด ์ฒ์์๋ ๋ง์์ ๋ค์์ง๋ง, ์๊ฐํ ์๋ก ๋ ธ๋ ฅ์ ์ ๋นํํ๊ธฐ๊ฐ ์ ์ ๋ ์ด๋ ค์์ง๊ณ ์์ต๋๋ค. ๋ ์ค ํ๋๊ฐ ์๋๋ผ ๋ ์ค ํ๋๋ฅผ ์ ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ป์ ์ ์๋ ์ ์ผํ ์ด์ ์ ์ค๋ฅ๊ฐ ์ข ์์ฑ ์ ๋ฐ์ดํธ ๋๋ ์ฝ๋ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ฐ์ํ๋์ง ์ฌ๋ถ๋ฅผ ์ฆ์ ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ณ๋์ ์ปค๋ฐ์ ์ํํ๊ฑฐ๋(์ ๊ธด ์ข ์์ฑ์ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ ๋) ๋๋ ์ฑ๊ณต์ ์ธ ๋น๋์ ์ํด ์์ฑ๋ ์ต์ ์ ๊ธ ํ์ผ๋ก ๋ฒ๊ทธ๋ฅผ ์ฌํํ๋ ค๊ณ ์๋ํ๋ฉด(ํญ์ ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ ๋) ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํ๋ ํ๊ฒฝ์์๋ ์ด์จ๋ "์ ๋ฐ์ดํธ"ํ ์ ์์ต๋๋ค...
@vlcinsky ํ๊ฒฝ ๊ฐ์ ์ฐจ์ด์ ์ ๋ํ ๊ทํ์ ์ผ๋ฐ์ ์ธ ์์ ์๋ ๋์ํ์ง๋ง "๊ตฌ์ฑ๋น ํ๋์ ์ ๊ธ ํ์ผ" ์ธ์๋ ๋์๊ฒ ๋ฐ์ง๋งจ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์ค์ ๋ก๋ ์ ์ด๋ ์ผ๋ถ ํ๊ฒฝ ๊ฐ์ ์ ๊ธ ํ์ผ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
์์ง ์๋ฌด๋ ๋๋ตํ์ง ์์ ๋ฏธํด๊ฒฐ ์ง๋ฌธ ์ค ํ๋๋ ์๋ก ๋ค๋ฅธ ํ๊ฒฝ์์ ํ
์คํธํ๊ณ ์ข
์์ฑ์ ์ ๊ธ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ๋๋ tox
๋ํด ๊ทธ๊ฒ์ด ์กด์ฌํ๋ค๋ ๊ฒ ์ธ์๋ ์๋ฌด๊ฒ๋ ๋ชจ๋ฅธ๋ค๋ ๊ฒ์ ์ธ์ ํด์ผ ํ์ง๋ง tox
์ pipenv
์ฌ์ด์ ์ผ์ข
์ ์ ์ฐฉ์ ๊ฐ ํ์ํ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ๊ทธ๊ฒ์ ์ด๋ป๊ฒ ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
@๋ชจ๋ฆฌ์ธ 90
Pipfile.lock
์ ๋๋ฌด ๋ง์ ๋ณ์ข
์ ๋ฐ์ง๋งจ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ(๋ค๋ฅธ ์ฌ๋๋ค์ ๋ด ๋ถ์ผ์์ ์ ์ธํ๊ธฐ ์ํด):
๋๋ flask
ํ๋ก์ ํธ(๋งค์ฐ ์ฑ์ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ)๋ฅผ ์ทจํ๊ณ ๋
์ ํ
์คํธ๋ฅผ ์คํํ์ต๋๋ค.
์ฌ๊ธฐ์ ํ ์คํธ๋ ๋ณํ ๋ชฉ๋ก์ด ํ์๋ฉ๋๋ค(Linux์์ ๋ก์ปฌ๋ก, Windows ๋ฐ OSX๊ฐ ๋์ผํ ํ ์คํธ ์ธํธ๋ฅผ ์ํํ์ง๋ง ๋ค๋ฅธ ํ๊ฒฝ์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก 3์ ๊ณฑํฉ๋๋ค).
ํ๋์ OS์๋ 16๊ฐ์ ๋ค๋ฅธ ํ ์คํธ ์คํ์ด ์์ต๋๋ค. ๊ทธ ์ค 5๊ฐ๋ ์ค์นํ์ง ์์๊ธฐ ๋๋ฌธ์ ์คํจํ์ต๋๋ค(๊ด์ฐฎ์ต๋๋ค). ํ๋๋ ๋ฌธ์ ์์ฑ(์ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํจ)์ ๋ค๋ฃจ๊ณ ์๊ณ ๋ค๋ฅธ ํ๋๋ ์ปค๋ฒ๋ฆฌ์ง(๊ฐ์ ธ์ค๊ธฐ ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ํจ)๋ฅผ ๋ค๋ฃจ๊ณ ์์ต๋๋ค. ):
coverage-report: commands succeeded
docs-html: commands succeeded
py27-devel: commands succeeded
py27-lowest: commands succeeded
py27-simplejson: commands succeeded
py27: commands succeeded
py35: commands succeeded
py36-devel: commands succeeded
py36-lowest: commands succeeded
py36-simplejson: commands succeeded
py36: commands succeeded
ERROR: py34: InterpreterNotFound: python3.4
ERROR: pypy-devel: InterpreterNotFound: pypy
ERROR: pypy-lowest: InterpreterNotFound: pypy
ERROR: pypy-simplejson: InterpreterNotFound: pypy
ERROR: pypy: InterpreterNotFound: pypy
์์ฑ๋ ๊ฐ virtualenvs์ ๋ํด pip freeze > {venv_name}.txt
requirements.txt
ํ์ผ์ ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ํด์ ๊ฐ์ ๋ฐ๋ผ ์ ๋ ฌ๋ ํ์ผ์ ๋ํด ๊ณ์ฐ๋ ํด์๊ฐ ์์ผ๋ฏ๋ก ๋ชจ๋ ๋์ผํ๊ฒ ๊ทธ๋ฃนํ๋ฉ๋๋ค. ์ฌ๊ธฐ ๋นจ๋๊ฐ ์จ๋ค:
b231a4cc8f30e3fd1ca0bfb0397c4918f5ab5ec3e56575c15920809705eb815e py35.txt
b231a4cc8f30e3fd1ca0bfb0397c4918f5ab5ec3e56575c15920809705eb815e py36.txt
cdf69aa2a87ffd0291ea65265a7714cc8c417805d613701af7b22c8ff2b5c0e4 py27-devel.txt
dfe27df6451f10a825f4a82dfe5bd58bd91c7e515240e1b102ffe46b4c358cdf py36-simplejson.txt
e48cd24ea944fc9d8472d989ef0094bf42eb55cc28d7b59ee00ddcbee66ea69f py36-lowest.txt
f8c745d16a20390873d146ccb50cf5689deb01aad6d157b77be203b407e6195d py36-devel.txt
053e107ac856bc8845a1c8095aff6737dfb5d7718b081432f7a67f2125dc87ef docs-html.txt
45b90aa0885182b883b16cb61091f754b2d889036c94eae0f49953aa6435ece5 py27-simplejson.txt
48bd0f6e66a6374a56b9c306e1c14217d224f9d42490328076993ebf490d61b5 coverage-report.txt
564580dad87c793c207a7cc6692554133e21a65fd4dd6fc964e5f819f9ab249c py27.txt
8b8ff4633af0897652630903ba7155feee543a823e09ced63a14959b653a7340 py27-lowest.txt
๋ฌด์์ด ๊ฒ, ๊ทธ๋ ์ง? ๋ชจ๋ ํ ์คํธ์์ ๋ ๊ฐ์ง๋ง ๋์ผํ ๊ณ ์ ์ข ์์ฑ์ ๊ณต์ ํฉ๋๋ค.
์ด๊ฒ์ด ์ข์ ํ ์คํธ ์ค์ํธ๋ฅผ ๊ฐ์ถ ์ผ๋ฐ์ ์ธ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ค์ ๋๋ค. ์ด์ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์์ ํ ์คํธํ python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋นํ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์ธ์ ํ ๊ฒ์ ๋๋ค.
jinja2
ํ์ธํ๋ฉด ํจ์ฌ ๋ ๊ฐ๋จํ ์ง์น์ผ๋ก ๋ณด์
๋๋ค.
coverage-report: commands succeeded
py26: commands succeeded
py27: commands succeeded
py33: commands succeeded
py35: commands succeeded
py36: commands succeeded
ERROR: docs-html: commands failed
ERROR: py34: InterpreterNotFound: python3.4
ERROR: pypy: InterpreterNotFound: pypy
์ฒดํฌ์ฌ์ ๋ณด๋ฉด py27.txt์ py26.txt๊ฐ ๋ค๋ฅด๋ค๋ ์ฌ์ค์ ๋๋์ต๋๋ค.
047a880804009107999888a3198f319e5bbba2fa461b74cfdfdc81384499864e py26.txt
047a880804009107999888a3198f319e5bbba2fa461b74cfdfdc81384499864e py33.txt
047a880804009107999888a3198f319e5bbba2fa461b74cfdfdc81384499864e py35.txt
047a880804009107999888a3198f319e5bbba2fa461b74cfdfdc81384499864e py36.txt
48bd0f6e66a6374a56b9c306e1c14217d224f9d42490328076993ebf490d61b5 coverage-report.txt
743ad9e4b59d19e97284e9a5be7839e39e5c46f0b9653c39ef8ca89c7b0bc417 py27.txt
@vlcinsky ์ ๋ง ๋ฌด์ญ
๋๋ ์ด์ ์ฐ๋ฆฌ์ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ธ์ ๊ฐ๋ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช์ง ์๊ณ ์ฐจ์ด์ ์ ๋ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@Moritz90 ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ ํ ๋ค๋ฅธ ๋์์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์คํ ์ปจํ ์คํธ๋ฅผ ํจ์ฌ ๋ ์ข๊ฒ ์ ์งํ ์ ์์ต๋๋ค.
์ผ๋ฐ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ข ์ข ์ ์ฐํ๊ณ ๊ตฌ์ฑ ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด Flask๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๋์ ํ ์คํธ ์คํ์์ ๋ค๋ฃจ๋ ๋์ฒด json ํ์๋ฅผ ์ค์นํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Flask์ tox.ini
์์ ํ
์คํธ ๋ฐ ๋
์์ ๋ํด ๋ง์ ๊ฒ์ ๋ฐฐ์ธ ์ ์์ต๋๋ค.
๊ฐ์ฅ ๋ฎ์ ํ ์คํธ ๋ณํ์ ๊ฐ์ฅ ์ค๋๋ ์ข ์์ฑ ๋ฒ์ ์ ๋ํด ํ ์คํธํฉ๋๋ค.
devel์ ํต์ฌ ์ข ์์ฑ์ ๊ฐ๋ฐ ๋ฒ์ ์ ๋ํด ํ ์คํธ ์ค์ ๋๋ค.
๋๋ Flask๊ฐ ๋ ๋์ ์์ค์ ๋ณต์ก์ฑ์ ์์ผ๋ฉฐ ์ ์คํ ํ ์คํธ ์ ํ๊ตฐ์ ๋ณด์ฌ์ค๋๋ค.
ํผ๋ผ๋ฏธ๋์ tox.ini ๋ ๋น์ทํ ์์ ํ๊ฒฝ์ ๋ณด์ฌ์ค๋๋ค(100% ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ๋ชฉํ๋ก ํจ).
Maya์ tox.ini ๋ ๋งค์ฐ ์ ์ ํ๊ณ (2์ผ) ๊ฐ๋จํฉ๋๋ค. ์ฌ๊ธฐ์๋ 4๊ฐ์ง ๋ค๋ฅธ ํ๊ฒฝ์ด ์์ผ๋ฉฐ py27์ py35 ๋ฐ py36๊ณผ ๊ณ ์ ์๊ตฌ ์ฌํญ์ด ๋ค๋ฆ ๋๋ค.
@๋ชจ๋ฆฌ์ธ 90
pipenv์ tox ์ฌ์ด์ ์ ์ฐฉ์ ์ ๊ดํ์ฌ
pipenv --man
๋ tox.ini
๋ช
๋ น ๋ด์์ pipenv
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ๊ฐ์ง ์ง์นจ์ ๋ณด์ฌ์ค๋๋ค.tox.ini
ํ์ผ์ ์์์ ๋ช
๋ น์ ์คํํ ์ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์๋ pipenv
๋ฉ๋๋ค.
pipenv
๋ ์ด๋ฏธ ํ์ฑํ๋ virtualenv(tox ๊ธฐ๋ฐ ํ
์คํธ์ ๊ฒฝ์ฐ)์์ ์คํ๋ ๋ ์ฃผ์ด์ง ๊ฐ์ ํ๊ฒฝ์ ์ค์น๋๋ค๋ ํ๋ฅญํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ด๊ฒ์ ์ ๋ง ๋ฉ์ง๋ค.
Pipfile.lock
์์ฑ์ด ํ์ํ ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ์ ํ ์์น๋ก ์ด๋ํ๋ ค๋ฉด ์ฝ๊ฐ์ ์ถ๊ฐ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค(๋ค์ ํ
์คํธ์ ์ํด ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด .tox/py36/Pipfile.lock
๋ก ag๋ก ์ด๋ํฉ๋๋ค. ์ด๊ฒ์ ๊ฐ๋ฅํ์ง๋ง ์ฝ๊ฐ์ ๋จ์ํ). Pipfile
์์น์ ๋ํ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
@vlcinsky
pipenv install -e .
ํ ๋ฒ ์คํํ๋ฉด setup.py๊ฐ ์ด์ ์ ๊ธ ํ์ผ์ ํตํด ์ถ์ ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ setup.py์ ์ ํจํค์ง๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค pipenv install
๋ฅผ ์คํํฉ๋๋ค.pipenv --deploy
๋ ์ด๋ฅผ ํฌ์ฐฉํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. CI์์ ์คํํ์ญ์์ค!update-all-lockfiles.sh
๋ฅผ ๋ง๋ค๊ณ CI์์ pipenv --deploy
๋ฅผ ์คํํ์ฌ ์ค๋ฅ๋ฅผ ์ก์ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.@Moritz90 - ๋์ํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ "2๋จ๊ณ" ์ ๊ทผ ๋ฐฉ์์ด ๊ณผ๋ํ ์ ์์ต๋๋ค. ํนํ, ์ ๊ธ ํ์ผ์ ๊ณ ์์ /์๋์ "์๋" ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ์์ ํ ๋ถํ์ํฉ๋๋ค.
๋ ์ผ๋ฐ์ ์ผ๋ก, ์ด "์ ์"์ด ์ค์ ๋ก ์ด๋ ค์ด ๋ฌธ์ ์ ์ด์ ์ ๋ง์ถ๋๋ก ํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค(์ ์๊ฐ์๋ (A) ์ฌ๋ฌ ํ๊ฒฝ์ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ (B) ์ ์คํธ๋ฆผ ์ข ์์ฑ์ ๋ณ๊ฒฝ ์ฌํญ์ ํฌ์ฐฉํ๋ ค๋ ๊ฒ์ ๋๋ค). ์ผ์์ ์ธ ๊ฒ(Pipenv์ ๋ฒ๊ทธ)์ด๋ ๋๊ตฌ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํ ์ ์ฌ์ ์ธ ์คํด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์๋ ์ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ "์ด๋ ค์ด" ๋ฌธ์ ์ ๊ฒฝ์ฐ์๋ ํ๋ ์ด๋ฐ์ "์ผ๋ถ ๋ณต์กํ ๊ฐ์ฅ์๋ฆฌ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ Pipenv ์ํฌํ๋ก๊ฐ ๋ถ์ถฉ๋ถํ๋ค๋ ๊ฒ์ ์ ์ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์๊ฐํ ์ฌํญ์ด ์์ต๋๋ค."์ ๊ฐ์์ผ ํฉ๋๋ค. IMO, ๊ธฐ๋ณธ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ ์ ๋ฉ๋๋ค(๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์ด๋ฌํ ์ฐ๋ ค๋ฅผ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค).
Pipenv / Pipfile๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ํ์ฉ ํ ๊ฒฝ์ฐ ์ ๊ณต documentaion ์์ @vlcinsky๋ ํผ๋ ๊ฐ๋จํ๊ณ ๋ ๋ ๊ฒ์
๋๋ค lib-dependencies
, app-dependencies
๋ฐ dev-dependencies
. ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์์ต๋๋ค.
ํจํค์ง๊ฐ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๊ฒฝ์ฐ lib-dependencies
์ต์
์ ์ฌ์ฉํ์ญ์์ค. ์ Pipfile
:
[lib-dependencies]
some-lib=="*"
another-lib=="*"
yet-another-one==">=1.0"
[dev-dependencies]
some-dev-tool=="1.1"
๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ ์๋น์ ์์คํ
์์ ๋ฒ์ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ๋ฅํ ํ [lib-dependencies]
๋ฏธ๋ง์ ๋ฒ์ ๋ฒ์๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
ํจํค์ง๊ฐ ์ ํํ ์ข
์์ฑ ๋ฒ์ ์ด ํ์ํ ์์ฉ ํ๋ก๊ทธ๋จ(๋์ ์์คํ
์์ pipenv์ ์ํด ์ค์น๋จ)์ธ ๊ฒฝ์ฐ [app-dependencies]
์ต์
์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ Pipfile
:
[app-dependencies]
some-lib=="1.0.12"
another-lib=="1.*"
yet-another-one=="2.0"
[dev-dependencies]
some-dev-tool=="1.1"
/End ๋ฌธ์ ์์
๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ Pipfile.lib
๋ฐ Pipfile.app
์์ต๋๋ค.
๋๋ ์ด์ ๊ฐ์ ๊ฒ์ด ๊ฒฉ์ฐจ๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์ํฐ ํจํด ์น์ ๊ณผ ํ์ฌ ๋๊ตฌ์ ๋ฉ์ด๋ฆฌ์ ๋ํ ํ์์ฑ์ ์๋ตํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
pipenv ํจํค์ง ๋๊ตฌ๋ฅผ ํธ์ถํ๋ ๊ฒ์ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๊ฑฐ๋ ์์ฑ์ ๊น์ด ๊ด์ฌํ ๊ฒ์ผ๋ก ์์ํ๋ ๊ฒฝ์ฐ ์คํด์ ์์ง๊ฐ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ง์ ํผ๋์ ์ด๋ํ๋ ์ค์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํนํ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(์: JS, Rust, Elm)๋ก ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค ์ฌ์ด์์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๋ด๊ฐ Pipenv์ setup.py๋ฅผ ์๋ชป๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์ ๋๊น์ง ๋ช ๋ฌ์ด ๊ฑธ๋ ธ๊ณ ๊ฐ๋ Github ๋ฌธ์ ๋ฅผ ์ฝ์์ต๋๋ค.
@feluxe
๊ทํ์ [lib-dependencies]
๋๋ Pipfile.lib
๋ ์ค๋๋ Pipfile
(์ถ์ ์ข
์์ฑ - ๊ฐ๋ฅํ ํ ๊ด๋ฒ์ํจ).
๊ทํ์ [app-dependencies]
๋๋ Pipfile.app
๋ Pipfile.lock
(ํน์ ์ข
์์ฑ์ผ๋ก).
pipenv
๋ฐ ํด๋น ํ์ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ ๋ฐฐํฌ ์ค๋น๋ผ๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ์ํฉ์์ ์ฌ์ฉํ ์ ์์ง๋ง ๋ ๊ฐ์ง ๋ชจ๋๋ฅผ ๋์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก Pipenv
์ถ๊ฐ ์น์
์ ์ถ๊ฐํด์ผ ํ๋ ๊ฐ๋ ฅํ ์ด์ ๋ ๋ณด์ด์ง ์์ต๋๋ค. Pipfile
์ด ์ด๋ค ์ ํ์ ์ฉ๋๋ก ์ฌ์ฉ๋ ๊ฒ์ธ์ง ์๋ ๊ฒ์ ๊ฐ๋ฐ์์ ์ฑ
์์
๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ง์ ํผ๋์ ์ด๋ํ๋ ์ค์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํนํ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(์: JS, Rust, Elm)๋ก ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค ์ฌ์ด์์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๋ด๊ฐ Pipenv์ setup.py๋ฅผ ์๋ชป๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์ ๋๊น์ง ๋ช ๋ฌ์ด ๊ฑธ๋ ธ๊ณ ๊ฐ๋ Github ๋ฌธ์ ๋ฅผ ์ฝ์์ต๋๋ค.
๋์. 3์น์ ์๋ฃจ์ ์ ์ ๊ฐ ์๊ฐํด ๋ณธ ์ ์ด ์๋ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ์๋ฃจ์ ์ด๊ธฐ๋ ํ๋ฉฐ ์ ํํ๊ณ (๋๋๊ฒ๋!) ๊ฐ๋จํด ๋ณด์ ๋๋ค.
Python ๋ฐฐ๊ฒฝ์์ ์จ ์ ๋ ํญ์ Node์ package.json์ด ์๋ชปํ๊ณ ์๋ค๊ณ ๋๊ผ์ต๋๋ค(Rust๋ ์ปดํ์ผ๋ฌ์ ๋ง์ปค๊ฐ ์๊ณ ๋์ค ๋จ๊ณ์์ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ์ข์ต๋๋ค). ์ฑ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข ์์ฑ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ต์ํ ์ถ์์ ์ธ ์๋ฏธ์์ Python๊ณผ ๊ฐ์ ์คํฌ๋ฆฝํ ์ธ์ด์์๋ ์๋ํ์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ.
๊ฐ๋ ์ ์ผ๋ก๋ 3์น์ ์๋ฃจ์ ์ด ๋ง์์ ๋ค์ง๋ง ์ฌ์ ํ ๊ธฐ์กด ์ํ๊ณ์ ํธํ๋์ง ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค. ์ด ๊ณต๊ฐ์ ์ฑ์ฐ๋ setup.py, setup.cfg ๋ฐ (์ ์ฌ์ ์ผ๋ก) pyproject.toml์ด ์ด๋ฏธ ์์ต๋๋ค. Pipenv(์ ํํ ๋งํ๋ฉด Pipfile)๊ฐ ๊ณต๊ฐ์ผ๋ก ์ด๋ํ๋ ค๋ฉด pip(๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์์ ์ด์์ ์ผ๋ก๋ ์ง์ ์ง์ํด์ผ ํจ) ๋ฐ flit ๊ณผ ๊ฐ์ ๊ด๋ จ ํ๋ก์ ํธ์ ํตํฉํด์ผ ํฉ๋๋ค.
lib/app ์ข ์์ฑ ์ฒ๋ฆฌ์ ๊ดํ ๋ค๋ฅธ ๋ฌธ์ ์์ ์ธ๊ธํ๋ฏ์ด ์ด ๋ ผ์๋ pypa-dev(๋ฉ์ผ๋ง ๋ฆฌ์คํธ) ๋ฐ/๋๋ PEP ํ๋ก์ธ์ค๋ก ์์ค์ปฌ๋ ์ด์ ๋์ด์ผ ํฉ๋๋ค. (Pipfile)์ ๋ชจ๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
@vlcinsky
๊ทํ์ [lib-dependencies] ๋๋ Pipfile.lib๋ ์ค๋๋ Pipfile์ ์๋ ๊ฒ์ ๋๋ค(์ถ์ ์ข ์์ฑ - ๊ฐ๋ฅํ ํ ๊ด๋ฒ์ํจ).
์ด๊ฒ์ด ๋ช
ํํ์ง ์์ ๊ฒฝ์ฐ ์ฃ์กํฉ๋๋ค. ๋ด lib-dependencies
๋ ์ฌ๋๋ค์ด ํ์ฌ setup.py
/ install_requires
๋ฃ๋ ๊ฒ์
๋๋ค. ์๋ง๋ pypi-dependencies
๊ฐ ๋ด๊ฐ ์๋ฏธํ๋ ๋ฐ์ ๋ ๋์ ์ด๋ฆ์ด ๋ ๊ฒ์
๋๋ค.
@uranusjr
์ด ๊ณต๊ฐ์ ์ฑ์ฐ๋ setup.py, setup.cfg ๋ฐ (์ ์ฌ์ ์ผ๋ก) pyproject.toml์ด ์ด๋ฏธ ์์ต๋๋ค.
Pipenv(๋ช
๋ น์ค ๋๊ตฌ)๋ setup.py
์ธํฐํ์ด์คํ ์ ์์ต๋๋ค. setup.py
์ ์ข
์์ฑ ์น์
๋ง Pipfile๋ก ์ด๋ํด์ผ ํฉ๋๋ค. ์ ์ด๋ ๋ด ์์์์๋ :)
lib/app ์ข ์์ฑ ์ฒ๋ฆฌ์ ๊ดํ ๋ค๋ฅธ ๋ฌธ์ ์์ ์ธ๊ธํ๋ฏ์ด ์ด ๋ ผ์๋ pypa-dev(๋ฉ์ผ๋ง ๋ฆฌ์คํธ) ๋ฐ/๋๋ PEP ํ๋ก์ธ์ค๋ก ์์ค์ปฌ๋ ์ด์ ๋์ด์ผ ํฉ๋๋ค. (Pipfile)์ ๋ชจ๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
์๊ฒ ์ต๋๋ค. ๊ท์ฐฎ๊ฒ ํด์ ์ฃ์กํฉ๋๋ค ;) ์๊ฐ์ด ๋๋ฉด ๋ฉ์ผ๋ง ๋ฆฌ์คํธ์ ์ธ ๋ด์ฉ์ ์์ฑํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด ์ ์์ ๋ฒ์ ๋ด์์ ์ ์ฒด Python ํจํค์ง ์ปค๋ฎค๋ํฐ๋ฅผ ์ํ ์๋ก์ด ์ํฌํ๋ก๋ฅผ ์์ ํ๋ ํ ๋ผ ๊ตฌ๋ฉ์ผ๋ก ๋ค์ด๊ฐ๋ ๋์ ํ์ฌ ๊ฐ๋ฅํ ๋ชจ๋ฒ ์ฌ๋ก์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ฌ ์ ์ฝ ์กฐ๊ฑด ๋ด์์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ํ ๋ค์ ๊ฐ์ ๋ ผ์๋ฅผ ์์ํ๋ ๊ฒ์ด ๋ ์์ฐ์ ์ ๋๋ค.
@uranusjr - "์ปดํ์ผ๋" ๋ฐฐ๊ฒฝ์์ ์๋๋ฐ ์ ์ด๋ฐ ์ผ์ด ์ผ์ด๋๋์ง ๊ถ๊ธํฉ๋๋ค.
์ฑ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข ์์ฑ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ฉด Python๊ณผ ๊ฐ์ ์คํฌ๋ฆฝํ ์ธ์ด์์๋ ์๋ํ์ง ์์ต๋๋ค.
@tsiq-oliverc ์ฑ์ ๋ชจ๋ฒ ์ฌ๋ก์์๋ ์ข ์์ฑ์ ๊ณ ์ ํด์ผ ํ๋ฏ๋ก ๋์ผํ ์๊ตฌ ์ฌํญ ํ์ผ ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ข ์์ฑ์ ๊ณ ์ ํ๊ธฐ ์์ํฉ๋๋ค. ์ด๊ฒ์ ์์กด์ฑ ํด๊ฒฐ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฒ์ ๋๋ค.
๋ด ์ฑ์ ๋ ๊ฐ์ ์ข ์์ฑ A์ B๊ฐ ์๊ณ ๋ ๋ค C์ ์ข ์๋์ด ์์ง๋ง A๋ v1์, B๋ v2๋ฅผ ํ์ผ๋ก ๊ณ ์ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ปดํ์ผ๋ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ํด์ฒด์ธ์ด ์ปดํ์ผ ์๊ฐ์ ์ด๋ฅผ ๊ฐ์งํ๊ณ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Rust๋ ๋งํฌ ์๊ฐ ๋์ ์ด ์์ ์ ์ํํฉ๋๋ค. ์ต์ข ์คํ ํ์ผ์๋ ๋ ๊ฐ์ C ๋ณต์ฌ๋ณธ(v1 ๋ฐ v2)์ด ํฌํจ๋๋ฉฐ A์ B๋ ๊ฐ๊ฐ์ ์ฐ๊ฒฐ๋ฉ๋๋ค. C++ ์์ญ์์๋ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํด๊ฒฐ๋ฉ๋๋ค. ๊ธฐํธ ์กฐํ๋ ๋์ค์(๋ฐํ์์) ์ํ๋์ง๋ง ์์ด๋์ด๋ ๋์ผํฉ๋๋ค. ์ปดํ์ผ๋ฌ๋ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค์์ ํ์ํ ๊ฒ์ ์๊ณ ๊ทธ์ ๋ฐ๋ผ ์๋ํ ์ ์์ต๋๋ค.
์คํฌ๋ฆฝํ ์ธ์ด๋ ์ค์ ๋ก ํธ์ถ์ ๋๋ฌํ ๋๊น์ง ์ค์ ๋ก ๋ฌด์์ ํ๊ณ ์ถ์์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค. ๋ ธ๋๋ ํญ์ ์ข ์์ฑ์ด ํธํ๋์ง ์๋๋ค๊ณ ๊ฐ์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง(๋ ๋ณต์ฌ๋ณธ์ด ๋์ผํ๋๋ผ๋ A์ B๋ ํญ์ ๊ณ ์ ํ C๋ฅผ ์ป์) ์ด๋ ์๋ก์ด ์ ํ์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๊ณ ๋ชจ๋ ์ฌ๋์ด (ํฌ๋ง?) ๋์ฐํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. Python์ ์๋ง๋ ๊ฑฐ๊ธฐ์ ๊ฐ๊ณ ์ถ์ง ์์ ๊ฒ์ ๋๋ค(์ด์จ๋ , ๊ทธ๋ ๊ฒ ํ๋ฉด ๊ธฐ์กด์ ๋ชจ๋ Python ์ค์น๊ฐ ์ค๋จ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ ์ ์์ต๋๋ค).
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ข ์์ฑ ๋ฒ์ ์ "๊ณ ์ ํด์ "ํ๋ ํจํค์ง ๋๊ตฌ์์ ์๋ฆฌํ ์์ ์ ์ํํ๋ ๊ฒ์ ๋๋ค. (Ruby์) Bundler๋ ์ฌ๋๋ค์๊ฒ ์ ๊ธ ํ์ผ์ gem์ ํฌํจํ์ง ์๋๋ก ๊ถ์ฅํ์ฌ ์ด๋ฅผ ์ํํ๋ฏ๋ก Bundler๋ Gemfile.lock์ ๊ณ ์ ๋ ๋ฒ์ ๋์ Gemfile์ ๊ณ ์ ๋์ง ์์ ๋ฒ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋๋ค์ ์กฐ์ธ์ ๋ฌด์ํ๊ณ ์ํ๋ ๋๋ก ํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฏ๋ก ์ฌ์ ํ ๋์ฒ์์ ๊ณ ์ ๋ฒ์ ์ ์ป์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋จ์ํ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋งํ๊ธฐ์๋ ์๋ง๋ ๋๋ฌด ๊ฐํ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด๋ ์ด์ ์ ๋ชจ๋ ์๋๋ ์คํจํ์ผ๋ฉฐ ์๋ํ ๋ง์ ์ฌ๋๋ค์ ๋๋ณด๋ค ํจ์ฌ ๋๋ํ ๋งค์ฐ ๋๋ํ ์ฌ๋๋ค์ ๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ง ์์ผ๋ฉฐ ์ค์ ๋ก ๊ทธ๊ฒ์ ์ํํ๋ ๋งค์ฐ ํ๋ฅญํ ์ ์์ ๋ณผ ๋๊น์ง ๊ณ์ ์ด๋ฐ ์์ผ๋ก ์๊ฐํ ๊ฒ์ ๋๋ค.
@tsiq-oliverc Pieter Hintjens๋ "๋๊ธ์ ํ ๋ฆฌํ์คํธ ํ์์ผ๋ก ํ์ํฉ๋๋ค"๋ผ๋ ๊ฐ๋ ์ ์ด๋๊ฐ์ ์ผ์ต๋๋ค.
์ฒ ํ์ ์กฐ์ธ์์ ์ค์ ๋ก ์ ํ์ ์ด๊ณ ์ค์ฉ์ ์ธ ๊ฒ์ผ๋ก ์ด์ ์ ์ด๋ํ๊ธฐ ๋๋ฌธ์ ๋๋ ๊ทธ๊ฒ์ ์ข์ํฉ๋๋ค. ๋ํ ๋๊ธ ์์ฑ์๋ ์์ด๋์ด๊ฐ ๋ถ์์ ํ๊ฑฐ๋ ์ค์ ์ฌ์ฉ์์ ์ด๋ป๊ฒ ๋ ๊นจ์ง ๋ฐฉ๋ฒ์ ๋ํด ์ข ์ข ๋ฐฐ์ฐ๊ธฐ ๋๋ฌธ์ ๋๊ธ ์๋ฅผ ์ ํํฉ๋๋ค.
pipenv
๊ฐ ์ ๋๋ก ์ฌ์ฉ(๋๋ ์ต์ํ ์ฌ์ฉ)๋ python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ฅผ ์์ฒญํ๋๋ฐ ์๋ฌด ๊ฒ๋ ์ ๊ณตํ์ง ์์์ต๋๋ค.
tox
ํ์ง์ ๋ํด ์ธ๊ธํ์ง๋ง ์ต์ํ์ง ์๋ค๋ ๊ฒ์ ์ธ์ ํ๊ณ ์ฌ์ ํ ํ์ด์ฌ ํจํค์ง ๊ฐ๋ฐ ์ธ๊ณ์ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํด ๋ฐ๋ณตํฉ๋๋ค.
Flask
๋ ํน๋ณํ ๊ฒฝ์ฐ์ผ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋๋ Github์์ "library"๋ผ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ฌ ํ๋ก์ ํธ๋ฅผ ๊ฒ์ํ๋๋ฐ, ํฌํฌ ์์ ๋ฐ๋ผ ์ ๋ ฌ๋์๊ณ (์๋ง๋ ์ผ๋ง๋ ๋ง์ ์ฌ๋๋ค์ด ๊ฐ๋ฐ์ ํ๊ณ ์๋์ง ๋ฐ์ํ ์ ์์), ๋ชจ๋ "์ด๋ค ๊ฒ์ ์ ๋ณ๋ ๋ชฉ๋ก"์ ๋ฌด์ํ๊ณ ํ๋์ ๋ํ ํ๊ฒฝ์ ์๋ฅผ ๊ณ์ฐํ์ต๋๋ค. OS(์ผ๋ฐ์ ์ผ๋ก Linux):
ํ ์คํธ๋ฅผ ์คํํ ์ค์ ํ๊ฒฝ์ ์๋ ๋๋ถ๋ถ 2๋ฐฐ(+Windows) ๋๋ 3๋ฐฐ(+OSX)์ ๋๋ค.
tox
๋ 3๊ฐ ์ค 2๊ฐ์ ํ๋ก์ ํธ์์ ์ฌ์ฉ๋ฉ๋๋ค(๋ค๋ฅธ ์์ค์ ํ
์คํธ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ Travis ๋๋ Appveyor์ ๋น๊ตํ์ง ์์ต๋๋ค).
ํ ์คํธํ ํ๊ฒฝ์ ์๋ ๋ค์ ๋์ง๋ง Flask๋ ํ์คํ ๊ฐ์ฅ ๊ฑฐ์น ํ๊ฒฝ์ด ์๋๋๋ค.
๊ณ ์ ์ข ์์ฑ์ ์ ์ํ ํ๊ฒฝ์ ์๋ ์ค์ ๋ก ์๋์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๋จ์ํ Pipfile.lock
๋ฅผ ์ ์ฅ์์ ๋๋ ๊ฒ์ ๋ค์ ์ฝ์ง๋ง ๋ง๋ฒ์ ๊ฐ์ ์ ์์ต๋๋ค(๊ทธ๋ ๋ค๋ฉด ์ํฉ์ด ๊ฐ์ ๋ ๋ ์ค์ ์๋๋ฆฌ์ค๋ฅผ ๋ณด์ฌ์ฃผ์ธ์).
์๋ง๋ ๋น์ ์ "์ปดํ์ผ๋" ์ธ๊ณ์ ํฉ๊ธ๋ฅ ์ ์๊ณ ์๊ณ Python์์๋ ๊ฒฐ์ ์ฑ(๋๋ ๋ฐ๋ณต์ฑ)์ด ํ์ ์์๋ผ๊ณ ๋๋ ๊ฒ์ ๋๋ค. ๋ณด์๋ค์ํผ, ์ค์ ๋ก ๋ง์ Python ํ๋ก์ ํธ๊ฐ ๊ทธ๊ฒ ์์ด๋ ์ ์ด๊ธฐ ๋๋ฌธ์ ํฉ๊ธ๋ฅ ์ด โโ์ฌ๊ธฐ์์ ๊ทธ๋ ๊ฒ ์๊ฒฉํ๊ฒ ์ ์ฉ๋์ง ์์ ์ ์์ต๋๋ค.
์ํฉ์ ๊ฐ์ ํ python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด pipenv
์ฌ์ฉ์ ์ฐพ์ผ๋ฉด ๊ธฐ์ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ฐ์ ์ธ ํ์ง์ ํด๋ฅผ ๋ผ์น๋ ์ฌ์ฉ์ ๋ฐฉ์งํ๊ณ ์ถ์ต๋๋ค.
๊ทธ ๋ชฉํ์ ๋๋ฌํ๊ธฐ ์ํด ๋ด ์ ๊ทผ ๋ฐฉ์์ ์ง๋ฌธ์ ๋ฐ๋ณตํ๋ ๊ฒ์ ๋๋ค.
@feluxe
์ด๊ฒ์ด ๋ช ํํ์ง ์์ ๊ฒฝ์ฐ ์ฃ์กํฉ๋๋ค. ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข ์์ฑ์ ์ฌ๋๋ค์ด ํ์ฌ setup.py / install_requires์ ๋ฃ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์๋ง๋ pypi-dependencies๊ฐ ๋ด๊ฐ ์๋ฏธํ๋ ๋ฐ์ ๋ ๋์ ์ด๋ฆ์ด ๋ ๊ฒ์ ๋๋ค.
์ด ํธ์์ pbr
ํ ๋ก ์ ์ฐธ์กฐํ์ญ์์ค. Pipfile์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข
์์ฑ์ ์ง์ํ๋ ค๋ ๋
ธ๋ ฅ์
๋๋ค.
ํ๋์ Pipfile
๋ ๋ ๊ฐ์ง ์ฉ๋(lib์ app)๋ก ์ฌ์ฉ๋์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ๋ค์ ๋ณ๋๋ก ํด์ผ ํฉ๋๋ค. ์ ๋ง ํ์ํ๋ค๊ณ ๋๋ผ์ ๋ค๋ฉด ์ด๋ฅผ ํ์ฉํ ํ๋ก์ ํธ์ ๋ชฉ์ ์ ๋ง์ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ๊ณผ ๋ฐฐํฌ ํ๋ก์ ํธ๊ฐ ์๊ฐ์ ๋ฐ๋ผ ์๋นํ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ถ๋ฆฌ๋ ์ํ๋ก ์ ์งํ๋ ค๊ณ ํฉ๋๋ค.
@vlcinsky ๋๋ ๋น์ ์ด ์ด๊ฒ์ ์ด๋๋ก ๊ฐ์ ธ๊ฐ๊ณ ์ถ์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค(์ด๋ค ์ข ๋ฅ์ PR์ ์๊ตฌํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค!), ๊ทธ๋์ ๋๋ ์ง๊ธ ์ด ๋ํ์์
๋ด ์ ์ฅ์ TL;DR์ ๋ค์ ๋งํ๋ ค๋ฉด:
@uranusjr ์๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ ํน์ ์ธ์ด๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง, ๋จ์ํ ๋ค๋ฅธ ์ปค๋ฎค๋ํฐ๊ฐ ์ผ๋ฐ์ ์ธ ์๋ฃจ์ ์์ด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ฐ๊ฒฌ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฒ์ ์ถฉ๋์ด ์๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋๋ค.
Maven/Java(์:)๋ ๋น๋ ์ ์ด์ ๋ํด ์๊ฐํ๋๋ก ํฉ๋๋ค. NPM ๋ฐฉ์์ ์ผ์นํ์ง ์๋ ๋ฒ์ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ต์ฐจํ๋ ๊ฒฝ์ฐ ๋ฐํ์ ๋ฌธ์ ๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ๋ฐํ์ ํ์ธ(์: Python, ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ ์ข ์ ํญ๋ชฉ์ด ์ถฉ๋ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ข ์์ฑ ๋ฒ์ ์ด ์์ํ ๊ฒ๊ณผ ๋ค๋ฅธ ๊ฒฝ์ฐ.
@vlcinsky
์ด ๋ฌธ์ ์ pbr ํ ๋ก ์ ์ฐธ์กฐํ์ญ์์ค. Pipfile์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข ์์ฑ์ ์ง์ํ๋ ค๋ ๋ ธ๋ ฅ์ ๋๋ค.
pbr์ ํ๋ฅญํด ๋ณด์ด์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ํด๊ฒฐํ๋ ค๊ณ ํ๋ ๋ฒ์ฃผ์ ์ํฉ๋๋ค.
๋๋ ์ด์ ๊ฐ์ ๊ฒ์ด ๊ฒฉ์ฐจ๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ์ํฐ ํจํด ์น์ ๊ณผ ํ์ฌ ๋๊ตฌ์ ๋ฉ์ด๋ฆฌ์ ๋ํ ํ์์ฑ์ ์๋ตํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฐ ๋๊ตฌ๋ ์ ์ด์ ํ์ํ์ง ์์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ง ํ์ํ๋ค๊ณ ๋๋ผ์ ๋ค๋ฉด ์ด๋ฅผ ํ์ฉํ ํ๋ก์ ํธ์ ๋ชฉ์ ์ ๋ง์ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ๊ณผ ๋ฐฐํฌ ํ๋ก์ ํธ๊ฐ ์๊ฐ์ ๋ฐ๋ผ ์๋นํ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ถ๋ฆฌ๋ ์ํ๋ก ์ ์งํ๋ ค๊ณ ํฉ๋๋ค.
pypi ํจํค์ง์ ๊ฒฝ์ฐ ๊ฐ๋ฐ ์ข
์์ฑ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด Pipenv๋ฅผ ์ฌ์ฉํ๊ณ , dev ์ข
์์ฑ์ ์ค๋ช
ํ๊ธฐ ์ํด Pipfile
๋ฅผ, install_requires
๋ฐ setuptools
lib ์ข
์์ฑ์ ์ค๋ช
ํ๊ธฐ ์ํด setup.py
๋ฅผ ์ฌ์ฉํ์ต๋๋ค setuptools
in setup.py
pipenv run python setup.py bdist_wheel upload
์คํ ์ค์ธ ํจํค์ง ๊ฒ์ ์ด๊ฒ์ด ๋ด๊ฐ ๋ณต์กํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์
๋๋ค.
๋ค๋ฅธ ํ๋ ์ธ์ด์์๋ ํ๋์ ๋ช
๋ น์ค ๋๊ตฌ(ํจํค์ง ๊ด๋ฆฌ์)์ ํ๋์ ์ข
์์ฑ ํ์ผ ํ์์ ๋ฐฐ์์ผ ํฉ๋๋ค. ๋ฌธ์๋ ํ ๊ณณ์์ ์ฝ๊ฒ ๋ฐ๋ผํ ์ ์์ผ๋ฉฐ ์ด๋ณด์๋ ๋ช ์๊ฐ ์์ ์ด ๋ชจ๋ ๊ฒ์ ์ ๋ฆฌํ ์ ์์ต๋๋ค. npm init
, npm install foo --dev
, npm publish
์
๋๋ค. Pipenv/Pipfile์ ์ด๋ฏธ ๋๋ถ๋ถ์ ์์
์ ์ํํ ์ ์์ต๋๋ค. ๋ชจ๋ ์์
์ ์ํํ ์ ์๋ค๋ฉด ์ด์ ๊ฐ์ ๋ฌธ์ ๋ ์กด์ฌํ์ง ์์ ๊ฒ์
๋๋ค.
๋๋ ์ด ํ ๋ก ์ ๋ํ ์ผ์ข ์ "์ปค๋ฎค๋ํฐ" ์น์ /์ํค์ ๋ํ ๋์ ์์ฒญ์ ๋ค์ ์ค๋ช ํฉ๋๋ค. ํฉ๋ฒ์ ์ธ "ํจํด"์ด ์ฌ๋ฌ ๊ฐ ์์ผ๋ฉฐ ์ฐ๋ฆฌ ์ค ์ผ๋ถ๋ "python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ"์ ๊ณต์ ํ๊ณ ์ถ์ดํ ์ ์์ผ๋ฉฐ, ๋์ ๊ฐ์ ์ผ๋ถ๋ pbr์ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ์ผ๋ถ๋ ๋งค์ฐ ์ข์ ํจํด์ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ pipenv ๋ฌธ์ ๋ด๋ถ์ ํ์ด์ง๋ ์ข์ ์๊ฐ์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
์ถ์ : ์ pypi๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ค๋นํ๋ ค๋ฉด python setup.py ์ ๋ก๋๊ฐ ์๋ ๊ผฌ๊ธฐ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. "์ ๋ก๋"๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ํฐํจํด์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํฉ๋๋ค.
pipenv๊ฐ "๊ฒ์" ๋ช ๋ น์ ํค์ธ ์ ์์ต๋๊น?
@feluxe ์๋ฅผ ๋ณด๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฐ์ฐํ ๋ฐ๊ฒฌํ๊ณ ๊ทธ๊ฒ์ด ๋น์ ์ด ์ฐพ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๊ฒ์ pipenv
๊ฐ ํ๋ ์ผ๊ณผ ๊ทธ ์ด์์ ์ํํ๋ฉฐ ํนํ ์ข
์์ฑ ๊ด๋ฆฌ์ ๊ด๋ จํ์ฌ ๋ ์ ์ํํ๋ ๊ฒ ๊ฐ์ต๋๋ค(์ ์ด๋ ๊ทธ๋ค์ด ๊ฐ์ฅํ๋ ๊ฒ์
๋๋ค). ์ข
์์ฑ ๊ด๋ฆฌ, ํจํค์ง ๋ฐ ๋ชจ๋ ๋จ์ผ ๋๊ตฌ poetry
๊ฒ์๋ฅผ ์ํํฉ๋๋ค.
pipenv
๋ฐ poetry
๊ฐ ๋ง์นจ๋ด Python์๊ฒ ์ง์ ํ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋
ธ๋ ฅ์ ๋ชจ์ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ด ๋
ผ์๊ฐ ๋๋ฌด ์ง๋์น๊ธฐ ์ ์ ๋ค์ ํ ๋ฒ ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. Pipenv๋ ๋จ์ํ publish
๋ช
๋ น์ ํ์ฅํ๊ฑฐ๋ ํจํค์ง ์๋ฌด๋ฅผ ์ธ๊ณํ๋ ค๋ ๋ชจ๋ ์์
์ ์ํํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ฌ๋์ด ์ด๋ฐ ์์ผ๋ก ํ๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ์ํ๊ณ๊ฐ ๋ ํํธํ๋ ๋ฟ์ด๊ณ ์ฑ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข
์์ฑ์ด ์ด๋ก ์ ์ผ๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ํฌํ๋ก์์ ๊ตฌ๋ถ์ด ์ด๋ฃจ์ด์ง๋ฉด ๋ค์ ๋ณํฉํ๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค.
๊ฑฐ์ ๋ชจ๋ ์ฌ๋์ด ์ด ๋ณํฉ์ ์ฐธ์ฌํ๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ์ฌ์ค์ ์ผ์ด ์ ๋๊ณ ๋ค๋ฅธ ์ผ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด ํ ๋ก ์ ์ฐธ์ฌํ์ง ์๋ ์ฌ๋๋ค์ด ํจ์ฌ ๋ ๋ง์ต๋๋ค. ๋ฐ๋ณตํด์ ๋งํ์ต๋๋ค. ๋๊ตฌ ์ฒด์ธ ๋ฐ ํ์ผ ํ์์ ๋์์ธ ๊ฐ์ ์ ๋ํ ๋ ผ์๋ Python ํจํค์ง ๊ณ์ธต ๊ตฌ์กฐ์ ์์ ์์น์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ฏ๋ก Pipenv๊ฐ ์์กดํ๋ ๋ณด๋ค ๊ทผ๋ณธ์ ์ธ ๊ฒ์ ์ค๊ณํ๋ ์ฌ๋๋ค์๊ฒ ๋ ๋ง์ด ๋ ธ์ถ๋ฉ๋๋ค. ๊ทธ๊ณณ์์ ํ ๋ก ์ ํ์๊ธฐ ๋ฐ๋๋๋ค. Pipenv๊ฐ ๋ณ๊ฒฝํ ์์น์ ์์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ ์ํ๋ ๊ฒ์ ์๋ฌด ์์ฉ์ด ์์ต๋๋ค.
๋ฐ๋ณตํด์ ๋งํ์ต๋๋ค. ๋๊ตฌ ์ฒด์ธ ๋ฐ ํ์ผ ํ์์ ๋์์ธ ๊ฐ์ ์ ๋ํ ๋ ผ์๋ Python ํจํค์ง ๊ณ์ธต ๊ตฌ์กฐ์ ์์ ์์น์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ฏ๋ก Pipenv๊ฐ ์์กดํ๋ ๋ณด๋ค ๊ทผ๋ณธ์ ์ธ ๊ฒ์ ์ค๊ณํ๋ ์ฌ๋๋ค์๊ฒ ๋ ๋ง์ด ๋ ธ์ถ๋ฉ๋๋ค.
ํจํค์ง ๋ฐ ๊ฒ์๊ฐ ์์๋๋ฉด์ ์ด ๋ฒ๊ทธ์ ๋ํ ๋ ผ์๊ฐ ํต์ ๋ถ๋ฅ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค(์ด ๋ฒ๊ทธ๋ ์ข ์์ฑ ๊ด๋ฆฌ์ ๊ดํ ๊ฒ๋ฟ์ ๋๋ค!). ํ์ง๋ง ์ด ํ ๋ก ์ ํ ์ ์๋ ์ฌ๋ฐ๋ฅธ ์ฅ์๋ฅผ ์๋ ค ์ฃผ์๊ฒ ์ต๋๊น? ์ฌ๋๋ค์ pipenv๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋งค์ฐ ํ์ํ ๋จ๊ณ๋ก ๊ฐ์ฃผ๋๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์๋ ๊ฒ์ ๋๋ค. pipenv ์ ์ง ๊ด๋ฆฌ์์๊ฒ ์ถ๊ฐ ์ฑ ์์ ๋ถ๊ณผํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ด ์๋๋๋ค.
ํธ์ง : ์ฃ์กํฉ๋๋ค. ์ ๋๊ธ์ ์ฒ์ ์ฝ์ ๋ ์ ํํ ๊ทธ๋ ๊ฒ ํ ๊ฒ์๋ฌผ์ ๋์ณค์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ด ์ ์์ ๋ฒ์ ๋ด์์ ์ ์ฒด Python ํจํค์ง ์ปค๋ฎค๋ํฐ๋ฅผ ์ํ ์๋ก์ด ์ํฌํ๋ก๋ฅผ ์์ ํ๋ ํ ๋ผ ๊ตฌ๋ฉ์ผ๋ก ๋ค์ด๊ฐ๋ ๋์ ํ์ฌ ๊ฐ๋ฅํ ๋ชจ๋ฒ ์ฌ๋ก์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ฌ ์ ์ฝ ์กฐ๊ฑด ๋ด์์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ํ๊ณ ๊ฐ์ ์ ์ํ ๋ ผ์๋ฅผ ์์ํ๋ ๊ฒ์ด ๋ ์์ฐ์ ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ๋งค์ฐ ๋์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋จผ์ ๋์๊ด ๊ด๋ฆฌ์๋ค์๊ฒ ์ต์ ์ ์ํฌ ํ๋ก์ฐ ์ง๊ธ ์ฐ๋ฆฌ๋ ํฐ ๊ณํ์ ๋ง๋ จํ๊ธฐ ์ ์ ๋ฌด์์ธ์ง ํ์ ํด์ผํ๋ค. ์ด ์ค๋ ๋์ ์์ ๋ถ๋ถ์์ ํ๋ ๊ฒ์ฒ๋ผ ๋ค์ ๊ทธ๊ฒ์ ์ด์ ์ ๋ง์ถฐ ๋ณด๊ฒ ์ต๋๋ค. ์์ง ๊ฒฐ๋ก ์ ์ด๋ฅด์ง ๋ชปํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฃผ์ ๋ก ๋์๊ฐ๊ธฐ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๋ค๋ฅธ ํ์ผ์์ ์ข ์์ฑ์ ์ ์ํด์ผ ํ๋ ์ด์ ์ ๋ํ @uranusjr ์ ๊ฒ์๋ฌผ ์ธ์ฉ:
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ข ์์ฑ ๋ฒ์ ์ "๊ณ ์ ํด์ "ํ๋ ํจํค์ง ๋๊ตฌ์์ ์๋ฆฌํ ์์ ์ ์ํํ๋ ๊ฒ์ ๋๋ค. (Ruby์) Bundler๋ ์ฌ๋๋ค์๊ฒ ์ ๊ธ ํ์ผ์ gem์ ํฌํจํ์ง ์๋๋ก ๊ถ์ฅํ์ฌ ์ด๋ฅผ ์ํํ๋ฏ๋ก Bundler๋ Gemfile.lock์ ๊ณ ์ ๋ ๋ฒ์ ๋์ Gemfile์ ๊ณ ์ ๋์ง ์์ ๋ฒ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋๋ค์ ์กฐ์ธ์ ๋ฌด์ํ๊ณ ์ํ๋ ๋๋ก ํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฏ๋ก ์ฌ์ ํ ๋์ฒ์์ ๊ณ ์ ๋ฒ์ ์ ์ป์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋จ์ํ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋งํ๊ธฐ์๋ ๋๋ฌด ๊ฐํ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด๋ ์ด์ ์ ๋ชจ๋ ์๋๋ ์คํจํ์ต๋๋ค.
ํ์ฌ๋ก์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๊ณต์ ๊ถ์ฅ ์ฌํญ์ด CI ๋น๋์ pipenv
๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง Pipfile.lock
๋ฅผ ์์ค ์ ์ด์์ ์ ์ธํ๋ ์ด์ ๋ฅผ ์ฌ์ ํ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ช๋ช ์ฌ๋๋ค์ด ์ง์ ํ๋ฏ์ด pipenv
๋ ํ์ฌ ํจํค์ง ํ๋ก์ธ์ค์ ์๋ฌด ๊ด๋ จ์ด ์์ผ๋ฏ๋ก ์์์ ์ค๋ช
ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์์ผ ํฉ๋๋ค.
๋ํ ์ด๊ฒ์ด ์ ํ๋ฆฌ์ผ์ด์
์ด ์ถ์ ์ข
์์ฑ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋์ผํ ํ์ผ์์ ์ถ์ ์ข
์์ฑ์ ์ ์ํ๋ ๊ฒ์ ๋ฐ๋ํ๋ ์ฃผ์ฅ์ธ ์ด์ ๋ ์ ์ ์์ต๋๋ค. pipenv
๊ฐ Pipfile
์ setup.py
๋ฅผ ํตํฉํ๊ธฐ ์ํ ์ ๊ตํ ์๋ฃจ์
์ ๊ตฌํํ๊ณ ์ถ์ง ์๋ค๋ฉด ๊ด์ฐฎ์ต๋๋ค. ํ์ง๋ง ๊ทธ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ์ ๋์ ์๊ฐ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@vlcinsky
ํ๋์ Pipfile์ ๋ ๊ฐ์ง ์ฉ๋(lib์ app)๋ก ์ฌ์ฉํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ์์ ์ ๋ณ๋๋ก ์ํํด์ผ ํฉ๋๋ค.
๋ด ์์ ๊ฒ์๋ฌผ์ ์ฐธ์กฐํ์ญ์์ค. ์ ๊ทธ๋ ๊ฒ ์๊ฐํ๋์ง ์์ธํ ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๋ ์์น์ ์ผ๋ก ์ด๋ค ๋จ์ ๋ ๋ณผ ์ ์์ต๋๋ค. ์ง๊ธ ๋น์ฅ์ Pipfile
๋ฅผ ํฌํจํ๋ ๊ฒ์ด ์ข์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ ๊ฐ์ ๋ค๋ฅธ ํ์ผ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ข
์์ฑ์ ์ ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ข
์์ฑ ์ ์ธ์ Pipfile
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค.
๋์ ๊ฐ์ ์ํฉ์ ์์ง ์๋ ํ Pipfile.lock
๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ค ์ ์ด์ ์์ด์๋ ์ ๋๋ค๋ ๋ฐ ์ด๋ฏธ ๋์ํ์ต๋๋ค.
ํธ์ง : ๋ํ pipenv
์์ฒด๊ฐ ์ค์ ๋ก ์ฐจ์ด์ ์ ๋ํด ์์์ผ ํ๋ ๊ฒ์ผ๋ก ํ๋ช
๋๋ฉด app-dependencies
๋ฐ lib-dependencies
๋์
์ ์์ํ๊ธฐ ์ ์ ํ๋ฌผ์ crate-type
ํ๋์ ๊ฐ์ ๊ฒ์ ๋์
ํ ์ ์์ต๋๋ค. lib-dependencies
- ๋๋ฌด ๋ณต์กํ๊ฒ ๋ค๋ฆฝ๋๋ค.
@Moritz90 Python์ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ ์ค ์ผ๋ถ๋ ์ด ํ ๋ก ์ ๊ฐ์ตํ๊ธฐ์ ์ข์ ์ฅ์์ ๋๋ค.
pypa-dev ๋ Python ํจํค์ง ๋ฐ ์ด๋ฅผ ๋๋ฌ์ผ ์ํ๊ณ๋ฅผ ์ค์ฌ์ผ๋ก ๋ ผ์ํ๋ ๋ฐ ๊ฐ์ฅ ํ์คํฉ๋๋ค. ๋น์ทํ ํ ๋ก ์ ๊ฒ์ํ๋ ค๋ฉด ์ฌ๊ธฐ์์ ์์ํ ๊ฒ์ ๋๋ค.
python-ideas ๋ ์์ด๋์ด๋ฅผ ๋ ผ์ํ ์ ์๋ ์ฅ์์ด๋ฉฐ ์ ์ฒด Python ์ปค๋ฎค๋ํฐ์ ๋ํ ๊ฐ์์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค. ์ด๊ฒ์ PEP ์์ค์ผ๋ก ๋ฐ์ด๋ถ์ด๊ณ ์ถ๋ค๋ฉด ์ข์ ์ถ๋ฐ์ ์ด ๋ ๊ฒ์ ๋๋ค.
@tsiq-oliverc
PR์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ทํ์ ๊ฐ๋ ์ด ์คํ ๊ฐ๋ฅํจ์ ์ฆ๋ช ํ๋ ์๋ฅผ ๋ณด์ฌ์ฃผ์ญ์์ค.
๋ฐ๋ผ์ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ๊ณ ํฌํฌํ๊ณ (1)์ ์ ์ฉํฉ๋๋ค. pipenv
๋ก ์ฝ๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ๋งํ๊ณ ๋์๊ฒ ๋ณด์ฌ์ค๋๋ค. ๊ฝค ๋
ธ๋ ฅํ๊ณ ์ด๋ ค์์ ๊ฒช์์ต๋๋ค.
๊ทํ์ (2)๊ฐ "๋ค๋ฅธ ์ฌ๋์ด ์์ ์ ์ํํด์ผ ํจ"์ ์๋ฏธํ๋ ๊ฒฝ์ฐ ๊ทํ์ PR์ ์กด์ฌํ์ง ์์ต๋๋ค.
(3)์์ ์ค์๋ฅผ ์ ๊ณตํ์ง ์๊ณ "์์ ๋ถ๋ถ ์งํฉ ์ฌ๋ก"์ ๋ํด ์ด์ผ๊ธฐํฉ๋๋ค. virtualenv์ ์์ ๊ด๋ จํ์ฌ ๋ด๊ฐ ์ค๋ช ํ ๋ชจ๋ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ "์์ ํ์ ์งํฉ"์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๊น?
์ด ํ ๋ก ์ ๋ง์น๊ธฐ ์ํด ํ ๋ก ์ค์ ๋ฐ๊ฒฌํ ๋ด์ฉ์ ๋ํ ๊ฐ๋ตํ ์์ฝ์ ๋ง๋ค์์ต๋๋ค.
pipenv
(์ํฐ) ํจํด๋๋ ์ด์ ์ ์ฝ๊ฐ ๋ฐ๊ฟจ๋ค. ๊ทธ๊ฒ์ (์ผ๋ฐ) ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฟ๋ง ์๋๋ผ ๊ทธ๊ฒ์ ํฌํจํ๋ ๊ฒ์ด ๋ค์ ์ ๋ ดํ๊ณ ์ฐจ์ด์ ์ ์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด์๋ ์ด์ผ๊ธฐํฉ๋๋ค.
pipenv
, tox
๋ฑ๊ณผ ๊ฐ์ ๊ธฐ์กด ๋๊ตฌ์ ๋ณ๊ฒฝ์ ์ ์ํ๋ ๊ฒ์ ์๋์ ์ผ๋ก ์ ์ธํ์ต๋๋ค.
pipenv
์ด๋ ๋ฌด์์ด๋ฉฐ ๋ฌด์์ด ์๋์งPipfile.lock
๋ฅผ ํตํด ๊ตฌ์ฒด์ ์ธ ์ข
์์ฑ์ ์ ์ํ๊ณ ์ ์ฉํ ์ ์๋ ๋ฐฐํฌ ๋๊ตฌ์
๋๋ค.(python ์ํํธ์จ์ด) ์ ํ์ ๋ค๋ฅธ ์ ํ(๋ฐ๋ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์์ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์๊ฑฐ๋ ์คํํ ์ค๋น๊ฐ ๋ ์ต์ข ์์ฉ ํ๋ก๊ทธ๋จ์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก "์ํฐํ๋ผ์ด์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ"๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ฃผ์ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(๊ฐ์ ๊ท์น์ด ์ ์ฉ๋๊ณ ์คํ ์ปจํ ์คํธ์ ์๋ง ๋ ์ ์).
pipenv install <package>
๋ฐ๋ผ์ "ํจํค์ง ์คํ(๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ํ์ธ)"pipenv sync
๋ฐ๋ผ์ "๊ตฌ์ฒด์ ์ธ ์ข
์์ฑ ์ ์ฉ"๊ตฌ์ฒด์ ์ธ ์ข ์์ฑ: ์ด์์ ์ผ๋ก ์ฌ์ฉ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด์์ ํจ๊ป ๋ฒ์ ์ ๊ณ ์ ํด์ผ ํฉ๋๋ค.
pipenv
์ ๋ฌผ:Pipfile
: ์ถ์ ์ข
์์ฑ
Pipfile.lock
: ๊ตฌ์ฒด์ ์ธ(์ ๊ธด) ์ข
์์ฑ"tox
๋๋ ์ ์ฌํ ํ
์คํธ SW ์ฌ์ฉpipenv
๋ฐ ๊ตฌ์ฒด์ ์ธ ์ข
์์ฑ์ ์ฌ์ฉํ์ง ์์(๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํฉํ ์ ์์)Pipfile
์์Pipfile.lock
๋ง๋ pipenv install -e .
Pipfile.lock
ํ๊ฒฝ์ ๋ฌธ์ํ(๋ด์ธ)ํ๊ณ ๋์ค์ ๋ฌธ์ ๋ถ์์ ์ํด virtualenv๋ฅผ ๋ณต์ ํ ์ ์์ต๋๋ค.๋ชจ๋: "์์ด์ค ์์ด์ง"
setup.py
install_requires
๋ด์ ์ ์๋จ)์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ pypi์ ์ข
์ ํจํค์ง๊ฐ ์
๋ฐ์ดํธ๋๋ฉด pipenv install -e .
Pipfile.lock
๋ฅผ ์ฌ์์ฑํฉ๋๋ค.pipenv sync Pipfile.lock
์ํด ์์ฑ๋ virtualenv ๋ด์์ ์คํ๋ฉ๋๋ค.Pipfile.lock
๋ ์ด๋ป๊ฒ ๊ทธ๋ฆฌ๊ณ ๋๊ฐ ๋ง๋ค ์ ์์ต๋๊น?๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก(์์ฉ ํ๋ก๊ทธ๋จ์์ ์๋ํ ์ ์์)
์์ฉ ํ๋ก๊ทธ๋จ: ๊ฒฐ์ ์ฑ(์ ํํ ์คํ ์ปจํ ์คํธ ๋ด์์ ์ ํํ ๋์ผํ ๋ฐฉ์์ผ๋ก ์คํ)
๊ณต๊ฐ pypi(๋ฎ์ ๊ฒฐ์ ์ฑ, ํจํค์ง๋ ์ธ์ ๋ ์ง ์ ๋ฐ์ดํธ๋จ)
Pipfile.lock
): ์ด์ฒด์ ๊ฒฐ์ ๋ก Pipfile.lock
์ผ๋ถ ์ฌ์ฉ ์ฌ๋ก:ํ๋ก๋์ ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ
pbr
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ requirements.txt
๋ฅผ ํตํด ์ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข
์์ฑ์ ์ ์ํ ์ ์์ต๋๋ค. Pipfile
์
๋ฐ์ดํธ๊ฐ ์งํ ์ค์
๋๋ค.
poetry
ํจํค์ง๋ pyenv
์ ์ ์ฌํ ๊ฒ์ ์๋ํฉ๋๋ค.
"์ ๊ธ ํ์ผ์ repo์ ๋๋กญ"ํ๋ฉด ๊ฒฐ์ ์ ๋น๋๊ฐ ํ์๋ฉ๋๋ค.
Pipfile.lock
๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ์๋ํ์ง ์์ต๋๋ค. ์ง์งํ๊ฒ: flask
๋ 11๊ฐ์ ๋ค๋ฅธ ๊ฐ์ ํ๊ฒฝ(ํ๋์ OS์์) 10๊ฐ์ ๋ค๋ฅธ ์ ๊ธด ์ข
์์ฑ์ ๋ณด์ฌ์ค๋๋ค. ๋๊ฐ ๋ง๋ค๊ณ ์ปค๋ฐํ ๊ฒ์ธ๊ฐ?Pipfile.lock
(CI ์คํฌ๋ฆฝํธ์ ์ํด ์์ฑ๋จ)๋ฅผ ์ป์ ์ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ๊ณณ์์ virtualenv๋ฅผ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.Pipfile.lock
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฅ์setup.py
๋ด์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข
์์ฑ์ ๊นจ์ง ์ ์๋ฅผ ์จ๊ธธ ์ ์์ต๋๋ค.Pipfile
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฅ์setup.py
๋ด์์ ์ ์๋๋ ์ถ์ ์ข
์์ฑ์ ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ ๊นจ์ง setup.py
์ข
์์ฑ ์ ์ธ์ ์จ๊ธธ ์ ์์ต๋๋ค.Pipfile
๋ก pipenv install -e .
๋๋ pipenv install -e .[tests]
๋น์ ์ ๋ํ ํ
์คํธ ์ข
์์ฑ ๊ทธ๋ค์ "ํ
์คํธ"๋ฅผ์ ์์คํธ๋ผ๋ก ์ ์ธ ํ์ํ๋ค๋ฉด setup.py
pipenv install <something>
์ถ๊ฐpipenv
๊ฑฐ์ณ์ผ ํจ).Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ(ํนํ ์ผ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ ์๊ธฐ์น ์๊ฒ ๋ง์ ์์ ์คํ ์ปจํ ์คํธ๋ฅผ ๋ํ๋ ๋๋ค. ๊ทธ ์ด์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชฉํ๋ ๋ค์ํ ์กฐ๊ฑด์์ ์ ์ฆ๋ ์ ์ฐ์ฑ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฒฐ์ ์ ๋น๋๋ณด๋ค ์ ์ฐ์ฑ์ด ๋ ์ค์ํด ๋ณด์ ๋๋ค. "์ปดํ์ผ" ์ธ๊ณ์์ ์จ ์ฌ๋๋ค์๊ฒ ์ด๊ฒ์ ๋งค์ฐ ๋์ ๋ฐํจํด์ฒ๋ผ ๋๊ปด์ง ์ ์์ต๋๋ค. ์ฌ์ค์ ๋๋ถ๋ถ์(์๋ง๋ ๋ชจ๋ ) Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ฒฐ์ ๋ก ์ ๋น๋๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉฐ(์ผ๋ถ ์๊ณ ์๋ ๊ฒฝ์ฐ ์๋ ค์ฃผ์ธ์) Python์ ์ฌ์ ํ โโ์ ์๋ํ๊ณ ์์ต๋๋ค. Python ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ด์ ์๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์คํฌ๋ฆฝํ ์ธ์ด๋ก์์ Python์ด ์ปดํ์ผ๋ ์ธ๊ณ์ ๋ค๋ฆ ๋๋ค. ๋ค๋ฅธ ์ด์ ๋ ๊ฒฐ์ ๋ก ์ด ๋์ค์ ํ ๋จ๊ณ ๋์ค์ ํด๊ฒฐ๋ ์ ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ (๋ผ์ด๋ธ๋ฌ๋ฆฌ ์งํฉ์์ ๋น๋)์ด ๊ฒฐ์ ๋ก ์ ๋ํ (์์ฐ์ค๋ฝ๊ณ ์ ๋นํ) ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ ์ํฉ์ด ์ ๋ฐ๋์ด๋ฉฐ ์ฌ๊ธฐ์ pipenv
์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐ์ ๋ก ์ ์ฝ๊ฒ ๋๋ฌํ ์ ์์ต๋๋ค.
๋ค์์ ๋ฌด์์ํ ์ง?
๋งค์ฐ ๊ณ ๋ฌด์ ์ธ ํ ๋ก ์ ํด์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. "๋๋ ์ด ์ฃผ์ ์์ ์์ ํ ๋น ์ก์ต๋๋ค"๋ผ๋ ๋ฉ์์ง๊ฐ ์ธ ๋ฒ ๋ฆฌํฉํ ๋ง๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ์ด๋ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๋ฆฌ๊ฐ ์ข์์ก๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
@vlcinsky poetry
๋ pyenv
์ ์๋ฌด ๊ด๋ จ์ด ์์ต๋๋ค. pipenv
(๊ทธ๋ฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ, IMO ๊ด๋ฆฌ์ ๊ด๋ จํ์ฌ ํจ์ฌ ๋ ๋์ ๊ตฌํ์ด ์์)์ ๋น์ทํ์ง๋ง ํจํค์ง ๋ฐ ๊ฒ์ ๋ถ๋ถ์ด ์์ต๋๋ค.
๋น์ ์์ด pyproject.toml
ํ๋ก์ ํธ ๋ฐ ์ข
์์ฑ (์ถ์ ์์กด์ฑ)๊ณผ ์ ์ ํ์ผ์ pyproject.lock
๊ณ ์ ๋ ์ข
์์ฑ์ ์ค๋ช
ํ๊ณ ํ์ด์ฌ ๋ฒ์ ๋ฐ ํ๋ซํผ์ ๊ณ ์ ๋์ด ์ด๋ pyproject.toml
pipenv
์ด ์ง๋ฉดํ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ํ๋์ ๊ฒฐ์ ์ ์ ๊ธ ํ์ผ๋ง ๊ฐ๋๋ก ํ์ผ์ ์ง์ ํ์ต๋๋ค. poetry
๋ ์ค์นํ ๋๋ง ํ๊ฒฝ์ ๋ํด ํ์ธํ์ฌ ์ค์นํ ํจํค์ง๋ฅผ ํ์ธํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจํค์งํ ๋ ๊ณ ์ ๋ ์ข ์์ฑ์ด ์๋ ์ถ์ ์ข ์์ฑ์ ์ฌ์ฉํ๋ฏ๋ก ํจํค์ง๋ฅผ ๋ฐฐํฌํ ๋ ์ ์ฐ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค(์: PyPI๋ฅผ ํตํด).
์ด๊ฒ์ ์ฅ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ถ์ ์ข ์์ฑ๊ณผ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ์ ๊ธ ํ์ผ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๋ ์ธ๊ณ์ ์ต๊ณ ์ ๋๋ค.
๊ณ ์ ๋ ์ข ์์ฑ์ ์ฌ์ฉํ์ง ์๋ @zface ์๋ ๋ง ๊ทธ๋๋ก ์ ์ฒด ๋ชฉ์ ์
๋ณธ์ง์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ๊ฒช์ง ์๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ฐฝํ ์ฃผ์ฅ์ ํ๋ ์๊ท๋ชจ ํ๋ก์ ํธ๊ฐ ๋ง์ ๋ ธ๋ ฅ์ ๋ค์ผ ํ์๊ฐ ์๋ ๋ณต์๋ ฅ์ ๋ง์ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ํฌ์ํฉ๋๋ค. ๋ค๋ฅธ ๋๊ตฌ๊ฐ ๋ชจ๋ ์ธ๊ณ์ ์ต๊ณ ๋ฅผ ์ ๊ณตํ๋ค๊ณ ์ง์ ์ผ๋ก ๋ฏฟ๋๋ค๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. pipenv ์์ฒด๋ ๊ฐ๊น์ด ์์ผ ๋ด์ ํจํค์ง์ ์ฒ๋ฆฌํ์ง ์์ ๊ฒ์ ๋๋ค.
@techalchemy ์ ๋ ์๋ฌด ๊ฒ๋ ํ๋งคํ์ง ์์ต๋๋ค. ์ค์ ๋ก pipenv
์์ ์ฌ์ฉํ ์ ์๋ ์์ด๋์ด๋ฅผ ์๋ดํ๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ poetry
๋ pipenv
๊ฐ Pipfile.lock
์์ ํ๋ ๊ฒ์ฒ๋ผ pipenv
pyproject.lock
์์ ์ข
์์ฑ์ ๊ณ ์ ํฉ๋๋ค. ๋ฐ๋ผ์ pipenv
์ ๊ณตํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ฌ์์ฐ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ ๊ธ ํ์ผ์ด ์์ผ๋ฉด ๊ณ ์ ๋ ์ข
์์ฑ์ ์ฌ์ฉํ๊ณ ์ค์นํ๋ฉฐ ๋ด๊ฐ ํ๋ฆฌ์ง ์์ ๊ฒฝ์ฐ pipenv
์ํํฉ๋๋ค.
์ถ์ ์ข ์์ฑ์ ์ฌ์ฉํ๋ ์ ์ผํ ๊ฒฝ์ฐ๋ ๋ฐฐํฌ์ฉ(๊ธฐ๋ณธ์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฉ) ํ๋ก์ ํธ๋ฅผ ํจํค์งํ ๋์ ๋๋ค. ์ด ๊ฒฝ์ฐ ๊ณ ์ ๋ ์ข ์์ฑ์ ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
@vlcinsky ์์ง ์ ๋ฆฌ, ์์ ๋๋ ํ์ฅํด์ผ ํ ๋ช ๊ฐ์ง ์ฌํญ์ด ์์ง๋ง Pipenv ๋๋ ๊ธฐํ ๋ฌธ์ ํ์์ผ๋ก ์ ํํ๋ ๋ฐ ์ฌ์ ํ ๋งค์ฐ ์ด์ฌ์ ๋๋ค. ํ ๋ฆฌํ์คํธ๋ฅผ ๋ณด๋ด๋ ๋ฐ ๊ด์ฌ์ด ์์ผ์ญ๋๊น? ๊ธฐ์ฌ๋ฅผ ๊ตฌ์ฒดํํ๋ ๋ฐ ๋์์ด ๋์์ผ๋ฉด ํฉ๋๋ค.
์์ ๊ด๋ จํ์ฌ ๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ ์ฒด์ ์ผ๋ก ํฌ์ด ์๋์ง๋ง ๋ง์ ์ฌ๋ฐ๋ฅธ ์ผ์ ํฉ๋๋ค. Pipenv ๊ฐ๋ฐ์๊ฐ ์ฌ๋๋ค์๊ฒ ์๋ฆฌ๊ณ ์ ํ๋ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์๋ฐํ๊ธฐ ๋๋ฌธ์ Pipenv ๋ฌธ์์์ ์ธ๊ธํด์๋ ์ ๋์ง๋ง pypa-dev ๋๋ ์ด์ ์ ์ฌํ ํ ๋ก ์ด ์ด๋ฆฌ๋ ๊ฒฝ์ฐ ํจํค์ง ๋ฐฉ์์ ๋ํ ์์ ํ ๊ทธ๋ฆผ์ ์ ๊ณตํ๊ธฐ ์ํด ์ธ๊ธํด์ผ ํฉ๋๋ค. ์ํ๊ณ๋ ํ์ฌ์ ๋๋ค.
์๋ ๋ํ ๋ ๋ง์ ๊ด์ฌ๊ณผ ๊ธฐ์ฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ฒ์ Pipenv๋ฅผ ํฌํจํ ์ปค๋ฎค๋ํฐ์ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค. ์คํ ๊ฐ๋ฅํ ์ ํ์ ํตํด ์ฌ๋๋ค์ ๋จผ์ Pipenv ํค๋์ ๋ค์ด๊ฐ์ ์์ํ ๋๋ก ๋์ง ์๋๋ค๊ณ ๋ถํํ๋ ๋์ ์ ํ์ ๊ฐ์ค์น๋ฅผ ๋ ์ ์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ ์ข์ ๊ฒฝ์์ ๋ํ Pipenv์ ์๊ฐ ๋ชจ๋ ํ๋(์๋ฒฝํ์ง๋ ์์) ์ข ์์ฑ ํด๊ฒฐ ์ธก๋ฉด์์ ๊ธฐ์ ์ ์ธ ๊ฐ์ ์ ์ด์งํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์๋ก์๊ฒ์ ๋ง์ ๊ฒ์ ๋ฐฐ์ธ ์ ์์ต๋๋ค.
@uranusjr ์, ๋ช ํํ ๋ฐํ์ง ์ฌํญ์ด ๊ฑฐ์ ์์ผ๋ฉฐ ๋ ๋ง์ ์ฒญ์ค๊ณผ ๊ณต์ ํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋ฌ๋ถ์ ๋์์ ์ง์ฌ์ผ๋ก ํ์ํฉ๋๋ค.
"์ ๋ฌธ์ ์ด์"์ ์ด๋ป์ต๋๊น? ํ์์ ์์๋ 2์ธ์ ์๊ท๋ชจ๋ก ์์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ํจ๊ณผ์ ์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ ์๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(1~2ํ ๋ฐ๋ณต ๊ฐ๋ฅ).
(ํ ๋ก ๋ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก) ์ค์ค๋ก ์์ฑํ๊ณ ์ถ๊ณ ์ ๋ฅผ ๋ฆฌ๋ทฐ์ด๋ก ์ผ๋๋ค๋ฉด ์ ๋ ๋ถํํ์ง ์์ ๊ฒ์ ๋๋ค.
๋ค์ ์กฐ์น์ ๋์ํ๊ธฐ ์ํด ์ด๋ฉ์ผ๋ก ์ฐ๋ฝ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
@vlcinsky ๋ํ ์ค์๊ฐ ์ํธ ์์ฉ์ ์ ํธํ๋ ๊ฒฝ์ฐ PySlackers (Slack ์์
๊ณต๊ฐ)์์ @uranusjr
๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. Pipenv์๋ ์ฑ๋์ด ์์ต๋๋ค( #pipenv
).
@uranusjr ๋
ธ๋ ฅ์ ๋ชจ์๋ค๋ ๋ป์
๋๋ค. Python์ ํ๋ฌผ๊ณผ ๊ฐ์ ์ข์ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์ ์คํ ํ์ํฉ๋๋ค. Python ์ํ๊ณ๋ ์์
์ ์ํํ๋ ํ์ค ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ธ์ด์ ๋นํด ์ฐฝ๋ฐฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ pipenv
๋ ๋์์ด ๋์ง ์์ ๊ฒ์
๋๋ค.
์ ๋ฅผ ๊ดด๋กญํ๋ ๊ฒ์ pipenv
์์ ์ the officially recommended Python packaging tool
๋ก ๊ด๊ณ ํ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ํจํค์ง ๋๊ตฌ๊ฐ ์๋๋ผ ์ฌ์ฉ์์๊ฒ ์คํด์ ์์ง๊ฐ ์์ต๋๋ค. virtualenv ๊ด๋ฆฌ์์ ๊ฒฐํฉ๋ ์ข
์์ฑ ๊ด๋ฆฌ์์ผ ๋ฟ์
๋๋ค.
๋ํ ํจํค์ง ๋๊ตฌ์ธ ์นด๊ณ , npm, yarn์์ ์๊ฐ์ ์ป์๋ค๊ณ ํ๋๋ฐ, ํ์ดํ์ ๊ทธ๋ ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ pipenv
์ ๊ฒฐํจ์ด ์์ต๋๋ค. ์ฌ๋๋ค์ requirements.txt
vs setup.py
์ฌ์ ํ ๋์ผํ ์ค์๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋ฌผ์ ํ๋ฆฌ๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ ๋๋ฌธ์ ํ๋ก์ ํธ๋ setup.py
์ ์๋ชป ์ ์๋ ์ข
์์ฑ๊ณผ ํจ๊ป ์ฌ์ ํ ์๋ชป ํจํค์ง๋ฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํ๋ฌผ๊ณผ ๊ฐ์ ํ๋ก์ ํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ ๊ฒ์
๋๋ค. pipenv
์ ๊ฐ์ ํ๋ก์ ํธ๋ ๊ทธ๋ ์ง ์์ ๋ฐ๋ฉด ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํ๋ก์ ํธ/์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ๋ชจ๋ ์ธก๋ฉด์ ์ฒ๋ฆฌํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ๋งํ ๋ :
Pipenv์ ์๊ฐ ๋ ๋ค ํ๋ ๊ฒ(์๋ฒฝํ์ง๋ ์์)
๋ฌด์จ ๋ป์ด์์? ๋ด๊ฐ ๋ณธ ๋ฐ์ ๋ฐ๋ฅด๋ฉด, ๊ทธ๋ค์ ์์กด์ฑ ๊ด๋ฆฌ์๋ pipenv
์ ๊ณตํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํ๋ ฅ์ ์
๋๋ค. ์ ์ผํ ๋จ์ ์ ์๋ชป ๊ฒ์๋ ํจํค์ง๋ก ์ธํด ์ข
์์ฑ ์ ๋ณด๊ฐ ์๋ PyPI JSON API๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์
๋๋ค.
์ด์จ๋ ๋ง์ํ์ ๊ฒ์ฒ๋ผ ๋ ํ๋ก์ ํธ๊ฐ ์๋ก ๋ฐฐ์ธ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ ๊ฐ์ง ๋, ๊ถ๊ทน์ ์ผ๋ก pip๊ฐ Pipfile
์ฒ๋ฆฌํ๋ค๋ฉด pipenv์ ๋ฏธ๋๋ ์ด๋ป๊ฒ ๋ ๊น์? virtualenv ๊ด๋ฆฌ์ ์ผ๋ฟ์
๋๊น?
์ ์ข ์์ฑ ๊ด๋ฆฌ์๊ฐ json API์ ์์กดํ๋ ๊ฒฝ์ฐ '์๋ชป ๊ฒ์๋ ํจํค์ง'๋ก ์ธํด ๋๋๋ก ์๋ชป๋ ๋ฟ๋ง ์๋๋ผ ์ค์ ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ํด๊ฒฐํ ์ ์๋ ํญ๋ชฉ์ด ๋งค์ฐ ์ ํ์ ์ผ ๊ฒ์ ๋๋ค. ์จ์ดํ์ฐ์ค json API๋ ์ด์ ๋ฒ์ ์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ์๋ _๊ฐ์ฅ ์ต๊ทผ์_ ์ข ์์ฑ์ ๊ฒ์ํ๋ฉฐ, ์ด๋ ํด๋น ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋๋ค. json api๋ ํตํฉํด์ ์ฌ์ฉํ๋๋ฐ ๋นจ๋ผ์ ์ข์๋๋ฐ ์ธํ๋ผํ์์ ๋ฏฟ์ง ๋ง๋ผ๊ณ ํ๋๊ตฐ์. ์์ํ ๋ ์ ๋ขฐํ ์ ์๋ ์ถ์ฒ์ ์์กดํ๋ ๊ฒฝ์ฐ ํ๋ ฅ์ ์ด๋ผ๊ณ โโ๋ถ๋ฅด๋ ๊ฒ์ ๋ค์ ์ ์งํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ถ๊ทน์ ์ผ๋ก ๋ฌธ์ ๋ ํ์ฌ ํจํค์ง์ด ์๋ํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์ค์ ํ์ผ์ ์คํํ๋ ์ข ์์ฑ ๊ทธ๋ํ๋ฅผ ์ค์ ๋ก ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค. ์ฃผ์์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ด ์ปดํจํฐ์์ ํ์ธ๋๋ ์ข ์์ฑ ๊ทธ๋ํ๋ ๋์ผํ ํจํค์ง์ ๋ํด์๋ ์ปดํจํฐ์์ ํ์ธ๋๋ ๊ฒ๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
์์ ํ๋ค๋ฉฐ 'pip๊ฐ pipfile์ ์ฝ์ ์ ์์ผ๋ฉด pipenv๋ฅผ virtualenv ๊ด๋ฆฌ์๋ก ๋ง๋ค์ง ์์ต๋๊น?'๋ผ๊ณ ๋งํ๊ธฐ ์ฝ์ต๋๋ค. ์๋์. Pipenv๋ ์ข ์์ฑ ๊ด๋ฆฌ์์ ๋๋ค. ๋ฉฑ๋ฑ์ฑ ํ๊ฒฝ์ ๊ด๋ฆฌํ๊ณ ์ฌํ ๊ฐ๋ฅํ ์ ๊ธ ํ์ผ์ ์์ฑํฉ๋๋ค. ๋๋ ๋น์ ์ด ๊ทธ๊ฒ์ ํ๋ค๊ณ ์ด ๋๊ตฌ๋ฅผ virtualenv ๊ด๋ฆฌ์๋ก ์ถ์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋น์ ์๊ฒ ์ฌ์ํด ๋ณด์ผ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ ๊ธ ํ์ผ์ ํด๊ฒฐํ๊ณ ๊ทํ๊ฐ ๊ฐ์ง๊ณ ์์ง ์๊ฑฐ๋ ์ฌ์ฉํ์ง ์๋ Python ๋ฒ์ ์ ๋ํ ๋ง์ปค๋ฅผ ํฌํจํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ์ํ๋ก ์ ์งํ์ฌ ํ๋ซํผ ๋ฐ Python ๋ฒ์ ๊ฐ์ ์ ํํ๊ฒ ๋ฐฐํฌํ๊ณ ์ฌํํ ์ ์๋๋ก ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ก์ปฌ ํ ๊ณผ ํ์ผ, vcs ๋ฆฌํฌ์งํ ๋ฆฌ(๊ทธ๋ํ๋ ํด๊ฒฐ) ์๊ฒฉ ์ํฐํฉํธ, pypi ํจํค์ง, ๊ฐ์ธ ์ธ๋ฑ์ค ๋ฑ์ ์ฒ๋ฆฌํ๋ ๋ฑ ์ฌ๋ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
ํ๋ฃจ๊ฐ ๋๋๋ฉด pip _will_์ pipfiles๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๊ฒ์ด ๊ณํ์ ๋๋ค. ํ์์ด ์์ฑ๋ ์ดํ๋ก ๊ณํ์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ 'ํ์ง๋ง pip๊ฐ ์๊ตฌ ์ฌํญ ํ์ผ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ๋ ์ด๋ป์ต๋๊น?'๋ผ๋ ์ง๋ฌธ๊ณผ ๋์ผํฉ๋๋ค. ์ง๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํฉ๋๋ค. Pip์ ํด๋น ํ์์ ์ค์นํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ํ์ผ์ ์ค์นํ๋ค๋ ๊ฒ ์ธ์ ๋ด๊ฐ ์ค๋ช ํ ๊ธฐ๋ฅ๊ณผ ์ค์ ๋ก ๊ด๋ จ์ด ์์ต๋๋ค(๊ทธ๋ฐ๋ฐ pip๋ฅผ ์ฌ์ฉํ์ฌ).
@techalchemy
์จ์ดํ์ฐ์ค json api๋ ์ด์ ๋ฒ์ ์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ์ต๊ทผ์ ์ข ์์ฑ์ ๊ฒ์ํ๋ฉฐ, ์ด๋ ํด๋น ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋๋ค.
์ด๊ฒ์ ์๋ชป๋ ๊ฒ์
๋๋ค. https://pypi.org/pypi/{project}/{release}/json
๋ฅผ ํธ์ถํ์ฌ ํน์ ๋ฒ์ ์ข
์์ฑ์ ์ป์ ์ ์์ต๋๋ค. https://pypi.org/pypi/{project}/json
ํธ์ถํ๋ฉด ๋ง์ง๋ง ์ข
์์ฑ๋ง ์ป์ ์ ์์ง๋ง ์ค์ ๋ก๋ ์ฌ๋ฐ๋ฅธ ์ข
์์ฑ ์ธํธ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ด์ฌ ํ๋ก์ ํธ์ ํจํค์ง/ํผ๋ธ๋ฆฌ์ฑ ๋ถ๋ถ์ ์ ๋ง๋ก ๊ฐ์ ๋์ด์ผ ํฉ๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ด JSON API๋ฅผ ์์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ๋ชจ๋์๊ฒ ์ด์ต์ด ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฉฑ๋ฑ์ฑ ํ๊ฒฝ์ ๊ด๋ฆฌํ๊ณ ์ฌํ ๊ฐ๋ฅํ ์ ๊ธ ํ์ผ์ ์์ฑํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ ๊ธ ํ์ผ์ ํด๊ฒฐํ๊ณ ๊ทํ๊ฐ ๊ฐ์ง๊ณ ์์ง ์๊ฑฐ๋ ์ฌ์ฉํ์ง ์๋ Python ๋ฒ์ ์ ๋ํ ๋ง์ปค๋ฅผ ํฌํจํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ์ํ๋ก ์ ์งํ์ฌ ํ๋ซํผ ๋ฐ Python ๋ฒ์ ๊ฐ์ ์ ํํ๊ฒ ๋ฐฐํฌํ๊ณ ์ฌํํ ์ ์๋๋ก ํฉ๋๋ค.
poetry
๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๊ทธ๋ฆฌ๊ณ pipenv
(pip-tools ์ฌ์ฉ)์ ๋์ผํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋๋ก JSON API๋ฅผ ์ฌ์ฉํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค. https://github.com/sdispater/poetry/issues/37#issuecomment -379071989๋ฅผ ์ฐธ์กฐ pipenv
๋ณด๋ค ๋ ํ๋ ฅ์ ์ผ ๊ฒ์
๋๋ค(https://github.com/sdispater/poetry#dependency-resolution )
@zface ๋ง์ง๋ง์ผ๋ก ์ด ๋ง์ ํ๊ฒ ์ต๋๋ค. ๊ณ์ธต ๊ตฌ์กฐ์์ ๋ ๋์ ๊ณณ์ผ๋ก ๊ฐ์ ธ๊ฐ์ญ์์ค. Pipenv๋ ๊ณต์์ ์ผ๋ก ๊ถ์ฅ๋๋ Python ํจํค์ง ๋๊ตฌ๋ผ๊ณ ์์นญํ์ง ์์ต๋๋ค. ์ด๊ธฐ ๋๋ฌธ ์ด๋ผ๊ณ ํฉ๋๋ค. ๋ถ์ ์ ํ๋ค๊ณ ์๊ฐ๋๋ฉด Pipenv๋ฅผ ์ถ์ฒํ๋ ๋ด๋น์์๊ฒ ์๋ ค์ฃผ์ญ์์ค . Pipenv dev์ ์ด๋ฌํ ๊ฒ๋ค์ ๋ฃ์ง ๋ง์ญ์์ค. ์ด๊ฒ์ ๋ถ๋ง์ ์ ๊ธฐํ ์ ์๋ ์๋ชป๋ ์ฅ์์ด๋ฉฐ, ์ฌ๊ธฐ์์ ๋ถ๋ง์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ป์ ์ ์์ต๋๋ค. ๊ธฐ์ ์ ์ธ ์ง๋ฌธ์ ๋ํ ๋ ๋์ ๋ต๋ณ์ ์ป์ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ Python ํจํค์ง ๋๊ตฌ ๋ฐ Python ํจํค์ง์ด ์ํ๋๋ ๋ฐฉ์์ ๋ํ ํ ๋ก ๊ฒ์ํ์ด ์๋๋ผ Pipenv์ ๋ฌธ์ ์ถ์ ๊ธฐ์ ๋๋ค.
Pipenv๋ ํด๊ฒฐ์ ์ํด pip-tools์๋ง ์์กดํ์ง ์์ต๋๋ค. ์ดํด ๋ถ์กฑ์ ๋ณด์ฌ์ฃผ๋ ํ๋์ ๋ผ์ด๋๋ก ์ํํธ์จ์ด๋ฅผ ์ค์ด๋ ๊ฒ์ ์ค๋จํ์ญ์์ค. ๋๋ PyPI API๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์ฃผ ์ ์๊ณ ๊ทธ๊ฒ์ ๊ตฌํํ ํ๊ณผ ์ง์ ์ด์ผ๊ธฐํ์ต๋๋ค.
์ด๊ฒ์ ๋จ์ง ๋ช ๋ฐฑํ ์๋ชป,
์ด๋ฐ ์ข ๋ฅ์ ํ๋๋ ์ฌ๊ธฐ์์ ํ์๋ฐ์ง ๋ชปํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋งํ๋ ๋ด์ฉ์ ์ดํดํ์ง ๋ชปํ๋ค๊ณ ๊ฐ์ ํ์ง ๋ง์ญ์์ค. ์์๋ฅผ ์ง์ผ์ฃผ์ธ์.
์ฌ์ ํ pipenv(https://github.com/sdispater/poetry#dependency-resolution)๋ณด๋ค ํ๋ ฅ์ ์ ๋๋ค.
Pipenv๋ ํ์ฌ ์ข ์์ฑ ๊ทธ๋ํ๋ฅผ ํ๋ฉดํํ์ง ์์ต๋๋ค. ๋๋ฌด๊ฐ ํํํด์ง ํ ๊ฐ์ง ํน์ ๋ฌธ์ ๋ฅผ ์ง์ ํ๊ณ ์ ์ฒด ๋๊ตฌ๊ฐ ๋ ์ข๊ณ ๋ ํ๋ ฅ์ ์ด๋ผ๊ณ โโ์ฃผ์ฅํ๋ ๊ฒ์ ์ด๋ฆฌ์์ ์ผ์ ๋๋ค. ๋น์ ์ ๋จ์ํ pipenv๋ฅผ ๋ชจ์ํ๊ณ ์๋ฅผ ํ๋ณดํ๊ธฐ ์ํด ์ฌ๊ธฐ ์๋ค๋ ๊ฒ์ ๋ฐ๋ณตํด์ ์ฆ๋ช ํ๊ณ ์์ต๋๋ค. ์ด ํ๋์ ํ์ํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ ํ ๋ก ์ด pipenv ์ฃผ์์ "์ข์ ๊ดํ"์ ๋๋ฌธ์๋ก ์ฐ๋ ค๊ณ ํ๋ ์ฃผ์ ์์ ๋ฒ์ด๋ฌ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
ํ์ง๋ง,
[...] ์ฌ์ ํ requirements.txt ๋ setup.py์์ ์ด์ ๊ณผ ๊ฐ์ ์ค์๋ฅผ ๋ฒํ ๊ฒ์ ๋๋ค. ๊ทธ ๋๋ฌธ์ ํ๋ก์ ํธ๋ setup.py์ ์๋ชป ์ ์๋ ์ข ์์ฑ๊ณผ ํจ๊ป ์ฌ์ ํ ์๋ชป ํจํค์ง๋ฉ๋๋ค.
์ ๋ ์ด ์๊ฒฌ์ ๊ณต์ ํฉ๋๋ค. ์๋ก์ด ๊ฐ๋ฐ์๊ฐ ์์ ์ Python ์ฝ๋๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ํจํค์งํ๋ ๊ฒ์ ์ค์ ๋ก ๋ณต์กํ๊ณ ๋๋ฌด ๋ณต์กํ๋ฉฐ ๋ง์ ์จ๋ผ์ธ ๋ฌธ์๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฅผ ์์ ํ ์ฒ๋ฆฌํ๋ ๊ฒ์ pipenv ๋๋ ๊ธฐํ ํจํค์ง ์ข
์์ฑ์ ๋ฌ๋ ค ์์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ญ์ฌ๋ฅผ ๋ค์ ์ธ ์ ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ๋ก์ ์ฐ๋ฆฌ๋ ํ์ด์ฌ ๋๊ตฌ ์ฒด์ธ์ ๋จ๊ณ์ ์ผ๋ก ํ๋ํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ pipenv(๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์)๋ ์์ฃผ ์ข์ ์ง์ ์ ๋๋ค.
ํ์ชฝ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํด Pipfile
๋ฅผ ์ ์งํ๊ณ ๋ค๋ฅธ ์ชฝ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํด setup.py
๋ฅผ ์ ์งํด์ผ ํ๋ ๊ฒ์ ์ฌ์ด ์ผ์ด ์๋๋๋ค. ๋ง์ ๋จ์ด์ ๊ธด ๊ธฐ์ฌ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก ๊ฐ์ด๋๋ก ์๋ฌด๋ฆฌ ์ด๋ ต๊ฒ ์ค๋ช
ํ๋๋ผ๋ ๋ด์ฉ์ด ๋๋ฌด ๋ณต์กํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ํ์ฌ์ ๊ฐ๋ค๋ ๊ฒ์ ์ ์ ์ผ๋ก ๋์ํ์ง๋ง, ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋ ์ข๊ณ ์์ ํ ๋ฐฉ๋ฒ์ ์์ํ๋ ๊ฒ์ ๋ฐฉํดํด์๋ ์๋ฉ๋๋ค.
๊ฒฐ๊ตญ, ์ ๋ ๊ฐ๋ฐ์๋ก์ ์ ๋ฅผ ๋๊ณ ์ ์ถ์ ์ต๋ํ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ ๋จ์ผ ๋๊ตฌ, ์๋ง๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ชจ๋๋ฅผ ์ํฉ๋๋ค.
ํ์ง ๋ง ์ผ๋ถ๋ฅผ ์ถ์ถํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ทธ๋ค์ ์์ด์ผ requirements.txt/Pipfile
ํ๋ Pipfile ์ธ์ ๋ํผ arround๋ฅผ '์ฝ๊ฒ setup.py'์ ์ผ์ข
์ผ๋ก ์ ์ํ๋ ๋ฑ์ PBR ๋ฑ์ libs์์์ install_requires
,ํ์ง๋ฅผ pbr์ด ๊ฐ์ ธ์ค๋ ๋ชจ๋ ์์น ์๋ ๋์๊ณผ ์ด๋ฅผ ์ํํ๋ ์ ์ฉ setuptools ๋ํผ์์ ํจํค์งํฉ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ฐ๊ฐ์ ์ธ์์์ ๋ ๋์ ๊ฒ์ ๊ฐ์ง ์ ์์ ๊ฒ์ ๋๋ค.
Pipfile
๋ฅผ ์ ์งํ๊ธฐ ์ํ pipenv(๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์
๋ชจ๋์์ ๋ฒ์ ๊ด๋ฆฌ๋จ)Pipfile.lock
๋ฅผ ์ ์งํ๊ธฐ ์ํ pipenv(์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด์๋ง ๋ฒ์ ์ด ์ง์ ๋จ)Pipfile
์ install_requires
์ ์ฃผ์
ํ๋ ์์
์ธ ์ฒซ ๋ฒ์งธ ์์ค ์ข
์์ฑ์ด ๋๋ ์ด ๋ง๋ฒ ๋ํผ ํจํค์ง( pipfile_setuptools
, install_requires_pipfile
?)๋ฅผ ์ฌ์ฉํฉ๋๋ค.์ด๊ฒ์ pipenv
์ ๊ด๋ จ์ด ์์ง๋ง ์ฌ์ ํ ์ผ๋ฐ Pipfile
ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ ๋ ๋ค๋ฅธ ํ๋ก์ ํธ์
๋๋ค. ์ด๋ป๊ฒ ์๊ฐํ๋์?
@gsemet ๋ด ์ดํด์์ PyPA๋ ๋์ flit์ด ์ด๋๋ pyproject.toml๋ก ์ฑ์ฐ๋ ค๊ณ ํ์ต๋๋ค. Pipfile์ ์์ค ํ์์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ ์ ์ด์ ๋ํด ๋จผ์ (pypa-dev ๋๋ distutils-sig์์) ์ด์ผ๊ธฐํด์ผ ํฉ๋๋ค. Pipfile(๋ฐ ์ ๊ธ ํ์ผ)์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒฝ์ฐ pypa/pipfile (Pipenv ๊ณต๊ธ์ ์ฒด์์ ํต์ฌ ๊ตฌ๋ฌธ ๋ถ์ ๋ ผ๋ฆฌ๋ฅผ ์ ๊ณตํจ)์์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
ํธ์ง: ๋ฉ์ผ๋ง ๋ฆฌ์คํธ ์ค ํ๋์์ ์ด์ ๋ํ ํ ๋ก ์ ์์ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด ์ ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด์ฃผ์ญ์์ค. Python ํจํค์ง ๋ฐฐํฌ์ ๋ ๋ถ๋ถ์ ํจ๊ป ๊ฐ์ ธ์ฌ ์ ์๋ ๋ช ๊ฐ์ง ์์ด๋์ด๊ฐ ์์ต๋๋ค.
PyPa๋ Pipfile
๋ ์ง์ํ์ง๋ง pyproject.toml
(PBR์์ setup.cfg
์ญํ ์ ์ํํจ)์ ์ ์ธ๋ ์ข
์์ฑ์ ๋ณด๋ ๊ฒ์ด ์กฐ๊ธ ์ฌํ๋ค๋ ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค.
flit ๋ฐ pipfile์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ฐ๋ฒผ์ ๋ณด์ด๋ Kennethreitz ์
PBR์ setup.cfg๋ ๊ณต์ ๋ฌธ์(์: data_files
)์ ๋นํด ๋ ์๋ฒฝํด ๋ณด์ด๋ฉฐ ์ด๋ฏธ ์ฌ๋ฌ ๋๊ตฌ(flake8, pytest, ...)์ ๊ณต์ ๋ ํ์ผ์ ์ฌ์ฌ์ฉํ๋ฉด ๋์ผํ ํ์ผ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๊ฐ์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ํ์ด์ฌ ํ๋ก์ ํธ์ ๋ฃจํธ์ ์๋ ํ์ผ)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@Moritz90 Python์ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ ์ค ์ผ๋ถ๋ ์ด ํ ๋ก ์ ๊ฐ์ตํ๊ธฐ์ ์ข์ ์ฅ์์ ๋๋ค.
pypa-dev ๋ Python ํจํค์ง ๋ฐ ์ด๋ฅผ ๋๋ฌ์ผ ์ํ๊ณ๋ฅผ ์ค์ฌ์ผ๋ก ๋ ผ์ํ๋ ๋ฐ ๊ฐ์ฅ ํ์คํฉ๋๋ค. ๋น์ทํ ํ ๋ก ์ ๊ฒ์ํ๋ ค๋ฉด ์ฌ๊ธฐ์์ ์์ํ ๊ฒ์ ๋๋ค.
python-ideas ๋ ์์ด๋์ด๋ฅผ ๋ ผ์ํ ์ ์๋ ์ฅ์์ด๋ฉฐ ์ ์ฒด Python ์ปค๋ฎค๋ํฐ์ ๋ํ ๊ฐ์์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค. ์ด๊ฒ์ PEP ์์ค์ผ๋ก ๋ฐ์ด๋ถ์ด๊ณ ์ถ๋ค๋ฉด ์ข์ ์ถ๋ฐ์ ์ด ๋ ๊ฒ์ ๋๋ค.