Python으로 개발하다보면 setup.py를 작성할 일이 많습니다.
아무래도 Falsede.js의 package.json
, Rust의 Cargo.toml
같이 의존성을 관리할 수 있는데다, 만든 프로그램을 패키지로 만들때도 필요한 물건이다보니 중요성이 높습니다.
의존성 관리는 requirements.txt
같은 것으로도 충분하다고 생각하실 수 있겠지만, 이쪽이 더 깔끔하다고 생각합니다.
그래서 이번에 PyPI에 패키지를 하나 올리는 김에 사용되는 인자가 무엇이 있는지 알아보았습니다. 아래에 공식 자료들 중 제가 아는 선에서 자주 쓰이는 것들을 정리하였습니다.
name.
- 필수 필드: True
- 필드 타입:
str
- 출처: distutils
- 공식 설명: name of the package
패키지의 이름을 정할 때 씁니다. 보통의 경우에는 상관 없을 수도 있지만, pypi에 올리는 경우에는 이름이 겹치는 것은 없는지 주의해야 합니다.
version.
- 필수 필드: True
- 필드 타입:
str
- 출처: distutils
- 공식 설명: version of this release
패키지의 현재 버전을 적으면 됩니다.
Python쪽에선 major.miFalser[.patch[.sub]]
형태로 작성할 것을 추천하고 있습니다.
Python 내부적으로는 버전 표현에 tuple
을 쓰는 것과는 대조적이므로 주의해야 합니다.
author.
- 필수 필드: Half
- 필드 타입:
str
- 출처: distutils
- 공식 설명: package author’s name
패키지 작성자의 이름을 적으면 됩니다.
아래 나올 maintainer
와 author
중의 하나는 반드시 작성되어야 합니다.
author_email.
- 필수 필드: Half
- 필드 타입:
str
- 출처: distutils
- 공식 설명: email address of the package author
패키지 작성자의 메일 주소를 적으면 됩니다.
email 주소이긴 하지만 email.headerregistry.Address
같은 것을 요구하는 것은 아니므로 그냥 문자열로 적으면 됩니다.
아래 나올 maintainer_email
과 author_email
중의 하나는 반드시 작성되어야 합니다.
또 하나 주의할 점이라면 이 메일을 수집해서 스팸을 보낼 수도 있으므로 적당히 가공을 하는 편이 좋습니다.
예를 들면 아래처럼 할 수 있습니다.
setup(
...,
author_email='item4_hun' '@' 'hotmail.com',
...,
)
사실 조금만 더 열심히 파싱하면 들통날 방법이지만, 적어도 직통으로 스팸이 오는 것은 막아줍니다.
maintainer.
- 필수 필드: Half
- 필드 타입:
str
- 출처: distutils
- 공식 설명: package maintainer’s name
패키지 관리자의 이름을 적으면 됩니다.
위에 나온 author
와 maintainer
중 하나는 반드시 작성되어야 합니다.
author_email.
- 필수 필드: Half
- 필드 타입:
str
- 출처: distutils
- 공식 설명: email address of the package maintainer
패키지 관리자의 메일 주소를 적으면 됩니다.
email 주소이긴 하지만 email.headerregistry.Address
같은 것을 요구하는 것은 아니므로 그냥 문자열로 적으면 됩니다.
위에 나온 author_email
과 maintainer_email
중의 하나는 반드시 작성되어야 합니다.
url.
- 필수 필드: True
- 필드 타입:
str
- 출처: distutils
- 공식 설명: home page for the package
패키지의 웹 사이트를 적으면 됩니다. 별도의 웹 사이트가 있는 경우엔 웹 사이트를 적으면 되고, 적당히 GitHub 등의 저장소 주소를 적어도 됩니다.
description.
- 필수 필드: False
- 필드 타입:
str
- 출처: distutils
- 공식 설명: short, summary description of the package
패키지에 대한 짧은 설명입니다. GitHub으로 예를 들자면 저장소 소개를 짧게 적는 칸 같은 느낌입니다. 너무 길지 않게 적는 것이 좋습니다.
long_description.
- 필수 필드: False
- 필드 타입:
bytes
- 출처: distutils
- 공식 설명: longer description of the package
PyPI에서 패키지 설명 본문으로 사용됩니다. 보통 README로 작성된 것을 읽어서 불러들여서 씁니다. 주의할 점은, 이 부분은 Restructured Text로 작성되어야만 합니다. markdown 등의 포맷은 전혀 지원되지 않으니 주의를 요합니다.
download_url.
- 필수 필드: False
- 필드 타입:
str
- 출처: distutils
- 공식 설명: location where the package may be downloaded
패키지를 어디서 다운받을 수 있는지를 적습니다. 실제 다운로드에 쓰이는 것은 아니고, PyPI 사이트에 출력하는 용도로 쓰입니다. 보통 저장소에서 제공하는 tarball 등을 다운로드 대상으로 삼습니다.
classifiers.
- 필수 필드: False
- 필드 타입:
list
ofstr
- 출처: distutils
- 공식 설명: a list of classifiers
이 패키지가 어느 분류에 속하는지 설명하는 용도로 쓰입니다. 넣을 수 있는 속성은 아무렇게나 넣어도 동작은 하는 것 같지만, 대체적으로 이미 정형화되어있는 단어들을 쓰는 편입니다. PyPI의 공식 목록을 참고하시면 됩니다. PyPI 사이트에서 태깅 형태로 사용됩니다.
license.
- 필수 필드: False
- 필드 타입:
str
- 출처: distutils
- 공식 설명: license for the package
패키지의 저작권을 적는 필드입니다.
본디 용도는 classifiers
만으로 설명이 안되는 저작권을 설명하는 용도입니다.
packages.
- 필수 필드: True
- 필드 타입:
list
- 출처: distutils
- 공식 설명: 없음
해당 패키지에 포함될 내용을 기입하는 용도로 쓰입니다.
보통 직접 작성 안하고 setuptools.find_packages
함수를 사용합니다.
zip_safe.
- 필수 필드: False
- 필드 타입:
bool
- 출처: setuptools
- 공식 설명: 공식 자료 참조
zip 파일로 만들어서 실행해도 패키지가 정상적으로 동작하는지에 대한 설정입니다.
install_requires.
- 필수 필드: False
- 필드 타입:
str
orlist
- 출처: setuptools
- 공식 설명: 공식 자료 참조
패키지를 사용하기 위해 필요한 의존성 목록입니다.
의존성 목록은 문자열로 줘도 알아서 잘 인식하지만 보통 list
나 set
형을 사용해서 표현합니다.
setup(
...,
install_requires={
'click >= 5.1',
},
...,
)
entry_points.
- 필수 필드: False
- 필드 타입:
dict
- 출처: setuptools
- 공식 설명: 공식 자료 참조
해당 값을 지정하면 Command line 명령어를 만들어줍니다. 실제로 어떻게 사용되는지 예제를 들자면 다음과 같습니다.
setup(
...,
entry_points={
'console_scripts': [
'ugoira=ugoira.cli:ugoira',
],
},
...,
)
이렇게 지정하면 터미널에서 ugoira
라는 명령어를 실행하면 내부적으로 ugoira.cli
의 ugoira
함수가 실행됩니다.
extras_require.
- 필수 필드: False
- 필드 타입:
dict
- 출처: setuptools
- 공식 설명: 공식 자료 참조
install_requires
와 작성 요령이 비슷합니다.
setup(
...,
extras_require={
'tests': {'pytest >= 2.8.3',},
'docs': {'Sphinx >= 1.3.1',},
},
...,
)
이런 식으로 지정해놓으면 나중에 추가 의존성들을 설치할 때 용이합니다.
가령 위에서 지정한 docs
의 의존성들을 설치하려면 다음과 같이 합니다.
pip install -e .[docs]
tests_require.
- 필수 필드: False
- 필드 타입:
str
orlist
- 출처: setuptools
- 공식 설명: 공식 자료 참조
install_requires
와 작성 요령이 아예 같습니다.
다만 여기에 지정된 의존성은 테스트용으로 지정됩니다.
사실 이 외에도 더 많은 속성들이 존재합니다만, 이 정도만 있어도 일반적인 패키지 작성엔 부족함이 없다고 생각합니다. 이 이상의 기능으로 패키지 구성이 필요한 경우라면 setuptools 공식 문서를 참고하시면 됩니다.1
각주.
-
사실 제가 이것 이상으로 복잡한 무언가를 구성해보지 못했습니다. 원래 위치로