ํ์ด์ฌ ํจํค์ง ๊ด๋ฆฌ๋ฅผ ์ํ setup.py์ pyproject.toml์ ์ฌ์ธต ๋น๊ตํ๊ณ , ๋ชจ๋ฒ ์ฌ๋ก, ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต, ์ต์ ๋๊ตฌ๋ฅผ ๋ค๋ฃน๋๋ค.
ํ์ด์ฌ ํจํค์ง ๊ตฌ์กฐ: Setup.py ๋ Pyproject.toml - ์ข ํฉ ๊ฐ์ด๋
์๋
๊ฐ setup.py
ํ์ผ์ ํ์ด์ฌ ํจํค์ง ๊ด๋ฆฌ์ ์ด์์ด์์ต๋๋ค. ํ์ง๋ง ํ๊ฒฝ์ด ๋ฐ์ ํ๋ฉด์ pyproject.toml
์ด ํ๋์ ์ธ ๋์์ผ๋ก ๋ถ์ํ์ต๋๋ค. ์ด ์ข
ํฉ ๊ฐ์ด๋์์๋ ๋ ์ ๊ทผ ๋ฐฉ์์ ์ฐจ์ด์ ์ ํ์ํ์ฌ, ์ด๋ค ๊ฒ์ด ๋น์ ์ ํ๋ก์ ํธ์ ์ ํฉํ์ง ์ดํดํ๊ณ ํ์ด์ฌ ํจํค์ง๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋์ต๋๋ค.
๊ธฐ๋ณธ ์ฌํญ ์ดํดํ๊ธฐ
ํ์ด์ฌ ํจํค์ง๋ ๋ฌด์์ธ๊ฐ?
ํ์ด์ฌ ํจํค์ง๋ ํ์ด์ฌ ์ฝ๋๋ฅผ ์กฐ์งํ๊ณ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ด๋ จ ๋ชจ๋์ ๋๋ ํ ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๊ทธ๋ฃนํํ์ฌ ์ฝ๋๋ฅผ ๋ ๋ชจ๋ํํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ํจํค์ง๋ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ณ ํ๋ก์ ํธ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
ํจํค์ง ๋ฉํ๋ฐ์ดํฐ์ ์ญํ
ํจํค์ง ๋ฉํ๋ฐ์ดํฐ๋ ํจํค์ง ์ด๋ฆ, ๋ฒ์ , ์์ฑ์, ์์กด์ฑ, ์ง์
์ (entry points) ๋ฑ ํจํค์ง์ ๋ํ ํ์ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๋ฉํ๋ฐ์ดํฐ๋ pip
์ ๊ฐ์ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ํจํค์ง๋ฅผ ์ค์น, ์
๊ทธ๋ ์ด๋ ๋ฐ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ญ์ฌ์ ์ผ๋ก setup.py
๋ ์ด ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๋ ์ฃผ์ ๋ฐฉ๋ฒ์ด์์ต๋๋ค.
Setup.py: ์ ํต์ ์ธ ์ ๊ทผ ๋ฐฉ์
Setup.py๋ ๋ฌด์์ธ๊ฐ?
setup.py
๋ setuptools
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง์ ๊ตฌ์กฐ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๋ ํ์ด์ฌ ์คํฌ๋ฆฝํธ์
๋๋ค. ์ด๋ ๋์ ์ผ๋ก ์คํ๋๋ ํ์ผ๋ก, ํ์ด์ฌ ์ฝ๋๋ฅผ ์คํํ์ฌ ํจํค์ง๋ฅผ ๊ตฌ์ฑํ๋ค๋ ์๋ฏธ์
๋๋ค.
Setup.py์ ์ฃผ์ ๊ตฌ์ฑ ์์
์ผ๋ฐ์ ์ธ setup.py
ํ์ผ์ ๋ค์ ๊ตฌ์ฑ ์์๋ฅผ ํฌํจํฉ๋๋ค:
- ํจํค์ง ์ด๋ฆ: ํจํค์ง์ ์ด๋ฆ (์:
my_package
). - ๋ฒ์ : ํจํค์ง์ ๋ฒ์ ๋ฒํธ (์:
1.0.0
). - ์์ฑ์ ๋ฐ ์ ์ง๋ณด์์ ์ ๋ณด: ํจํค์ง์ ์์ฑ์ ๋ฐ ์ ์ง๋ณด์์์ ๋ํ ์ธ๋ถ ์ ๋ณด.
- ์์กด์ฑ: ํจํค์ง๊ฐ ์์กดํ๋ ๋ค๋ฅธ ํจํค์ง ๋ชฉ๋ก (์:
requests >= 2.20.0
). - ์ง์ ์ (Entry Points): ๋ช ๋ น์ค ์คํฌ๋ฆฝํธ ๋๋ ํจํค์ง๋ก ๋ค์ด์ค๋ ๋ค๋ฅธ ์ง์ ์ ์ ๋ํ ์ ์.
- ํจํค์ง ๋ฐ์ดํฐ: ํจํค์ง์ ํฌํจ๋์ด์ผ ํ๋ ๋น์ฝ๋ ํ์ผ (์: ์ค์ ํ์ผ, ๋ฐ์ดํฐ ํ์ผ).
Setup.py ์์
```python from setuptools import setup, find_packages setup( name='my_package', version='1.0.0', author='John Doe', author_email='john.doe@example.com', description='A simple Python package', packages=find_packages(), install_requires=[ 'requests >= 2.20.0', ], entry_points={ 'console_scripts': [ 'my_script = my_package.module:main', ], }, classifiers=[ 'Programming Language :: Python :: 3', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', ], ) ```Setup.py์ ์ฅ์
- ์ต์ํจ: ์ ํต์ ์ด๊ณ ์ ์๋ ค์ง ์ ๊ทผ ๋ฐฉ์์ด๋ฏ๋ก ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ด๋ฏธ ์ต์ํฉ๋๋ค.
- ์ ์ฐ์ฑ: ํ์ด์ฌ ์คํฌ๋ฆฝํธ์ด๊ธฐ ๋๋ฌธ์ ๋์ ์์ค์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋ณต์กํ ๋ก์ง์ ์ํํ๊ณ ํ์์ ๋ฐ๋ผ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
- ํ์ฅ์ฑ: Setuptools๋ ํ๋ถํ ๊ธฐ๋ฅ ์งํฉ์ ์ ๊ณตํ๋ฉฐ ์ฌ์ฉ์ ์ ์ ๋ช ๋ น ๋ฐ ํ์ฅ ๊ธฐ๋ฅ์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค.
Setup.py์ ๋จ์
- ๋์ ์คํ:
setup.py
์ ๋์ ์ธ ํน์ฑ์ ๋น๋ ๊ณผ์ ์์ ์์์ ์ฝ๋๋ฅผ ์คํํ๋ฏ๋ก ๋ณด์ ์ํ์ด ๋ ์ ์์ต๋๋ค. - ์๋ฌต์ ์์กด์ฑ:
setup.py
๋ ์ข ์ข setuptools ์์ฒด์ ๊ฐ์ ์๋ฌต์ ์์กด์ฑ์ ์์กดํ์ฌ ๋ถ์ผ์น์ ์ค๋ฅ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. - ๋ณต์ก์ฑ: ๋ณต์กํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ
setup.py
๊ฐ ์ปค์ง๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค. - ์ ํ์ ์ธ ์ ์ธ์ ๊ตฌ์ฑ: ๋ง์ ํจํค์ง ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ ์ธ์ ์ด ์๋ ๋ช ๋ น์ ์ผ๋ก ์ ์๋์ด ์ถ๋ก ํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค.
Pyproject.toml: ํ๋์ ์ธ ๋์
Pyproject.toml์ด๋ ๋ฌด์์ธ๊ฐ?
pyproject.toml
์ TOML(Tom's Obvious, Minimal Language) ํ์์ ์ฌ์ฉํ์ฌ ํจํค์ง์ ๋น๋ ์์คํ
๊ณผ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๋ ์ค์ ํ์ผ์
๋๋ค. ์ด๋ ์ ์ธ์ ์ ๊ทผ ๋ฐฉ์์ผ๋ก, ์ด๋ป๊ฒ ๋ฌ์ฑํ ์ง๊ฐ ์๋ ๋ฌด์์ ๋ฌ์ฑํ๊ณ ์ถ์์ง๋ฅผ ๋ช
์ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
Pyproject.toml์ ์ฃผ์ ์น์
์ผ๋ฐ์ ์ธ pyproject.toml
ํ์ผ์ ๋ค์ ์น์
์ ํฌํจํฉ๋๋ค:
[build-system]
: ์ฌ์ฉํ ๋น๋ ์์คํ ์ ์ ์ํฉ๋๋ค (์:setuptools
,poetry
,flit
).[project]
: ํ๋ก์ ํธ ์ด๋ฆ, ๋ฒ์ , ์ค๋ช , ์์ฑ์, ์์กด์ฑ ๋ฑ ํ๋ก์ ํธ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค.[tool.poetry]
๋๋[tool.flit]
: ๋๊ตฌ๋ณ ๊ตฌ์ฑ์ ์ํ ์น์ ์ ๋๋ค (์: Poetry, Flit).
Pyproject.toml ์์ (Setuptools ์ฌ์ฉ)
```toml [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "my_package" version = "1.0.0" description = "A simple Python package" authors = [ { name = "John Doe", email = "john.doe@example.com" } ] dependencies = [ "requests >= 2.20.0", ] [project.scripts] my_script = "my_package.module:main" [project.optional-dependencies] dev = [ "pytest", "flake8", ] [project.classifiers] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] [project.urls] homepage = "https://example.com" repository = "https://github.com/example/my_package" ```Pyproject.toml ์์ (Poetry ์ฌ์ฉ)
```toml [tool.poetry] name = "my_package" version = "1.0.0" description = "A simple Python package" authors = ["John DoePyproject.toml์ ์ฅ์
- ์ ์ธ์ ๊ตฌ์ฑ:
pyproject.toml
์ ํจํค์ง ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๋ ์ ์ธ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. - ํ์คํ๋ ๋น๋ ์์คํ : ์ฌ์ฉํ ๋น๋ ์์คํ ์ ๋ช ์ํ์ฌ ์ฌ๋ฌ ํ๊ฒฝ์์ ์ผ๊ด๋ ๋น๋๋ฅผ ๋ณด์ฅํฉ๋๋ค.
- ๊ฐ์ ๋ ์์กด์ฑ ๊ด๋ฆฌ: Poetry ๋ฐ Pipenv์ ๊ฐ์ ๋๊ตฌ๋
pyproject.toml
๊ณผ ์ํํ๊ฒ ํตํฉ๋์ด ๊ฐ๋ ฅํ ์์กด์ฑ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. - ๋ณด์ ์ํ ๊ฐ์: ์ ์ ์ค์ ํ์ผ์ด๋ฏ๋ก ๋น๋ ๊ณผ์ ์์ ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ์คํํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋ณด์ ์ํ์ ์ ๊ฑฐํฉ๋๋ค.
- ์ต์ ๋๊ตฌ์์ ํตํฉ:
pyproject.toml
์ Poetry, Pipenv, Flit๊ณผ ๊ฐ์ ์ต์ ํ์ด์ฌ ํจํค์ง ๋๊ตฌ์ ํ์ค์ ๋๋ค.
Pyproject.toml์ ๋จ์
- ํ์ต ๊ณก์ : ๊ฐ๋ฐ์๋ ์๋ก์ด ๊ตฌ๋ฌธ(TOML)๊ณผ ํจํค์ง ๊ด๋ฆฌ์ ๋ํ ์๋ก์ด ์ฌ๊ณ ๋ฐฉ์์ ๋ฐฐ์์ผ ํ ์ ์์ต๋๋ค.
- ์ ํ๋ ์ ์ฐ์ฑ: ๋ณต์กํ ๋ก์ง์ด ํ์ํ ๊ณ ๋๋ก ์ฌ์ฉ์ ์ ์๋ ๋น๋ ํ๋ก์ธ์ค์๋ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค.
- ๋๊ตฌ ์์กด์ฑ: ํน์ ๋น๋ ์์คํ (์: Setuptools, Poetry, Flit)์ ์ ํํ๊ณ ์ฌ์ฉ๋ฒ์ ๋ฐฐ์์ผ ํฉ๋๋ค.
Setup.py์ Pyproject.toml ๋น๊ต
setup.py
์ pyproject.toml
์ ์ฃผ์ ์ฐจ์ด์ ์ ์์ฝํ ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๊ธฐ๋ฅ | Setup.py | Pyproject.toml |
---|---|---|
๊ตฌ์ฑ ์คํ์ผ | ๋ช ๋ นํ (ํ์ด์ฌ ์ฝ๋) | ์ ์ธํ (TOML) |
๋น๋ ์์คํ | ์๋ฌต์ (Setuptools) | ๋ช
์์ ([build-system] ์ ๋ช
์) |
๋ณด์ | ์ ์ฌ์ ์ผ๋ก ๋ ์์ ํจ (๋์ ์คํ) | ๋ ์์ ํจ (์ ์ ๊ตฌ์ฑ) |
์์กด์ฑ ๊ด๋ฆฌ | ๊ธฐ๋ณธ (install_requires ) |
๊ณ ๊ธ (Poetry, Pipenv์ ํตํฉ) |
๋๊ตฌ | ์ ํต์ (Setuptools) | ํ๋์ (Poetry, Pipenv, Flit) |
์ ์ฐ์ฑ | ๋์ | ์ค๊ฐ |
๋ณต์ก์ฑ | ๋ณต์กํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๋์ ์ ์์ | ์ผ๋ฐ์ ์ผ๋ก ๋ฎ์ |
๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต: Setup.py์์ Pyproject.toml๋ก
setup.py
์์ pyproject.toml
๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๊ฒ์ ์ด๋ ค์ ๋ณด์ผ ์ ์์ง๋ง, ์ฅ๊ธฐ์ ์ธ ์ ์ง๋ณด์์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ํ ๊ฐ์น ์๋ ํฌ์์
๋๋ค. ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ์ต์ํ์ Pyproject.toml๋ก ์์ํ๊ธฐ
๋น๋ ์์คํ
์ ์ง์ ํ๋ ๊ธฐ๋ณธ pyproject.toml
ํ์ผ์ ๋ง๋ ๋ค์ setup.py
์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ pyproject.toml
๋ก ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํฉ๋๋ค.
2. Pyproject.toml๊ณผ ํจ๊ป Setuptools ์ฌ์ฉํ๊ธฐ
Setuptools๋ฅผ ๋น๋ ์์คํ
์ผ๋ก ๊ณ์ ์ฌ์ฉํ๋, ํ๋ก์ ํธ ๋ฉํ๋ฐ์ดํฐ๋ pyproject.toml
์ ์ ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ต์ํ ๋๊ตฌ๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ฉด์ pyproject.toml
์ ์ด์ ์ ํ์ฉํ ์ ์์ต๋๋ค.
3. Poetry์ ๊ฐ์ ์ต์ ๋๊ตฌ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ
Poetry๋ Pipenv์ ๊ฐ์ ์ต์ ๋๊ตฌ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. ์ด๋ฌํ ๋๊ตฌ๋ ํฌ๊ด์ ์ธ ์์กด์ฑ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ pyproject.toml
๊ณผ ์ํํ๊ฒ ํตํฉ๋ฉ๋๋ค.
์์: Poetry๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ
- Poetry ์ค์น:
pip install poetry
- ํ๋ก์ ํธ์์ Poetry ์ด๊ธฐํ:
poetry init
(์ด ๊ณผ์ ์pyproject.toml
ํ์ผ ์์ฑ์ ์๋ดํฉ๋๋ค) - ์์กด์ฑ ์ถ๊ฐ:
poetry add requests
(๋๋ ๋ค๋ฅธ ์์กด์ฑ๋ค) - ํจํค์ง ๋น๋:
poetry build
4. ์๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํ ๋๊ตฌ ์ฌ์ฉํ๊ธฐ
์ผ๋ถ ๋๊ตฌ๋ ๋ง์ด๊ทธ๋ ์ด์
๊ณผ์ ์ ์๋ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, setup.py
ํ์ผ์ pyproject.toml
ํ์ผ๋ก ๋ณํํ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ด์ฌ ํจํค์ง ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
1. ๊ฐ์ ํ๊ฒฝ ์ฌ์ฉํ๊ธฐ
ํญ์ ๊ฐ์ ํ๊ฒฝ์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ์ ์์กด์ฑ์ ์์คํ ์ ๋ฐ์ ํ์ด์ฌ ์ค์น์ ๊ฒฉ๋ฆฌํ์ธ์. ์ด๋ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ํ๋ก์ ํธ๊ฐ ์ฌ๋ฐ๋ฅธ ์์กด์ฑ์ ๊ฐ๋๋ก ๋ณด์ฅํฉ๋๋ค.
venv
์ฌ์ฉ ์์:
conda
์ฌ์ฉ ์์:
2. ์์กด์ฑ์ ์ ํํ๊ฒ ๋ช ์ํ๊ธฐ
๋ฒ์ ์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ํธํ ๊ฐ๋ฅํ ๋ฒ์ ์ ๋ช
์ํ์ธ์. ์ด๋ ํธํ๋์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋ฐ์ดํธ๋ก ์ธํ ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํฉ๋๋ค. ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ํด pip-tools
์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
์์กด์ฑ ๋ช ์ ์์:
``` requests >= 2.20.0, < 3.0.0 ```3. ์ผ๊ด๋ ๋น๋ ์์คํ ์ฌ์ฉํ๊ธฐ
๋น๋ ์์คํ (์: Setuptools, Poetry, Flit)์ ์ ํํ๊ณ ๊ทธ๊ฒ์ ๊ณ ์ํ์ธ์. ์ด๋ ์ฌ๋ฌ ํ๊ฒฝ์์ ์ผ๊ด๋ ๋น๋๋ฅผ ๋ณด์ฅํ๊ณ ํจํค์ง ๊ณผ์ ์ ๋จ์ํํฉ๋๋ค.
4. ํจํค์ง ๋ฌธ์ํํ๊ธฐ
ํจํค์ง์ ๋ํ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์๋ฅผ ์์ฑํ์ธ์. ์ด๋ ์ฌ์ฉ์๊ฐ ํจํค์ง ์ฌ์ฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ด ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. Sphinx์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์์ ๋ฌธ์๋ฅผ ์์ฑํ์ธ์.
5. ์ง์์ ํตํฉ(CI) ์ฌ์ฉํ๊ธฐ
CI ์์คํ (์: GitHub Actions, Travis CI, GitLab CI)์ ์ค์ ํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์ ํจํค์ง๋ฅผ ์๋์ผ๋ก ๋น๋, ํ ์คํธ ๋ฐ ๋ฐฐํฌํ์ธ์. ์ด๋ ํจํค์ง๊ฐ ํญ์ ์๋ ์ํ๋ฅผ ์ ์งํ๋๋ก ๋์ต๋๋ค.
GitHub Actions ์ค์ ์์:
```yaml name: Python Package on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python 3.9 uses: actions/setup-python@v4 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip pip install poetry poetry install - name: Lint with flake8 run: | poetry run flake8 . - name: Test with pytest run: | poetry run pytest ```6. PyPI์ ํจํค์ง ๊ฒ์ํ๊ธฐ
Python Package Index(PyPI)์ ํจํค์ง๋ฅผ ๊ฒ์ํ์ฌ ์ธ์๊ณผ ๊ณต์ ํ์ธ์. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฝ๊ฒ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
PyPI์ ๊ฒ์ํ๋ ๋จ๊ณ:
- PyPI์ TestPyPI์ ๊ณ์ ์ ๋ฑ๋กํฉ๋๋ค.
twine
์ค์น:pip install twine
.- ํจํค์ง ๋น๋:
poetry build
๋๋python setup.py sdist bdist_wheel
. - TestPyPI์ ํจํค์ง ์
๋ก๋:
twine upload --repository testpypi dist/*
. - PyPI์ ํจํค์ง ์
๋ก๋:
twine upload dist/*
.
์ค์ ์ฌ์ฉ ์ฌ๋ก
๋ช๋ช ์ธ๊ธฐ ์๋ ํ์ด์ฌ ํ๋ก์ ํธ๊ฐ pyproject.toml
์ ์ด๋ป๊ฒ ์ฌ์ฉํ๊ณ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- Poetry: ์์ฒด ํจํค์ง ๊ด๋ฆฌ๋ฅผ ์ํด
pyproject.toml
์ ์ฌ์ฉํฉ๋๋ค. - Black: ํํ ์๋ ์ฝ๋ ํฌ๋งทํฐ์ธ Black ๋ํ
pyproject.toml
์ ํ์ฉํฉ๋๋ค. - FastAPI: ํ์ด์ฌ์ผ๋ก API๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ํ๋์ ์ด๊ณ ๋น ๋ฅธ(๊ณ ์ฑ๋ฅ) ์น ํ๋ ์์ํฌ๋ ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ฒฐ๋ก
pyproject.toml
์ ํ์ด์ฌ ํจํค์ง ๊ด๋ฆฌ์ ํ๋์ ์ธ ํ์ค์ ๋ํํ๋ฉฐ, ํจํค์ง ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ์ ์ธ์ ์ด๊ณ ์์ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. setup.py
๊ฐ ์ฐ๋ฆฌ์๊ฒ ์ค๋ซ๋์ ์ข์ ์๋น์ค๋ฅผ ์ ๊ณตํ์ง๋ง, pyproject.toml
๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๊ฒ์ ์ฅ๊ธฐ์ ์ธ ์ ์ง๋ณด์์ฑ, ์ผ๊ด์ฑ ๋ฐ ์ต์ ๋๊ตฌ์์ ํตํฉ์ ์ํ ๊ฐ์น ์๋ ํฌ์์
๋๋ค. ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฑํํ๊ณ ์ฌ๋ฐ๋ฅธ ๋๊ตฌ๋ฅผ ํ์ฉํจ์ผ๋ก์จ ํ์ด์ฌ ํจํค์ง ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ํํ๊ณ ๊ณ ํ์ง์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจํค์ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.