Pipenv: ์ œ์•ˆ: ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ `pipenv` ํŒจํ„ด ๋ฐ ์•ˆํ‹ฐํŒจํ„ด

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

maya ํ•ดํ‚น ๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ตํ›ˆ์„ ์–ป์—ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ pipenv ์˜ ๊ถŒ์žฅ ์‚ฌ์šฉ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ œ์•ˆ์„ ๊ฒ€ํ† ํ•˜๊ณ  ํ•ฉ์˜์— ๋„๋‹ฌํ•˜๋ฉด (์—…๋ฐ์ดํŠธ๋œ) ํ…์ŠคํŠธ๊ฐ€ pipenv ๋ฌธ์„œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pipenv ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ํŒจํ„ด ๋ฐ ์•ˆํ‹ฐํŒจํ„ด

ํŽธ์ง‘ํ•˜๋‹ค
๋‹ค์Œ์€ ๋‹ค๋ฅธ ํŒŒ์ด์ฌ ๋ฒ„์ „๊ณผ OS์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ผ๋ฐ˜(๋Œ€๋ถ€๋ถ„ ์˜คํ”ˆ ์†Œ์Šค) ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์—„๊ฒฉํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์–ด์จŒ๋“  ๋ชจ๋“  ๋ฌธ์ œ ์„น์…˜์„ ๊ฒ€ํ† ํ•ด์•ผ ํ•จ).

ํŽธ์ง‘ ๋

TL;DR : pipenv ํŒŒ์ผ์„ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•˜๋ฉด ์ถ”๊ฐ€ ๋ณต์žก์„ฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณด์•ˆ์— ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ผ๋ถ€ ์˜ค๋ฅ˜๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ Pipfile , Pipfile.lock ๋ฐ .env ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ์Šค ์ œ์–ด์—์„œ ์ œ์™ธํ•˜์‹ญ์‹œ์˜ค.

.gitignore ์žˆ๋Š” ํŒŒ์ผ์— ๊ด€๊ณ„์—†์ด pipenv ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ ์„

Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž€ ์ผ๋ฐ˜์ ์œผ๋กœ 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 ์ดˆ๋ž˜ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ์„ ๋ฐ˜์˜ํ•˜๋Š” (๊ฐ€์ƒ) python ํ™˜๊ฒฝ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ฃผ์–ด์ง„ ํ™˜๊ฒฝ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ณ  ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • ํ…Œ์ŠคํŠธ๋œ "๊ณจ๋“ " Pipfile.lock ์„ ์Šน์ธ๋œ Python ํ™˜๊ฒฝ์˜ ์ •์˜๋กœ ๋ฆด๋ฆฌ์Šคํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ pipenv sync ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "ํ™ฉ๊ธˆ" Pipfile.lock ์„ ์ ์šฉํ•˜์—ฌ ๋™์ผํ•œ ํŒŒ์ด์ฌ ํ™˜๊ฒฝ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ์„ ์ •์˜ํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฏ€๋กœ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ณด์•ˆ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ทœ์น™์„ ์–ด๊ธฐ๋ฉด(๋”ฐ๋ผ์„œ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ์„ ์„ ์–ธํ•˜๋ ค๊ณ  ํ•จ) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๋ฒ„์ „์˜ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ
  • ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ์€ python ๋ฒ„์ „, OS ๋˜๋Š” ๊ธฐํƒ€ ํ™˜๊ฒฝ ๋งˆ์ปค์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์›๋ž˜ ์ถ”์ƒ ์ข…์†์„ฑ์— ์ •์˜๋œ ์ผ๋ถ€ ๊ทœ์น™์„ ์‰ฝ๊ฒŒ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ: ๊นจ์ง„ setup.py ์ •์˜๋œ ์ข…์†์„ฑ ์ˆจ๊ธฐ๊ธฐ

setup.py ๋Š” install_requires ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์ถ”์ƒ ์ข…์†์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Pipfile ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ์„ ์ •์˜ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • install_requires ์ข…์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • Pipfile ๋Š” ์ข…์†์„ฑ์— ๋Œ€ํ•œ ํŠน์ • ๊ทœ์น™(๋ฒ„์ „ ๋ฒ”์œ„ ๋“ฑ)์„ ์ •์˜ํ•˜์ง€๋งŒ install_requires ๋Š” ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๊ทœ์น™์„ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜ ์ข…์†์„ฑ์€ Pipfile ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • [packages] ์„น์…˜ Pipfile ๋  ์ค‘ ํ•˜๋‚˜๋ฅผ ๋น„์šฐ๊ฑฐ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์— ๋‹จ ํ•˜๋‚˜์˜ ์ข…์†์„ฑ์„ ์ •์˜ํ•ด์•ผํ•œ๋‹ค.

๋ฌธ์ œ: ์ €์žฅ์†Œ์˜ Pipfile.lock

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ €์žฅ์†Œ์— Pipfile.lock (์ผ๋ฐ˜์ ์œผ๋กœ "๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ")๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์„ค๋ช…๋œ ์ข…์†์„ฑ์€ ๋‹ค๋ฅธ Python ๋ฒ„์ „ ๋˜๋Š” ๋‹ค๋ฅธ OS์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” ์ผ๋ถ€ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€/์ œ๊ฑฐํ•  ๋•Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ €์žฅ์†Œ์—์„œ 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๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ €์žฅ์†Œ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๊นŒ? A: ์•„๋‹ˆ์š”.

๋ช‡ ๊ฐ€์ง€ ๋” ์ž์„ธํ•œ ์ •๋ณด์™€ ํŠธ๋ฆญ์ด ๋’ค๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

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 ์ข…์†์„ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

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

Discussion Type

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

@Moritz90 Python์˜ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ์ค‘ ์ผ๋ถ€๋Š” ์ด ํ† ๋ก ์„ ๊ฐœ์ตœํ•˜๊ธฐ์— ์ข‹์€ ์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

pypa-dev ๋Š” Python ํŒจํ‚ค์ง• ๋ฐ ์ด๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ์ƒํƒœ๊ณ„๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋…ผ์˜ํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ํ† ๋ก ์„ ๊ฒŒ์‹œํ•˜๋ ค๋ฉด ์—ฌ๊ธฐ์—์„œ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

python-ideas ๋Š” ์•„์ด๋””์–ด๋ฅผ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์†Œ์ด๋ฉฐ ์ „์ฒด Python ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ PEP ์ˆ˜์ค€์œผ๋กœ ๋ฐ€์–ด๋ถ™์ด๊ณ  ์‹ถ๋‹ค๋ฉด ์ข‹์€ ์ถœ๋ฐœ์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ๋งค์šฐ ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ๋ฆฌ๋ทฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

/cc @uranusjr @jtratner @ncoghlan

maya ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ๋ถ€ ์ฐธ์กฐ:

  • kennethreitz/maya#138(RemovePipfile.lock์„ ์ €์žฅ์†Œ์—์„œ)
  • kennethreitz/maya#139(tox.ini์—์„œ pipenv ์‹คํ–‰ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ...)
  • kennethreitz/maya#145(setup.py์—์„œ pendulum>=1.0 ์ˆ˜์ •: ๋ฒ„์ „์ด Pipfile์— ์žˆ์—ˆ์ง€๋งŒ setup.py์—์„œ ๋ˆ„๋ฝ๋จ)
  • kennethreitz/maya#143( pipenv ๋ฌธ์ œ๊ฐ€ ์ „์ฒด Travis ์‹คํ–‰์„ ์ค‘๋‹จ์‹œํ‚จ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” PR)
  • kennethreitz/maya#144(์ค€๊ณต์‹ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋”ฐ๋ฅธ PR ๋ฆฌํŒฉํ„ฐ pipenv ์‚ฌ์šฉ)

๋‚˜๋„ ์ด๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. Pipenv์˜ ๋ฌธ์„œ๋‚˜ Python Packaging User Guide ์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์กฐ์–ธ์˜ ๊ฒฐ๊ณผ๋Š” "๊ฒฐ์ •๋ก ์ /์žฌํ˜„ ๊ฐ€๋Šฅํ•œ CI ๋นŒ๋“œ๋ฅผ ํฌ๊ธฐ"ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ, ์ด๋Š” ์ €์—๊ฒŒ ๋งค์šฐ ํฐ ๋ฐ˜ํŒจํ„ด์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๊ฒฐ์ •๋ก ์„ ํ—ˆ์šฉํ•  ๋Œ€์•ˆ์œผ๋กœ ๋ฌด์—‡์„ ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@tsiq-oliverc ๊ฒฐ์ •์  ๋นŒ๋“œ๋Š” ํ˜„์žฌ ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฐ์ •๋ก ์  ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๋‹ค์Œ ์‹œ๋„๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

  • ๋นŒ๋“œ๋Š” Pipfile.lock ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(๊ฐ ํŒŒ์ด์ฌ ๋ฐ OS ๋ณ€ํ˜•์˜ ์กฐํ•ฉ)๋Š” Pipfile ์ •์˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”์ƒ ์ข…์†์„ฑ์œผ๋กœ ์ธํ•ด ์„œ๋กœ ๋‹ค๋ฅธ Pipfile.lock ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ €์žฅ์†Œ๋Š” ์ €์žฅ์†Œ์— ์ •์˜๋œ ๋ณ„๋„์˜ Pipfile.lock ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CI ๋นŒ๋“œ ์ค‘์— Pipfile.lock ์ž๋™์œผ๋กœ ๋นŒ๋“œํ•˜๋ฉด ๊ฒฐ์ •์„ฑ์ด ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งŽ์€ ์ถ”๊ฐ€ ๋…ธ๋ ฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ์–ป๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์— ์„ค์น˜๋  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฉฐ(์˜ˆ: 1์ฃผ์ผ ํ›„์— ํ‘œ์ค€ ์„ค์น˜๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œ๋œ ์ข…์†์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค) ์‚ฌ์‹ค์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ์–ป์ง€ ๋ชปํ•˜๋Š” Pipfile.lock ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถฉ๋Œ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‚ด๋ถ€์— ์—„๊ฒฉํ•œ ์ข…์†์„ฑ์„ ์ •์˜ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฐ์ •๋ก ์  ๋นŒ๋“œ๋ฅผ ์–ป๋Š” ๋˜ ๋‹ค๋ฅธ ๋Œ€์•ˆ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.

@vlcinsky - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์†Œ๋น„์ž๊ฐ€ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ์ข…์†์„ฑ ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ์ž๊ฐ€ ์ด๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

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

  1. CI๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๋ฉด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋„คํŠธ์›Œํฌ ๋ฌธ์ œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ !).
  2. Docker/etc๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋”๋ผ๋„ CI์—์„œ ๊ด€์ฐฐํ•œ ๋™์ž‘์„ ๋กœ์ปฌ์—์„œ ๋‹ค์‹œ ์ƒ์„ฑ(๋”ฐ๋ผ์„œ ๋””๋ฒ„๊ทธ)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฅ์†Œ ์ƒ์—์„œ.
  3. ์†Œ๋น„์ž์—๊ฒŒ "๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ข…์†์„ฑ ๋ฒ„์ „ X, Y, Z์—์„œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ์ž์‹  ์žˆ๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์„ธ ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ถฉ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด ํ’ˆ์งˆ ๊ด€๋ฆฌ์— ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์†Œ๋น„์ž์—๊ฒŒ 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 ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ๊ฒฐ์ •์  ๋‹จ๊ณ„. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ Pipfile.lock ๋ฅผ ํ™œ์šฉํ•˜๋ฏ€๋กœ ์™„์ „ํžˆ ์žฌํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  2. ๋น„๊ฒฐ์ •์  ๋‹จ๊ณ„. pipenv update ๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ์ข…์†์„ฑ์˜ ์ตœ์‹  ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ์ž ๊ธˆ ํŒŒ์ผ์ด ์—†๋Š” ๋™์ž‘๊ณผ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?).

@tsiq-oliverc ๊ฒฐ์ •์  ๋นŒ๋“œ๋ฅผ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ ์„ค์ •์„ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • pypi ์บ์‹œ ์ž‘์—… ๋นŒ๋“œ: ์˜›๋‚ ์— ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜์—ฌ pypi ์ธ๋ฑ์Šค ์บ์‹œ ํ˜•์‹(ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ…Œ์ŠคํŠธ ์ž‘์—…: pypi ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ pipenv

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

pypi ์บ์‹œ ์ž‘์—… ๋นŒ๋“œ

$ 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 (๊ฐœ๋ฐœ์ž๊ฐ€ ํ™˜๊ฒฝ์„ ์‰ฝ๊ฒŒ ์žฌํ˜„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Œ)
  • ๋ฏธ๋ฆฌ ์ฑ„์›Œ์ง„ ๋กœ์ปฌ pypi ์บ์‹œ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ…Œ์ŠคํŠธ ์ž‘์—…

๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋กœ์ปฌ pypi ์บ์‹œ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ tox , pip ๋“ฑ์„ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๋„๋ก ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • CI ํ…Œ์ŠคํŠธ ์‹คํ–‰( pipenv )

์šฐ๋ฆฌ๊ฐ€ ์–ป๋Š” ๊ฒƒ

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฒฐ์ •์  ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ์„ ํฌํ•จํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค. ์ž์ฒด์ ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • Pipfile.lock ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ pypi ํŒจํ‚ค์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์—์„œ ํ™˜๊ฒฝ์„ ์žฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • (์™ธ๋ถ€์ผ ์ˆ˜๋„ ์žˆ๋Š”) pypi์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ๋œ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ ์‘์€ ๊ฐ„๋‹จํ•˜๊ณ ("pypi ์บ์‹œ ์ž‘์—… ๋นŒ๋“œ ๋‹ค์‹œ ์‹คํ–‰)" ์ œ์–ด๋œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค(pypi์˜ ๋‚ด์šฉ์€ ํ•ด์‹œ๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ธฐ๋ก๋จ)

๋˜ ๋‹ค๋ฅธ ์žฅ์ ์€ ์ด ์„ค์ •์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ Pipfile ๋˜๋Š” Pipfile.lock ์œ ์ง€ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ๋™์ผํ•ฉ๋‹ˆ๋‹ค( Pipfile.lock ๋Š” ํ•ญ์ƒ ์ฃผ์–ด์ง„ ์ปจํ…์ŠคํŠธ์—์„œ ๋‹ค์‹œ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค).

์•„์ง ๋ถ€์กฑํ•œ ๊ฒƒ(๊ทธ๋ฆฌ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ)

pypi ์บ์‹œ๋Š” ์•ฝ๊ฐ„์˜ ์—ฐ๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ถฉ๋ถ„ํ•˜๊ณ  pipenv ๊ฐ€ ์ด๋ฏธ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ #1731์ด ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข…์†์„ฑ ํ•ด๊ฒฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํŒจํ‚ค์ง€๋กœ์„œ ์šฐ๋ฆฌ์˜ ๋งŽ์€ ํ…Œ์ŠคํŠธ๋Š” ๊ฒฐ์ •์  ๋นŒ๋“œ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์•Œ๋ ค์ง„ ๋‚ด์šฉ์„ ์ทจํ•˜๊ณ  ํ•ด๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด pytest-pypi ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ํ™œ๋ฐœํ•œ ํ† ๋ก ์„ ์ข‹์•„ํ•˜์‹ญ์‹œ์˜ค. ๋‰˜์•™์Šค๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ํ•ญ์ƒ ์•Œ๋ ค์ง„ ์ข…์†์„ฑ๊ณผ ๊ณ ์ •๋˜์ง€ ์•Š์€ ์ข…์†์„ฑ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ์ƒ ์•Œ๋ ค์ง„ ์ข…์†์„ฑ๊ณผ ๊ณ ์ •๋˜์ง€ ์•Š์€ ์ข…์†์„ฑ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ์ œ์•ˆ์„ ๋‘ ๋ฒˆ์งธ๋กœ ํ•œ๋‹ค. ์žฌ์ƒ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋ช…์‹œ์ ์ธ "์•Œ๋ ค์ง„ ์–‘ํ˜ธํ•œ ์ƒํƒœ"๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๊ฐ€ ์ƒˆ๋กœ์šด ๋ถ€/๋ฒ„๊ทธ ์ˆ˜์ • ๋ฒ„์ „๋„ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ค‘๋‹จ๋˜๋Š” ๊ฒฝ์šฐ ๋””๋ฒ„๊น…์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

@Moritz90 @techalchemy @uranusjr @tsiq-oliverc

๋‹ค์Œ์€ ์ด์ „ ํ† ๋ก ์˜ ์š”์•ฝ์ž…๋‹ˆ๋‹ค.

ํŠน์ • ๋ฌธ์ œ ๋ฐ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜

๋งŽ์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ - ๋ˆ„๊ฐ€ Pipfile.lock ํŒŒ์ผ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ง€์›๋˜๋Š” ๊ฐ OS ๋ฐ Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๊ฐ€๋Šฅํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋งคํŠธ๋ฆญ์Šค์— ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Flask๋Š” ๋‹ค์Œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(์ตœ์†Œํ•œ ์ €์žฅ์†Œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” CI ํ•ญ๋ชฉ).

  • OS Windows(python 2.7 ๋ฐ Python 3.6)
  • Linux(ํŒŒ์ด์ฌ 2.7, 3.4, 3.5, 3.6, ์•ผ๊ฐ„, pypi)
  • OSX(py - ๋” ๋งŽ์€ ๋ฒ„์ „์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ)

๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” 9๊ฐœ์˜ ๋‹ค๋ฅธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ฐ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ Pipfile.lock ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ฐ€ ๊ทธ๋“ค์„ ์œ ์ง€ํ•  ๊ฒƒ์ธ๊ฐ€?

์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ—ˆ์šฉ(NO WAY)
  • ๋ฉ”์ธ ๊ฐœ๋ฐœ ํ”Œ๋žซํผ์„ ์œ„ํ•ด ๋‹จ ํ•˜๋‚˜์˜ Pipfile.lock ์œ ์ง€(์–ด๋–ค ํ”Œ๋žซํผ์ด ๋ฌด์‹œ๋˜๊ธฐ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๊นŒ?)
  • CI๋ฅผ ํ†ตํ•œ ์ž๋™ ์ƒ์„ฑ(์˜ˆ)

์ œ์•ˆ: CI๊ฐ€ pipenv install -e . ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ์†Œ์— ํฌํ•จํ•˜์ง€ ๋ง๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž๋™ํ™”๋œ ๋นŒ๋“œ์˜ ๊ฒฐ๊ณผ๋กœ ์ ์ ˆํ•œ Pipfile.lock ๋ฅผ ์„ ํƒํ•˜๋„๋ก ๋„์™€์ฃผ์„ธ์š”.

๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

pypi์— ๋Œ€ํ•œ ์ข…์†์„ฑ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ๊ฐœ๋ฐœ์ž๋Š” ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ์—์„œ ํ™˜๊ฒฝ์„ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์ˆ˜๋‹จ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ:

  • ๋งŽ์€ ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ pypi ์ข…์†์„ฑ ๋ณ€๊ฒฝ์ด ๋„ˆ๋ฌด ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ž์ฒด์ ์œผ๋กœ ํ™˜๊ฒฝ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” pipenv install -e . ๋‹ค์Œ์— pipenv lock Pipfile.lock ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ์—์„œ ํ™˜๊ฒฝ์„ ๋ณต์ œํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ์—์„œ Pipfile.lock ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ํ•  ์ผ: Pipfile.lock ์— tox.ini Pipfile.lock ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

CI๋Š” ๊นจ์ง„ setup.py ๋ฐํ˜€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

setup.py ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ( install_requires ์ข…์†์„ฑ ๋ˆ„๋ฝ, ๋ฒ„์ „ ์ง€์ •์ž ๋ˆ„๋ฝ ๋“ฑ) CI ํ…Œ์ŠคํŠธ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ž์ฒด์ ์œผ๋กœ ์ƒ๋žต๋œ ์ข…์†์„ฑ์„ ์‚ฌ์ „ ์„ค์น˜ํ•˜์—ฌ).

์ œ์•ˆ:

  • pipenv install -e . ๋ฅผ ์‹ ๋ขฐํ•˜์—ฌ ์ผ๋ฐ˜ ์„ค์น˜์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ).
  • ์ผ๋ฐ˜ ์„ค์น˜ ํ…Œ์ŠคํŠธ( pipenv ์ œ์™ธ)๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ pip freeze ์ถœ๋ ฅ์ด pipenv ์˜ํ•ด ์„ค์น˜๋œ ํ•ญ๋ชฉ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ž„์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๋œ pypi ์ข…์†์„ฑ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ CI๋Š” ์ด๋Ÿฌํ•œ ์ถ”์ ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ์ข…์†์„ฑ ์—…๋ฐ์ดํŠธ๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ค‘๋‹จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CI๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์‹คํŒจ๋ฅผ ๊ฐ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ:

  • ๊ณ ์ • ํ•ด์ œ๋œ ๋ฒ„์ „์— ๋Œ€ํ•ด ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • CI๊ฐ€ ํ•ญ์ƒ ์ƒˆ๋กœ์šด Pipfile.lock ์ƒ์„ฑํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์–ด์จŒ๋“  ๊ณ ์ • ํ•ด์ œ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—)

๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜•์— ๋Œ€ํ•œ CI ๋ชจ๋“œ

์ œ์•ˆ๋œ ๋ชจ๋“  ๋ชจ๋“œ์—์„œ 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 ๋‹ค๋žŒ์ฅ ์œ ํ˜•์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋งบ์Œ๋ง

๋ณด์‹œ๋‹ค์‹œํ”ผ, ๊ฒฐ์ •๋ก ๊ณผ ๋ณต์žก์„ฑ์€ ๋ชจ๋“œ๋ณ„๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ œ์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค("์‹คํ–‰, ํฌ๋ ˆ์ŠคํŠธ, ์‹คํ–‰"). ํšจ์œจ์„ฑ๊ณผ ์†๋„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ข…์†์„ฑ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์ƒํ™ฉ์ด ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๋ฉด "์ƒ์„ฑ ๋ฐ ๋ด‰์ธ"์œผ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค. ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ๋ฐ˜๋ณต์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒํ™ฉ์ด ์ •๋ง ์•ˆ ์ข‹์€ ๊ฒฝ์šฐ "Ice Age" ๋ชจ๋“œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค. (์ผ์‹œ์ ) ๊ฒฐ์ •์„ฑ์„ ์–ป์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ด์ต์—๋Š” ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์˜ ๋ชฉํ‘œ๊ฐ€ ๋ฌธ์„œ์˜ ์กฐ์–ธ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์†”์งํžˆ "์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋ฒ” ์‚ฌ๋ก€(์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ)๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค"์™€ ๊ทน์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ง์„ ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์ฑ…์ž„ํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

@vlcinsky "๋ชจ๋“œ: ์ƒ์„ฑ ๋ฐ ๋ด‰์ธ"์ด๋ผ๋Š” ์ œ๋ชฉ ์•„๋ž˜์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ฑ๊ณตํ•œ Pipfile.lock ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด Jenkins ์•„ํ‹ฐํŒฉํŠธ๋กœ ์„ ์–ธํ•˜์—ฌ ํ•ญ์ƒ ์ฃผ์œ„์— ๋ณด๊ด€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ํ•ด๋‹น ์„ค์ •์„ ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. @tsiq-oliverc์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฒซ ๋ฒˆ์งธ ๋ชจ๋“œ๋ฅผ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐํ•˜๋ฉด ํ• ์ˆ˜๋ก ์ด ๋ฌธ์„œ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ ์ค‘์ด๋”๋ผ๋„ CI ๋นŒ๋“œ์— pipenv ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์•„์ด๋””์–ด์ธ ์ด์œ ์— ๋Œ€ํ•œ ์„น์…˜์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@tsiq-oliverc ๋Œ€๋‹ค์ˆ˜์˜ ์ผ๋ฐ˜ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๋Š” "์‹คํ–‰, ํฌ๋ ˆ์ŠคํŠธ, ์‹คํ–‰" ๋ชจ๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” tox ๋ฐ pytest ๋ฅผ ๋„์ž…ํ•˜๋Š” ๋ฐ ์žˆ์–ด ์ด๋Ÿฌํ•œ ํŒจํ‚ค์ง€ ์ค‘ ๋ช‡ ๊ฐœ๋ฅผ ๋„์™”์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ์ฃผ์–ด์ง„ ํŒจํ‚ค์ง€ ํ’ˆ์งˆ์— ๊ธฐ์—ฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ž˜ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋˜ ๋‹ค๋ฅธ ํ›Œ๋ฅญํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์ธ ํŒŒ์ด์ฌ ํ”„๋กœ์ ํŠธ์—์„œ pipenv ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ํ’ˆ์งˆ์— ๊ธฐ์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ •๋‹นํ•˜๊ณ  ๋”ฐ๋ฅด๊ธฐ ์‰ฌ์šด ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐœ์˜ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋ ˆ์‹œํ”ผ๋ฅผ ์ฐพ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Flask ํ”„๋กœ์ ํŠธ์— ๋ญ๋ผ๊ณ  ๋งํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?

  1. ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋ฒ” ์‚ฌ๋ก€(์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ)๋ฅผ ๋”ฐ๋ฅด์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
  2. Pipfile.lock ํŒŒ์ผ 9๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ์ •์ฑ…์„ ์„ค์ •ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
  3. Travis์™€ Appveyor๊ฐ€ Ice Age ๋ชจ๋“œ์— ๋”ฐ๋ผ 2๋‹จ๊ณ„ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก CI ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
  4. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž์‹ ์˜ ์ปดํ“จํ„ฐ์—์„œ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์žฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ Pipfile.lock ์ธ๊ณต๋ฌผ์„ ์ƒ์„ฑํ•˜๋„๋ก Travis ๋ฐ Appveyor์šฉ CI ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
  5. "Flask์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค."๋ผ๋Š” ๋ง ์™ธ์—๋Š” ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ชฉํ‘œ๋Š” ๊ธฐ๋Šฅ์ ์ธ ์ž‘์—… ์Šคํƒ€์ผ์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ ์ข‹๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@vlcinsky ๋‚˜๋Š” (1)๊ณผ (4)๊ฐ€ ๊ทธ๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด Pipfile.lock ๊ฐ€ ์—†์œผ๋ฉด ๋นŒ๋“œ์— ์‚ฌ์šฉ๋œ ๋ฒ„์ „์„ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ(ํšŒ์‚ฌ ํ™˜๊ฒฝ ์™ธ๋ถ€์—์„œ๋Š” ๊ดœ์ฐฎ์Œ) ์ž ๊ธˆ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ณด๊ด€ํ•˜๋ฉด ์—ฌ์ „ํžˆ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์ค‘.

ํŽธ์ง‘ : ๋‚ด ๊ถŒ์žฅ ์‚ฌํ•ญ์˜ tl;dr ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋“  ์ƒ๊ด€์—†์ด ๋นŒ๋“œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•ญ์ƒ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. pipenv ๋Š” ์ด ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ Pipfile.lock ๋ฅผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ปค๋ฐ‹ํ•˜๊ณ  ๋ฐฐํฌ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (์ด๋Š” ์ด๋ฏธ ๊ธฐ์กด ๋ฌธ์„œ์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค.)
  • ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ CI ๋นŒ๋“œ์—์„œ ์ฆ‰์‹œ Pipfile.lock ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด๊ด€ํ•˜์‹ญ์‹œ์˜ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ ์ค‘์ด๊ณ  ์ œํ•œ์ ์ธ ๊ธฐ์—… ํ™˜๊ฒฝ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ์ ์ ˆํ•œ ์ˆ˜์˜ ์ž ๊ธˆ ํŒŒ์ผ์„ ์œ ์ง€ํ•˜๊ณ  CI ๋นŒ๋“œ์—์„œ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

(๋ฌผ๋ก  ์‹ค์ œ ๋ฌธ์„œ์—๋Š” ์ข€ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ˆ์ œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

@ 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๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ํ’ˆ์งˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ชจ๋ฅด์ง€๋งŒ ์ฃผ๋กœ ๋‚ด๊ฐ€ ๋ณด์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ, ๋‹ค์Œ์€ ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์˜ ํŠน์ • ์ฆ์ƒ์ž…๋‹ˆ๋‹ค.

  • ๊นจ์ง„ setup.py ์ข…์†์„ฑ ์ˆจ๊ธฐ๊ธฐ. ์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค - pipenv install -e . , ๋งž์Šต๋‹ˆ๊นŒ?
  • ๋‹ค๋ฅธ ํŒŒ์ด์ฌ ๋ฒ„์ „์ด๋‚˜ ๋‹ค๋ฅธ OS์—์„œ๋Š” ์ข…์†์„ฑ์ด ์œ ํšจํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฌธ์ œ ๊ฐ€ ๋  ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์ด๊ฒƒ์ด ์ค‘์š”ํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (์ž ๊ธˆ ํŒŒ์ผ์˜ ์ปจํ…์ŠคํŠธ์—์„œ)
  • ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ๊ฐœ๋ฐœ์ž๋Š” ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋„๋ก ๊ฐ•์š” ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ข…์†์„ฑ์˜ ๋ฒ„์ „ n ์ด ์•„๋‹Œ ๋ฒ„์ „ n+1 ์— ๋Œ€ํ•ด ์ž‘๋™ํ•œ๋‹ค๋Š” ๋ณด์žฅ์„ ์ œ๊ณตํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ทธ๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘ ์„ธ๊ณ„์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋Š” ๋Œ€์•ˆ์„ ์ด๋ฏธ ์ œ์•ˆ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Tox์™€ ๊ฒฝ์Ÿํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ํ†ก์Šค์— ๋Œ€ํ•ด ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ค, ๋‘ ๊ฐœ์˜ ๋„๊ตฌ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜์—ฌ ์ข…์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์žฌ์•™์˜ ์ฒ˜๋ฐฉ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ํŠน์ • ์ž‘์—…์— ๋Œ€ํ•ด ๋” ๋‚˜์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
  • Pipenv๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. Pipenv ๋ฒ„์ „์„ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Docker ์ด๋ฏธ์ง€, Pip ๋ฒ„์ „ ๋“ฑ์„ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ˜„์žฌ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค).

@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 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง„์ž2

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-pipenv ๋Š” ์ถ”๊ฐ€ ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

tox.ini ํŒŒ์ผ์€ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์—๋Š” pipenv ๋ฉ๋‹ˆ๋‹ค.

pipenv ๋Š” ์ด๋ฏธ ํ™œ์„ฑํ™”๋œ virtualenv(tox ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ)์—์„œ ์‹คํ–‰๋  ๋•Œ ์ฃผ์–ด์ง„ ๊ฐ€์ƒ ํ™˜๊ฒฝ์— ์„ค์น˜๋œ๋‹ค๋Š” ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ •๋ง ๋ฉ‹์ง€๋‹ค.

Pipfile.lock ์ƒ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ ์ ˆํ•œ ์œ„์น˜๋กœ ์ด๋™ํ•˜๋ ค๋ฉด ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋‹ค์Œ ํ…Œ์ŠคํŠธ์— ์˜ํ•ด ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด .tox/py36/Pipfile.lock ๋กœ ag๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์•ฝ๊ฐ„์˜ ๋‹จ์ˆœํ™”). Pipfile ์œ„์น˜์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@vlcinsky

  • setup.py - ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. pipenv install -e . ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜๋ฉด setup.py๊ฐ€ ์ด์ œ ์ž ๊ธˆ ํŒŒ์ผ์„ ํ†ตํ•ด ์ถ”์ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ setup.py์— ์ƒˆ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค pipenv install ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž ๊ธˆ ํŒŒ์ผ ์—…๋ฐ์ดํŠธ๋ฅผ ์žŠ์–ด๋ฒ„๋ฆฐ ๊ฐœ๋ฐœ์ž - pipenv --deploy ๋Š” ์ด๋ฅผ ํฌ์ฐฉํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. CI์—์„œ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค!
  • Pipenv ์‹คํŒจ - ๋„๊ตฌ์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋™์˜
  • ํ†ก์Šค

    • Tox๊ฐ€ ํ…Œ์ŠคํŠธ ๊ด€๋ฆฌ์— ์ ํ•ฉํ•˜๋‹ค๋ฉด ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๋ฐ ๊ฒฐ์ •์  ๋นŒ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์—๋„ ์œ ์šฉํ•˜๋‹ค๋ฉด ๋”์šฑ ์ข‹์Šต๋‹ˆ๋‹ค.

    • ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด Pipenv๊ฐ€ ์กด์žฌํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” Tox์— ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ œํ•œ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

    • ์œ„์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์˜ค๋Š˜๋‚  ์„ธ๊ณ„์˜ ์ƒํƒœ(์ข‹์€ ์ƒํ˜ธ ์šด์šฉ์„ฑ ๋ถ€์กฑ)๋Š” ์ฒ ํ•™์„ ๊ฑฐ๋ถ€ํ•  ์ด์œ ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์ค‘ ํ™˜๊ฒฝ

    • ์—ฌ๊ธฐ์—๋Š” Flask์™€ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ ์–ด๋„ ๋ช‡ ๊ฐ€์ง€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž ๊ธˆ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์ œ์•ˆ์ด ์—†์Šต๋‹ˆ๋‹ค(๋น„๋ก ์ด์™€ ๊ด€๋ จํ•˜์—ฌ Pipenv์— ๋Œ€ํ•œ ํ–ฅํ›„ ๊ธฐ๋Šฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ?)

    • ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ์—๋„ ์—ฌ๋Ÿฌ ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ฌธ์ œ์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋กœ์ปฌ์—์„œ ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ 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์„ ๋‹ค์‹œ ๋งํ•˜๋ ค๋ฉด:

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

@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์˜ ์ˆ˜์™€ ๊ด€๋ จํ•˜์—ฌ ๋‚ด๊ฐ€ ์„ค๋ช…ํ•œ ๋ชจ๋“  ์ƒ์œ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ "์ž‘์€ ํ•˜์œ„ ์ง‘ํ•ฉ"์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๊นŒ?

์ด ํ† ๋ก ์„ ๋งˆ์น˜๊ธฐ ์œ„ํ•ด ํ† ๋ก  ์ค‘์— ๋ฐœ๊ฒฌํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์š”์•ฝ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ดˆ์ : Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ pipenv (์•ˆํ‹ฐ) ํŒจํ„ด

๋‚˜๋Š” ์ดˆ์ ์„ ์•ฝ๊ฐ„ ๋ฐ”๊ฟจ๋‹ค. ๊ทธ๊ฒƒ์€ (์ผ๋ฐ˜) ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์†Œ ์ €๋ ดํ•˜๊ณ  ์ฐจ์ด์ ์„ ์ž˜ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด์„œ๋„ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

pipenv , tox ๋“ฑ๊ณผ ๊ฐ™์€ ๊ธฐ์กด ๋„๊ตฌ์˜ ๋ณ€๊ฒฝ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ์˜๋„์ ์œผ๋กœ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค.

pipenv ์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ ๋ฌด์—‡์ด ์•„๋‹Œ์ง€

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

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

(python ์†Œํ”„ํŠธ์›จ์–ด) ์ œํ’ˆ์€ ๋‹ค๋ฅธ ์ œํ’ˆ(๋”ฐ๋ผ์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์—์„œ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๊ฑฐ๋‚˜ ์‹คํ–‰ํ•  ์ค€๋น„๊ฐ€ ๋œ ์ตœ์ข… ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ "์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ"๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ”์ฃผ์— ์†ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๊ฐ™์€ ๊ทœ์น™์ด ์ ์šฉ๋˜๊ณ  ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ˆ˜๋งŒ ๋” ์ ์Œ).

์†Œํ”„ํŠธ์›จ์–ด ์ œํ’ˆ์˜ ์ข…๋ฅ˜

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: ๋‹ค๋ฅธ ์ œํ’ˆ(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์—์„œ ์‚ฌ์šฉ
  • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ: ๋ฐฐํฌ ๋ฐ ์‹คํ–‰

์„ค์น˜ ๋ฐฉ๋ฒ•:

  • library: pipenv install <package> ๋”ฐ๋ผ์„œ "ํŒจํ‚ค์ง€ ์‹คํ–‰(๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „ ํ™•์ธ)"
  • application: pipenv sync ๋”ฐ๋ผ์„œ "๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ ์ ์šฉ"

์ถ”์ƒ์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ

์†Œํ”„ํŠธ์›จ์–ด ์ œํ’ˆ ์ข…์†์„ฑ

  • ์ถ”์ƒ ์ข…์†์„ฑ: ์‚ฌ์šฉ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ ๋ฒ„์ „ ๋˜๋Š” ์‚ฌ์šฉ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ถฉ๋ถ„ํžˆ ์œ ์—ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ฒ„์ „์„ ๊ณ ์ •ํ•˜์ง€ ์•Š์•„์•ผ ํ•จ).
  • ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ: ์ด์ƒ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•ด์‹œ์™€ ํ•จ๊ป˜ ๋ฒ„์ „์„ ๊ณ ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    pipenv ์œ ๋ฌผ:

  • Pipfile : ์ถ”์ƒ ์ข…์†์„ฑ

  • Pipfile.lock : ๊ตฌ์ฒด์ ์ธ(์ž ๊ธด) ์ข…์†์„ฑ"

์‹คํ–‰ ์ปจํ…์ŠคํŠธ

๋‹ค๋ฅธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ์ผ๋ฐ˜์ ์ธ ์ˆ˜

  • ๋„์„œ๊ด€:

    • ํ•˜๋‚˜์˜ OS์—์„œ python virtualenvs: 3 ~ 9(30์„ ์‚ฌ์šฉํ•˜๋Š” ํ† ๋„ค์ด๋„)

    • OS ์ˆ˜: 1 ~ 3(Linux, OSX, Windows)

    • ์ด ์ˆ˜: 3 ~ 18

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜:

    • ํ•˜๋‚˜์˜ OS์—์„œ python virtualenvs: 1

    • ์šด์˜ ์ฒด์ œ ์ˆ˜: 1

    • ์ด ์ˆ˜: 1(๋˜๋Š” ๋งค์šฐ ์ ์€ ์ˆ˜)

CI ๋ชฉํ‘œ, ์šฐ์„ ์ˆœ์œ„ ๋ฐ ๊ฒฐ์ •๋ก 

CI ๋ชฉํ‘œ

  • ๋„์„œ๊ด€:

    • ์ฝ”๋“œ ํฌํ•จ ์ถ”์ƒ ์ข…์†์„ฑ์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ชจ๋“  ์˜ˆ์ƒ ๋ณ€ํ˜• ๋‚ด์—์„œ ์„ค์น˜ ๋ฐ ์˜ˆ์ƒ ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • (๊ฐœ์ธ/๊ณต์šฉ) pypi๊ฐ€ ์ข…์†์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ํ…Œ์ŠคํŠธ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜:

    • ์„ค์น˜ ์‹œ(๊ตฌ์ฒด์ /๊ณ ์ •๋œ ์ข…์†์„ฑ ์‚ฌ์šฉ) ๋ชจ๋“  ์˜ˆ์ƒ ๊ธฐ๋Šฅ์ด ์‚ฌ์ „ ์ •์˜๋œ ํ•˜๋‚˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์— ๊ด€ํ•œ ํŠน์ • CI ๋ชฉํ‘œ:

  • ๋„์„œ๊ด€:

    • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ์„ ์–ธ๋œ ์ถ”์ƒ ์ข…์†์„ฑ์€ ์™„์ „ํ•˜๊ณ  ํ•„์š”ํ•œ ๋ชจ๋“  ์ œํ•œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ): ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

    • ๋ชจ๋“  ์˜ˆ์ƒ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜:

    • ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ์ด ์™„์ „ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด์‹œ: ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ œ๋Œ€๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

    • ๋ชจ๋“  ์˜ˆ์ƒ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ CI ํ…Œ์ŠคํŠธ ๋ชจ๋“œ

  • ๋ชจ๋“œ: "๋‹ฌ๋ ค๋ผ ํฌ๋ ˆ์ŠคํŠธ ๋‹ฌ๋ ค๋ผ"

    • ์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค.

    • tox ๋˜๋Š” ์œ ์‚ฌํ•œ ํ…Œ์ŠคํŠธ SW ์‚ฌ์šฉ

    • pipenv ๋ฐ ๊ตฌ์ฒด์ ์ธ ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Œ)

  • ๋ชจ๋“œ: "์ƒ์„ฑ ๋ฐ ๋ด‰์ธ"

    • ์ €์žฅ์†Œ์— Pipfile ์—†์Œ

    • Pipfile.lock ๋งŒ๋“  pipenv install -e .

    • Pipfile.lock ํ™˜๊ฒฝ์„ ๋ฌธ์„œํ™”(๋ด‰์ธ)ํ•˜๊ณ  ๋‚˜์ค‘์— ๋ฌธ์ œ ๋ถ„์„์„ ์œ„ํ•ด virtualenv๋ฅผ ๋ณต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“œ: "์•„์ด์Šค ์—์ด์ง€"

    • 2๋‹จ๊ณ„ ํ…Œ์ŠคํŠธ

      • ์ถ”์ƒ ์ข…์†์„ฑ( setup.py install_requires ๋‚ด์— ์ •์˜๋จ)์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ pypi์˜ ์ข…์† ํŒจํ‚ค์ง€๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด pipenv install -e . Pipfile.lock ๋ฅผ ์žฌ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    • ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์‹คํ–‰: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. pipenv sync Pipfile.lock ์˜ํ•ด ์ƒ์„ฑ๋œ virtualenv ๋‚ด์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

      Pipfile.lock ๋Š” ์–ด๋–ป๊ฒŒ ๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ(์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Œ)

  • CI ๋นŒ๋“œ์— ์˜ํ•ด ์ž๋™์œผ๋กœ (๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ณ  ๊ฒ€์ฆ๋œ ์ธ๊ณต๋ฌผ ์„ ์–ธ)

๊ฒฐ์ •๋ก  ๋Œ€ ์œ ์—ฐ์„ฑ์˜ ์šฐ์„  ์ˆœ์œ„

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: ์œ ์—ฐ์„ฑ(๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์‹คํ–‰)
  • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ: ๊ฒฐ์ •์„ฑ(์„ ํƒํ•œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰)

    ์„ค์น˜๋œ ์ œํ’ˆ์˜ ๊ฒฐ์ •์„ฑ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์‚ฌํ•ญ:

  • ๊ณต๊ฐœ pypi(๋‚ฎ์€ ๊ฒฐ์ •์„ฑ, ํŒจํ‚ค์ง€๋Š” ์–ธ์ œ๋“ ์ง€ ์—…๋ฐ์ดํŠธ๋จ)

  • private pypi(๋†’์€ ๊ฒฐ์ •์„ฑ, ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ œ์–ด๋  ์ˆ˜ ์žˆ์Œ)
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์˜ ์ถ”์ƒ ์š”๊ตฌ ์‚ฌํ•ญ(๊ฒฐ์ •๋ก ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ)
  • ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ( Pipfile.lock ): ์ด์ฒด์  ๊ฒฐ์ •๋ก 

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žก๋‹คํ•œ

Pipfile.lock ์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€:

  • (๋ฐ˜ํŒจํ„ด) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”์ƒ ์ข…์†์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค(์ถ”์ƒ์ด์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—)
  • (๋ฐ˜ํŒจํ„ด) ํ…Œ์ŠคํŠธ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ virtualenv ์„ค์ •(๊นจ์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”์ƒ ์ข…์†์„ฑ์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Œ)
  • ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋œ ์ •ํ™•ํ•œ virtualenv("๋ด‰์ธ")๋ฅผ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‚˜์ค‘์— ๊นจ์ง„ ํ…Œ์ŠคํŠธ ๋ฐ ์‹คํ—˜์„ ์œ„ํ•ด ๋‹ค์‹œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ).
  • ํ…Œ์ŠคํŠธ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ virtualenv ์„ค์ •
  • ํ”„๋กœ๋•์…˜์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

    ๊ธฐํƒ€ ํžŒํŠธ

  • pbr ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” requirements.txt ๋ฅผ ํ†ตํ•ด ์ถ”์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์†์„ฑ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pipfile ์—…๋ฐ์ดํŠธ๊ฐ€ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

  • poetry ํŒจํ‚ค์ง€๋Š” pyenv ์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

    ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ

  • "์ž ๊ธˆ ํŒŒ์ผ์„ repo์— ๋“œ๋กญ"ํ•˜๋ฉด ๊ฒฐ์ •์  ๋นŒ๋“œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
    • ์‹ค์ œ๋กœ ์ˆ˜๋งŽ์€ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ๊ณ  ๊ฐ๊ฐ ๋‹ค๋ฅธ Pipfile.lock ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง„์ง€ํ•˜๊ฒŒ: flask ๋Š” 11๊ฐœ์˜ ๋‹ค๋ฅธ ๊ฐ€์ƒ ํ™˜๊ฒฝ(ํ•˜๋‚˜์˜ OS์—์„œ) 10๊ฐœ์˜ ๋‹ค๋ฅธ ์ž ๊ธด ์ข…์†์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ๋งŒ๋“ค๊ณ  ์ปค๋ฐ‹ํ•  ๊ฒƒ์ธ๊ฐ€?
    • "์ƒ์„ฑ ๋ฐ ๋ด‰์ธ" CI ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ์ „ํžˆ Pipfile.lock (CI ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ƒ์„ฑ๋จ)๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ๊ณณ์—์„œ virtualenv๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Pipfile.lock ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ €์žฅ์†Œ

    • virtualenv๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ setup.py ๋‚ด์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์†์„ฑ์˜ ๊นจ์ง„ ์ •์˜๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Pipfile ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ €์žฅ์†Œ

    • setup.py ๋‚ด์—์„œ ์ •์˜๋˜๋Š” ์ถ”์ƒ ์ข…์†์„ฑ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒฝ์šฐ ๊นจ์ง„ setup.py ์ข…์†์„ฑ ์„ ์–ธ์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ถ”์ฒœ : ์ƒ์„ฑ Pipfile ๋กœ pipenv install -e . ๋˜๋Š” pipenv install -e .[tests] ๋‹น์‹ ์€ ๋˜ํ•œ ํ…Œ์ŠคํŠธ ์ข…์†์„ฑ ๊ทธ๋“ค์€ "ํ…Œ์ŠคํŠธ"๋ฅผ์— ์—‘์ŠคํŠธ๋ผ๋กœ ์„ ์–ธ ํ•„์š”ํ•˜๋‹ค๋ฉด setup.py

  • CI ์Šคํฌ๋ฆฝํŠธ์— pipenv install <something> ์ถ”๊ฐ€

    • ์ž์ฒด์ ์œผ๋กœ๋Š” ๊ฒฐ์ •๋ก ์„ ๋งŽ์ด ํ–ฅ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • "์ƒ์„ฑ ๋ฐ ๋ด‰์ธ" CI ๋ชจ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค(๊ทธ๋Ÿฐ ๋‹ค์Œ virtualenv์— ๋Œ€ํ•œ ๋ชจ๋“  ์„ค์น˜๋Š” pipenv ๊ฑฐ์ณ์•ผ ํ•จ).

๊ฒฐ๋ก 

Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ํŠนํžˆ ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋Š” ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋งŽ์€ ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์—์„œ ์ž…์ฆ๋œ ์œ ์—ฐ์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฒฐ์ •์  ๋นŒ๋“œ๋ณด๋‹ค ์œ ์—ฐ์„ฑ์ด ๋” ์ค‘์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. "์ปดํŒŒ์ผ" ์„ธ๊ณ„์—์„œ ์˜จ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด๊ฒƒ์€ ๋งค์šฐ ๋‚˜์œ ๋ฐ˜ํŒจํ„ด์ฒ˜๋Ÿผ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค์€ ๋Œ€๋ถ€๋ถ„์˜(์•„๋งˆ๋„ ๋ชจ๋“ ) Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฒฐ์ •๋ก ์  ๋นŒ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ(์ผ๋ถ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์„ธ์š”) Python์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Python ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ด์•„ ์žˆ๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๋กœ์„œ์˜ Python์ด ์ปดํŒŒ์ผ๋œ ์„ธ๊ณ„์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ด์œ ๋Š” ๊ฒฐ์ •๋ก ์ด ๋‚˜์ค‘์— ํ•œ ๋‹จ๊ณ„ ๋‚˜์ค‘์— ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง‘ํ•ฉ์—์„œ ๋นŒ๋“œ)์ด ๊ฒฐ์ •๋ก ์— ๋Œ€ํ•œ (์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ •๋‹นํ•œ) ์š”๊ตฌ ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ์ƒํ™ฉ์ด ์ •๋ฐ˜๋Œ€์ด๋ฉฐ ์—ฌ๊ธฐ์„œ pipenv ์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ์ •๋ก ์— ์‰ฝ๊ฒŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์— ๋ฌด์—‡์„ํ• ์ง€?

  • ๋‹ค์Œ ์ฃผ๋‚˜ 2์ฃผ ๋™์•ˆ ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์‹œ๊ฐ„์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์–ด๋”˜๊ฐ€์— ์ผ๋ จ์˜ ๋ธ”๋กœ๊ทธ ํ•ญ๋ชฉ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์–ด๋””์„œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ). ์žฅ์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด(์ด์ƒ์ ์œผ๋กœ๋Š” ์•ฝ๊ฐ„์˜ ํ† ๋ก ์ด ํ—ˆ์šฉ๋จ), ๋‚ด์šฉ์„ ์ฐธ์กฐํ•˜๊ณ  ํ† ๋ก ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ (๋งŒ์•ฝ ์‚ด์•„๋‚จ๋Š” ๊ฒฝ์šฐ) ์–ด๋”˜๊ฐ€์— ๋Œ๋กœ ๋†“์•„๋‘๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ์žฅ์†Œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค :-).
  • ๋‚˜๋Š” @uranusjr ์ด ์ด ๋ฌธ์ œ์˜

๋งค์šฐ ๊ณ ๋ฌด์ ์ธ ํ† ๋ก ์„ ํ•ด์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. "๋‚˜๋Š” ์ด ์ฃผ์ œ์—์„œ ์™„์ „ํžˆ ๋น ์กŒ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์„ธ ๋ฒˆ ๋ฆฌํŒฉํ† ๋ง๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์ด๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ์ข‹์•„์กŒ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@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, ...)์™€ ๊ณต์œ ๋œ ํŒŒ์ผ์„ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ์— ์žˆ๋Š” ํŒŒ์ผ)

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