PyPI๋ฅผ ํตํ ํ์ด์ฌ ํจํค์ง ๋ฐฐํฌ ์ข ํฉ ๊ฐ์ด๋. ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ฅผ ์ํ ๋ฒ์ ๊ด๋ฆฌ ๋ชจ๋ฒ ์ฌ๋ก, ๋๊ตฌ ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๋ค๋ฃน๋๋ค.
ํ์ด์ฌ ํจํค์ง ๋ฐฐํฌ: PyPI ๊ฒ์ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ
ํ์ด์ฌ์ ๋ฐฉ๋ํ ์ํ๊ณ๋ ํ์ด์ฌ ํจํค์ง ์ธ๋ฑ์ค(PyPI)๋ฅผ ํตํด ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ๊ด๋ฒ์ํ ํจํค์ง ์ปฌ๋ ์ ์ ์ํด ๊ตฌ๋๋ฉ๋๋ค. ์ด ๊ฐ์ด๋๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ์ ๊ทผํ ์ ์๋๋ก PyPI๋ฅผ ํตํด ์์ ์ ํ์ด์ฌ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ณ ํ์ง ํ์ด์ฌ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๊ฒ์ํ๊ธฐ ์ํ ํ์ ๋๊ตฌ, ๋ฒ์ ๊ด๋ฆฌ ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ ํ์ด์ฌ ํจํค์ง๋ฅผ ๋ฐฐํฌํด์ผ ํ ๊น์?
์์ ์ ํ์ด์ฌ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ฉด ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค:
- ์์ ๊ณต์ : ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ์ฌ ํ์ ๊ณผ ํ์ ์ ์ด์งํ ์ ์์ต๋๋ค. ์ ์ธ๊ณ ํ์ด ํ์ด์ฌ์ผ๋ก ๋ง๋ ์ ๋ฌธ ๋ฐ์ดํฐ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์์ํด ๋ณด์ธ์.
- ์์กด์ฑ ๊ด๋ฆฌ: ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๊ณผ์ ์ ๋จ์ํํฉ๋๋ค. ํจํค์ง๋ ๋ชจ๋ ์์กด์ฑ๊ณผ ํจ๊ป ๋จ์ผ ๋ช ๋ น์ด๋ก ์ค์นํ ์ ์์ต๋๋ค.
- ์คํ์์ค ๊ธฐ์ฌ: ์คํ์์ค ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๊ณ ์์ ์ ๋ํ ์ธ์ ์ ๋ฐ์ ์ ์์ต๋๋ค. ๋ง์ ํต์ฌ ์ํํธ์จ์ด ๊ตฌ์ฑ ์์๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ์ ์ง ๊ด๋ฆฌํ๋ ์คํ์์ค ํจํค์ง์ ๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ์ ๋ฐ์ดํธ: ๋ฒ์ ์ ๊ด๋ฆฌํ๊ณ , ์ ๋ฐ์ดํธ๋ฅผ ๋ฆด๋ฆฌ์คํ๋ฉฐ, ๋ฒ๊ทธ ์์ ์ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ํญ์ ์ต์ ์ด๊ณ ๊ฐ์ฅ ์ ๋ขฐํ ์ ์๋ ๋ฒ์ ์ ํจํค์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ์ฌ์ด ์ค์น: `pip install your-package-name`์ ํตํด ์ฌ์ฉ์์ ์ค์น๋ฅผ ๊ฐ์ํํฉ๋๋ค.
ํ์ด์ฌ ํจํค์ง ๋ฐฐํฌ๋ฅผ ์ํ ํ์ ๋๊ตฌ
ํ์ด์ฌ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๋ฐฐํฌํ๋ ๋ฐ ํ์์ ์ธ ๋ช ๊ฐ์ง ๋๊ตฌ๊ฐ ์์ต๋๋ค:
- setuptools: ์ด๋ฆ, ๋ฒ์ , ์์กด์ฑ, ์ง์ ์ (entry points) ๋ฑ ํจํค์ง ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ํ์ด์ฌ ํ๋ก์ ํธ ํจํค์ง์ ์ฌ์ค์ ํ์ค์ ๋๋ค.
- wheel: ์์ค ๋ฐฐํฌํ์ ๋นํด ๋ ํจ์จ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ์ค์น ํ๋ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ ๋ฐฐํฌ ํ์์ ๋๋ค. ํ (Wheel)์ ์ปดํ์ผ ์์ด ์ค์นํ ์ ์๋ ์ฌ์ ๋น๋๋ ๋ฐฐํฌํ์ ๋๋ค.
- twine: ํจํค์ง๋ฅผ PyPI์ ์์ ํ๊ฒ ์ ๋ก๋ํ๊ธฐ ์ํ ๋๊ตฌ์ ๋๋ค. Twine์ ์ ์ก ์ค ์๊ฒฉ ์ฆ๋ช ๊ณผ ํจํค์ง ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ๋์ฒญ ๋ฐ ์ค๊ฐ์ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค.
- venv/virtualenv: ๊ฒฉ๋ฆฌ๋ ํ์ด์ฌ ํ๊ฒฝ์ ๋ง๋ค๊ธฐ ์ํ ๋๊ตฌ์ ๋๋ค. ๊ฐ์ ํ๊ฒฝ์ ์ฌ์ฉํ๋ ๊ฒ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ๋ค๋ฅธ ํ๋ก์ ํธ ๊ฐ์ ์ถฉ๋์ ํผํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
ํ๋ก์ ํธ ์ค์ ํ๊ธฐ
ํจํค์ง๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ ์ ํ๋ก์ ํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์กฐํํด์ผ ํฉ๋๋ค.
ํ๋ก์ ํธ ๊ตฌ์กฐ ์์
my_package/ โโโ my_package/ โ โโโ __init__.py โ โโโ module1.py โ โโโ module2.py โโโ tests/ โ โโโ __init__.py โ โโโ test_module1.py โ โโโ test_module2.py โโโ README.md โโโ LICENSE โโโ setup.py โโโ .gitignore
์ค๋ช :
- my_package/: ํจํค์ง์ ์์ค ์ฝ๋๋ฅผ ํฌํจํ๋ ์ฃผ ๋๋ ํฐ๋ฆฌ์ ๋๋ค.
- my_package/__init__.py: `my_package` ๋๋ ํฐ๋ฆฌ๋ฅผ ํ์ด์ฌ ํจํค์ง๋ก ๋ง๋ญ๋๋ค. ๋น์ด ์๊ฑฐ๋ ์ด๊ธฐํ ์ฝ๋๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
- my_package/module1.py, my_package/module2.py: ์ค์ ์ฝ๋๋ฅผ ํฌํจํ๋ ํ์ด์ฌ ๋ชจ๋์ ๋๋ค.
- tests/: ๋จ์ ํ ์คํธ๋ฅผ ํฌํจํ๋ ๋๋ ํฐ๋ฆฌ์ ๋๋ค. ํจํค์ง์ ํ์ง๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
- README.md: ํจํค์ง ์ค๋ช , ์ฌ์ฉ๋ฒ ๋ฐ ๊ธฐํ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋งํฌ๋ค์ด ํ์ผ์ ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ PyPI์์ ๊ฐ์ฅ ๋จผ์ ๋ณด๊ฒ ๋๋ ๋ด์ฉ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- LICENSE: ํจํค์ง๊ฐ ๋ฐฐํฌ๋๋ ๋ผ์ด์ ์ค(์: MIT, Apache 2.0, GPL)๋ฅผ ํฌํจํ๋ ํ์ผ์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ๋ช ์ํ๊ธฐ ์ํด ์ ์ ํ ๋ผ์ด์ ์ค๋ฅผ ์ ํํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
- setup.py: ํจํค์ง์ ๋ฉํ๋ฐ์ดํฐ์ ๋น๋ ์ง์นจ์ ์ ์ํ๋ ์ฃผ ์ค์ ํ์ผ์ ๋๋ค.
- .gitignore: Git์ด ๋ฌด์ํด์ผ ํ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ(์: ์์ ํ์ผ, ๋น๋ ์ํฐํฉํธ)๋ฅผ ์ง์ ํฉ๋๋ค.
`setup.py` ํ์ผ ๋ง๋ค๊ธฐ
`setup.py` ํ์ผ์ ํจํค์ง ๋ฐฐํฌ์ ํต์ฌ์ ๋๋ค. ํจํค์ง์ ๋ํ ๋ฉํ๋ฐ์ดํฐ์ ๋น๋ ๋ฐ ์ค์น ์ง์นจ์ ํฌํจํฉ๋๋ค. ๋ค์์ ์์์ ๋๋ค:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="my_package", # ์ฌ๋ฌ๋ถ์ ํจํค์ง ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ์ธ์
version="0.1.0",
author="Your Name", # ์ฌ๋ฌ๋ถ์ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ์ธ์
author_email="your.email@example.com", # ์ฌ๋ฌ๋ถ์ ์ด๋ฉ์ผ๋ก ๋ฐ๊พธ์ธ์
description="A small example package",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/yourusername/my_package", # ์ฌ๋ฌ๋ถ์ ์ ์ฅ์ URL๋ก ๋ฐ๊พธ์ธ์
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
install_requires=[
"requests", # ์์ ์์กด์ฑ
],
)
์ค๋ช :
- name: PyPI์์ ์ฌ์ฉ๋ ํจํค์ง์ ์ด๋ฆ์ ๋๋ค. ๊ณ ์ ํ๊ณ ์ค๋ช ์ ์ธ ์ด๋ฆ์ ์ ํํ์ธ์.
- version: ํจํค์ง์ ๋ฒ์ ๋ฒํธ์ ๋๋ค. ์ ์์ ๋ฒ์ ๊ด๋ฆฌ(์๋ ์ฐธ์กฐ)๋ฅผ ๋ฐ๋ฅด์ธ์.
- author, author_email: ์ฌ๋ฌ๋ถ์ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ ์ฃผ์์ ๋๋ค.
- description: ํจํค์ง์ ๋ํ ์งง์ ์ค๋ช ์ ๋๋ค.
- long_description: ์ผ๋ฐ์ ์ผ๋ก `README.md` ํ์ผ์์ ์ฝ์ด์ค๋ ๋ ๊ธธ๊ณ ์์ธํ ์ค๋ช ์ ๋๋ค.
- long_description_content_type: ๊ธด ์ค๋ช ์ ํ์(์: "text/markdown")์ ์ง์ ํฉ๋๋ค.
- url: ํจํค์ง ํํ์ด์ง์ URL(์: GitHub ์ ์ฅ์)์ ๋๋ค.
- packages: ๋ฐฐํฌํ์ ํฌํจํ ํจํค์ง ๋ชฉ๋ก์ ๋๋ค. `setuptools.find_packages()`๋ ํ๋ก์ ํธ์ ๋ชจ๋ ํจํค์ง๋ฅผ ์๋์ผ๋ก ์ฐพ์ต๋๋ค.
- classifiers: ์ฌ์ฉ์๊ฐ PyPI์์ ํจํค์ง๋ฅผ ์ฐพ๋ ๋ฐ ๋์์ด ๋๋ ๋ฉํ๋ฐ์ดํฐ์ ๋๋ค. Trove ๋ถ๋ฅ์ ๋ชฉ๋ก์์ ์ ์ ํ ๋ถ๋ฅ์๋ฅผ ์ ํํ์ธ์. ์ง์๋๋ ํ์ด์ฌ ๋ฒ์ , ์ด์ ์ฒด์ ๋ฐ ๋ผ์ด์ ์ค์ ๋ํ ๋ถ๋ฅ์๋ฅผ ํฌํจํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- python_requires: ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ํ์ํ ์ต์ ํ์ด์ฌ ๋ฒ์ ์ ์ง์ ํฉ๋๋ค.
- install_requires: ํจํค์ง์ ํ์ํ ์์กด์ฑ ๋ชฉ๋ก์ ๋๋ค. ์ด ์์กด์ฑ๋ค์ ํจํค์ง๊ฐ ์ค์น๋ ๋ ์๋์ผ๋ก ์ค์น๋ฉ๋๋ค.
๋ฒ์ ๊ด๋ฆฌ: ์ ์์ ๋ฒ์ ๊ด๋ฆฌ(Semantic Versioning)
์ ์์ ๋ฒ์ ๊ด๋ฆฌ(SemVer)๋ ํจํค์ง์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฑ๊ฒฉ์ ๋ช ํํ๊ณ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ ๋ฌํ๋ ๋๋ฆฌ ์ฑํ๋ ๋ฒ์ ๊ด๋ฆฌ ์ฒด๊ณ์ ๋๋ค.
SemVer ๋ฒ์ ๋ฒํธ๋ `์ฃผ(MAJOR).๋ถ(MINOR).์(PATCH)`์ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ์ฃผ(MAJOR): ํ์ ํธํ๋์ง ์๋ API ๋ณ๊ฒฝ์ด ์์ ๋ ์ฌ๋ฆฝ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ ์ ์๋ ์ค๋ํ ๋ณ๊ฒฝ์ ๋ํ๋ ๋๋ค.
- ๋ถ(MINOR): ํ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ์ฌ๋ฆฝ๋๋ค. ์ด๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์์ํค์ง ์๋ ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ๊ฐ์ ์ฌํญ์ ์๋ฏธํฉ๋๋ค.
- ์(PATCH): ํ์ ํธํ์ฑ์ ์ ์งํ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ ๋ ์ฌ๋ฆฝ๋๋ค. ์ด๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ ์์์ํค์ง ์๋ ์์ ์์ ์ ์ํ ๊ฒ์ ๋๋ค.
์์:
- 1.0.0: ์ฒซ ๋ฒ์งธ ๋ฆด๋ฆฌ์ค.
- 1.1.0: ๊ธฐ์กด ์ฝ๋๋ฅผ ์์์ํค์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ต๋๋ค.
- 1.0.1: 1.0.0 ๋ฆด๋ฆฌ์ค์ ๋ฒ๊ทธ๋ฅผ ์์ ํ์ต๋๋ค.
- 2.0.0: ํ์ ํธํ๋์ง ์๋ API ๋ณ๊ฒฝ์ด ์์์ต๋๋ค.
SemVer๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ํจํค์ง์ ์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ ๋์ ์ํฅ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
ํจํค์ง ๋น๋ํ๊ธฐ
`setup.py` ํ์ผ ๊ตฌ์ฑ์ด ์๋ฃ๋๋ฉด ํจํค์ง๋ฅผ ๋น๋ํ ์ ์์ต๋๋ค.
- ๊ฐ์ ํ๊ฒฝ ์์ฑ: ํจํค์ง์ ์์กด์ฑ์ ๊ฒฉ๋ฆฌํ๊ธฐ ์ํด ๊ฐ์ ํ๊ฒฝ์ ๋ง๋๋ ๊ฒ์ ๊ฐ๋ ฅํ ๊ถ์ฅํฉ๋๋ค. `python3 -m venv .venv` (๋๋ `virtualenv .venv`)๋ฅผ ์ฌ์ฉํ ๋ค์ ํ์ฑํํ์ธ์ (`source .venv/bin/activate` on Linux/macOS, `.venv\Scripts\activate` on Windows).
- ๋น๋ ์์กด์ฑ ์ค์น: `pip install --upgrade setuptools wheel`์ ์คํํ์ธ์.
- ํจํค์ง ๋น๋: `python setup.py sdist bdist_wheel`์ ์คํํ์ธ์. ์ด ๋ช ๋ น์ด๋ `dist` ๋๋ ํฐ๋ฆฌ์ ์์ค ๋ฐฐํฌํ(sdist)๊ณผ ํ ๋ฐฐํฌํ(bdist_wheel)์ด๋ผ๋ ๋ ๊ฐ์ ๋ฐฐํฌ ํ์ผ์ ์์ฑํฉ๋๋ค.
`sdist`๋ ์์ค ์ฝ๋์ `setup.py` ํ์ผ์ ํฌํจํฉ๋๋ค. `bdist_wheel`์ ๋ ๋น ๋ฅด๊ฒ ์ค์นํ ์ ์๋ ์ฌ์ ๋น๋๋ ๋ฐฐํฌํ์ ๋๋ค.
PyPI์ ํจํค์ง ๊ฒ์ํ๊ธฐ
ํจํค์ง๋ฅผ ๊ฒ์ํ๊ธฐ ์ ์ PyPI (https://pypi.org/)์ ๊ณ์ ์ ๋ง๋ค๊ณ API ํ ํฐ์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด ํ ํฐ์ ์ ๋ก๋๋ฅผ ์ธ์ฆํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- PyPI์ ๋ฑ๋ก: https://pypi.org/account/register/๋ก ์ด๋ํ์ฌ ๊ณ์ ์ ๋ง๋์ธ์.
- API ํ ํฐ ์์ฑ: https://pypi.org/manage/account/๋ก ์ด๋ํ์ฌ "API tokens" ์น์ ๊น์ง ์คํฌ๋กคํ ๋ค์ ์ ํ ํฐ์ ๋ง๋์ธ์. ์ด ํ ํฐ์ ํจํค์ง๋ฅผ ์ ๋ก๋ํ๋ ๋ฐ ํ์ํ๋ฏ๋ก ์์ ํ๊ฒ ๋ณด๊ดํ์ธ์.
- Twine ์ค์น: `pip install twine`์ ์คํํ์ธ์.
- ํจํค์ง ์
๋ก๋: `twine upload dist/*`๋ฅผ ์คํํ์ธ์. ์ฌ์ฉ์ ์ด๋ฆ(
__token__)๊ณผ ๋น๋ฐ๋ฒํธ(์์ฑํ API ํ ํฐ)๋ฅผ ์ ๋ ฅํ๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
์ค์ ๋ณด์ ์ฐธ๊ณ : API ํ ํฐ์ ์ ์ฅ์์ ์ ๋ ์ปค๋ฐํ์ง ๋ง์ธ์. ์์ ํ๊ฒ ๋ณด๊ดํ๊ณ ์ ๋ก๋ ๊ณผ์ ์์ ํ๊ฒฝ ๋ณ์๋ ๋ค๋ฅธ ๋ณด์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ ๊ทผํ์ธ์.
ํจํค์ง ์ค์น ํ ์คํธํ๊ธฐ
ํจํค์ง๋ฅผ ๊ฒ์ํ ํ์๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์น๋๋์ง ํ ์คํธํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
- ์ ๊ฐ์ ํ๊ฒฝ ์์ฑ: ๊นจ๋ํ ํ๊ฒฝ์์ ์ค์น๋ฅผ ํ ์คํธํ๊ธฐ ์ํจ์ ๋๋ค.
- ํจํค์ง ์ค์น: `pip install your-package-name`์ ์คํํ์ธ์.
- ํจํค์ง ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์ฌ์ฉ: ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ์์ ํจํค์ง๋ฅผ ๊ฐ์ ธ์ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ์ธ์.
์ง์์ ์ธ ํตํฉ ๋ฐ ์ง์์ ์ธ ๋ฐฐํฌ(CI/CD)
ํจํค์ง์ ๋น๋, ํ ์คํธ ๋ฐ ๊ฒ์ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ๊ธฐ ์ํด GitHub Actions, GitLab CI ๋๋ Travis CI์ ๊ฐ์ CI/CD ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์์ ํจํค์ง๋ฅผ ๋น๋ํ์ฌ PyPI์ ๊ฒ์ํ๋ GitHub Actions ์ํฌํ๋ก์ฐ ์์์ ๋๋ค:
name: Publish to PyPI
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build package
run: python setup.py sdist bdist_wheel
- name: Publish package to PyPI
run: |
twine upload dist/* \
-u __token__ \
-p ${{ secrets.PYPI_API_TOKEN }}
์ค๋ช :
- ์ด ์ํฌํ๋ก์ฐ๋ GitHub์์ ์ ๋ฆด๋ฆฌ์ค๊ฐ ๊ฒ์๋ ๋ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
- ์ฝ๋๋ฅผ ์ฒดํฌ์์ํ๊ณ , ํ์ด์ฌ์ ์ค์ ํ๊ณ , ์์กด์ฑ์ ์ค์นํ๊ณ , ํจํค์ง๋ฅผ ๋น๋ํ ๋ค์ PyPI์ ์ ๋ก๋ํฉ๋๋ค.
secrets.PYPI_API_TOKEN์ PyPI API ํ ํฐ์ ์ ์ฅํ๋ GitHub ์ํฌ๋ฆฟ์ ๋๋ค. ์ด ์ํฌ๋ฆฟ์ GitHub ์ ์ฅ์ ์ค์ ์์ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
ํ์ด์ฌ ํจํค์ง ๋ฐฐํฌ ๋ชจ๋ฒ ์ฌ๋ก
- ํฌ๊ด์ ์ธ ๋ฌธ์ ์์ฑ: ์์ธํ `README.md` ํ์ผ๊ณผ Sphinx์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ API ๋ฌธ์๋ฅผ ํฌํจํ์ธ์. ๋ช ํํ๊ณ ์์ ํ ๋ฌธ์๋ ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ๋จ์ ํ ์คํธ ์์ฑ: ์ฝ๋์ ํ์ง๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฒ ์ ํ ํ ์คํธํ์ธ์. pytest๋ unittest์ ๊ฐ์ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ธ์.
- PEP 8 ์คํ์ผ ๊ฐ์ด๋๋ผ์ธ ์ค์: ์ผ๊ด๋๊ณ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์ํด ํ์ด์ฌ ๊ฐ์ ์ ์ 8(PEP 8) ์คํ์ผ ๊ฐ์ด๋๋ฅผ ๋ฐ๋ฅด์ธ์.
- ๋ผ์ด์ ์ค ์ฌ์ฉ: ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ๋ช ์ํ๊ธฐ ์ํด ์ ์ ํ ์คํ์์ค ๋ผ์ด์ ์ค๋ฅผ ์ ํํ์ธ์.
- ์์กด์ฑ์ ์ต์ ์ํ๋ก ์ ์ง: ๋ฒ๊ทธ ์์ , ๋ณด์ ํจ์น ๋ฐ ์๋ก์ด ๊ธฐ๋ฅ์ ์ด์ ์ ์ป๊ธฐ ์ํด ํจํค์ง์ ์์กด์ฑ์ ์ ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธํ์ธ์.
- ๊ฐ์ ํ๊ฒฝ ์ฌ์ฉ: ์์กด์ฑ์ ๊ฒฉ๋ฆฌํ๊ธฐ ์ํด ํญ์ ๊ฐ์ ํ๊ฒฝ ๋ด์์ ํจํค์ง๋ฅผ ๊ฐ๋ฐํ๊ณ ํ ์คํธํ์ธ์.
- ๊ตญ์ ํ(i18n) ๋ฐ ํ์งํ(l10n) ๊ณ ๋ ค: ํจํค์ง๊ฐ ์ฌ์ฉ์์๊ฒ ํ์๋๋ ํ ์คํธ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ์ธ์ด์ ์ง์ญ์ ์ ์ํ ์ ์๋๋ก ๋ง๋์ธ์. ์ด๋ ์ ์ฌ์ ์ธ ์ ์ธ๊ณ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ํ์ฅํฉ๋๋ค. Babel๊ณผ ๊ฐ์ ๋๊ตฌ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๋ค์ํ ์๊ฐ๋ ๋ฐ ํตํ ์ฒ๋ฆฌ: ํจํค์ง๊ฐ ๋ ์ง, ์๊ฐ ๋๋ ๊ธ์ต ๊ฑฐ๋๋ฅผ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ, ์ ์ธ๊ณ์ ๋ค์ํ ์๊ฐ๋์ ํตํ๋ฅผ ์ผ๋์ ๋์ธ์. ์ด๋ฌํ ๋ณต์ก์ฑ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ API๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋ช ํํ ์ค๋ฅ ๋ฉ์์ง ์ ๊ณต: ์ฌ์ฉ์๊ฐ ๋ฌด์์ด ์๋ชป๋์๊ณ ์ด๋ป๊ฒ ์์ ํด์ผ ํ๋์ง ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋ ์ ์ตํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์์ฑํ์ธ์. ๊ฐ๋ฅํ๋ค๋ฉด ์ด๋ฌํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ค๋ฅธ ์ธ์ด๋ก ๋ฒ์ญํ์ธ์.
- ์ ๊ทผ์ฑ ๊ณ ๋ ค: ํจํค์ง์ ์ธํฐํ์ด์ค์ ๋ฌธ์๋ฅผ ๋์์ธํ ๋ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ฅผ ๊ณ ๋ คํ์ธ์. ๋ชจ๋ ์ฌ๋์ด ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ทผ์ฑ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ฅด์ธ์.
๊ณ ๊ธ ์ฃผ์
- ๋ค์์คํ์ด์ค ํจํค์ง: ๋จ์ผ ํ์ด์ฌ ํจํค์ง๋ฅผ ์ฌ๋ฌ ๋๋ ํฐ๋ฆฌ ๋๋ ์ฌ๋ฌ ๋ฐฐํฌํ์ ๊ฑธ์ณ ๋ถํ ํ ์ ์์ต๋๋ค.
- ์ง์ ์ (Entry points): ๋ค๋ฅธ ํจํค์ง๋ ๋ช ๋ น์ค์์ ํธ์ถํ ์ ์๋ ํจ์๋ ํด๋์ค๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ํ์ผ: ํ์ด์ฌ์ด ์๋ ํ์ผ(์: ๋ฐ์ดํฐ ํ์ผ, ์ค์ ํ์ผ)์ ๋ฐฐํฌํ์ ํฌํจํ ์ ์์ต๋๋ค.
- ์กฐ๊ฑด๋ถ ์์กด์ฑ: ํน์ ์กฐ๊ฑด(์: ํน์ ์ด์ ์ฒด์ )์์๋ง ํ์ํ ์์กด์ฑ์ ์ง์ ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
PyPI์ ํ์ด์ฌ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ ๊ฒ์ ์ฌ๋ฌ๋ถ์ ์์ ์ ์ ์ธ๊ณ์ ๊ณต์ ํ๊ณ ํ์ด์ฌ ์ํ๊ณ์ ๊ธฐ์ฌํ๋ ํ๋ฅญํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ๋จ๊ณ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ค์น, ์ฌ์ฉ, ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฌ์ด ๊ณ ํ์ง ํ์ด์ฌ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๊ฒ์ํ ์ ์์ต๋๋ค. ํจํค์ง์ ์ฑ๊ณต์ ์ํด ๋ช ํํ ๋ฌธ์ํ, ์ฒ ์ ํ ํ ์คํธ, ์ผ๊ด๋ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฐ์ ์ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.