Created
October 27, 2020 02:18
-
-
Save choiseoungho/ea98cf86c766eb41b5df6c6c375dda4b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Python 패키지 만드는 방법 | |
- LICENSE 작성법 | |
MIT 에서 shareware를 위해 만든 라이센스 규약, 핵심은 수정 및 배포가 자유로우며, 상업적 이용도 가능, 단 출처 표시 필요 | |
춰 | |
추가적인 라이센스 : GPL, BSD, MIT, Apache 상세한 내용은 | |
https://www.slideshare.net/ifkakao/ss-113145564 | |
https://selfish-developer.com/entry/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EB%9D%BC%EC%9D%B4%EC%84%BC%EC%8A%A4-%EC%A0%95%EB%A6%AC | |
- Wheel | |
wheel은 build package, 일반적인 source distribution 보다 더 빨리 인스톨 됨 | |
- PyPI 계정 | |
여기서 생성 : https://pypi.org/ | |
- twine | |
Twine is a utility for publishing Python packages on PyPI | |
- cfg파일 : config file | |
pip 란, python package index(pypi)라는 저장소에서 제공되는 파이썬 패키지 소프트웨어를 설치 및 관리하는 패키지 관리 시스템 | |
우리가 그 동안 pip를 통해서 설치한 다양한 라이브러리(패키지)들은 모두 Pypi라는 곳에 저장되어 이씅며 실제로 아래 Pypi사이트에서 검색을 통해 확인 | |
필요한 패키지 설치 | |
conda install -c anaconda setuptools | |
conda install -c conda-forge twine | |
search 를 통해 자신이 등록하고자 하는 패키지의 이름이 있는지 확ㅇ니 | |
패키지 이름은 추후 사용해야 할 곳이 많으니 자신이 쓰고자 하는 패키지의 이름이 중복되지 않는지를 먼저 확인 후 이후 과정을 진행하시는 것이 편리 | |
만약, 이름이 중복된다면 다양한 것들을 수정해야 할 수 있음 | |
패키지 등록시 대시가 아닌 언더바를 사용해야 함 | |
PYPI에 패키지를 등록하려면 별도의 승인과정 같은 것은 없지만 일정한 템플릿을 구성해야 함 | |
패키지를 등록할 폴더를 만듬. 패키지를 등록할 폴더는 패키지 이름과 동일 | |
setup.py 파일 만들기 | |
- 입력한 패키지 정보를 기바능로 wheel 파일을 만드는 setup.py 를 작성 | |
- 패키지를 만든 저장소는 프로젝트 최상위에 setup.py를 만들고 내용을 채움 | |
패키지 빌드하기 | |
- python setup.py 파일 명 | |
wheel 패키지 설치파일이 ./dist/경로에 들어있게 됨 | |
Setup 파일 설정 | |
name: 프로젝트 이름 | |
version: 배포 버젼 | |
description: 프로젝트 설명 | |
author: 프로젝트 저자 | |
author_email: 저자의 이메일 | |
url: 프로젝트 사이트 주소. 오픈소스의 경우 대부분 깃헙 주소를 사용한다. | |
download_url: 해당 라이브러리의 실행 바이너리 다운 받는 주소. 마찬가지로 오픈소소의 경우 대부분 깃헙의 archive주소를 설정한다. | |
install_requires: 해당 라이브러리를 사용하기 위해서 인스톨 되야하는 dependency들. 해당 라이브러리를 pip을 통해 인스톨 할때 이곳에 나열된 라이브러리들을 같이 인스톨 한다. | |
packages: 빌드에 포함들 package들. 한 프로젝트에 여러 package가 있을수도 있고 또한 빌드에서 제외할 package들 (예를 들어 test 코드나 doc 등등)이 있을수 있음으로 그러한 설정을 한다. 대부분 setuptools.find_packages 함수를 사용하여 자동으로 포함될 package들을 찾게 하고 대신에 제외되어야 할 package들을 exclude 인자를 통해 설정해준다. | |
keywords: 해당 프로젝트 관련 키워드. | |
python_requires: 서포트 하는 파이썬 버젼 설정. | |
정확히 Python 3.6 에서만 실행된다면 : =3.6 | |
Python 3 버젼 이상에서는 다 실행된다면 : >=3 | |
package_data: 기본적으로 setup은 파이썬 파일만 빌드에 포함시킨다. 파이썬 파일 이 아닌 외부 파일을 포함시키기 위해선 포함시키고자 하는 파일들을 이 옵션에 명시해 줘야 포함된다. 그렇지 않으면 포함이 되지 않는다. 이 옵션 설정을 해주지 않거나 잘못 설정해주어서 문제가 생기는 경우가 꽤 있으니 주의하자. | |
zip_safe: 위의 package_data 설정을 하였으면 zip_safe 설정도 해주어야 하며 False로 설정해주어야 한다. | |
classifiers: PYPI에 등록될 메타 데이터 설정이다. 예를 들어 서포트 하는 python 버젼 정보를 명시할수 있다. 하지만 이건 PYPI에 등록될 메타 데이터일 뿐이고 실제 빌드에는 영향을 주지 않는다. 이점 주의하자. | |
from setuptools import setup, find_packages | |
setup( | |
# 배포할 패키지의 이름을 적어줍니다. setup.py파일을 가지는 폴더 이름과 동일하게 합니다. | |
name = 'doorbw_test', | |
# 배포할 패키지의 버전을 적어줍니다. 첫 등록이므로 0.1 또는 0.0.1을 사용합니다. | |
version = '0.1', | |
# 배포할 패키지에 대한 설명을 작성합니다. | |
description = 'for explain about pypi deploy', | |
# 배포하는 사람의 이름을 작성합니다. | |
author = 'beomwoo.moon', | |
# 배포하는 사람의 메일주소를 작성합니다. | |
author_email = '[email protected]', | |
# 배포하는 패키지의 url을 적어줍니다. 보통 github 링크를 적습니다. | |
url = 'https://github.com/doorBW/pypi_deploy_test', | |
# 배포하는 패키지의 다운로드 url을 적어줍니다. | |
download_url = 'https://github.com/doorBW/pypi_deploy_test/archive/master.zip', | |
# 해당 패키지를 사용하기 위해 필요한 패키지를 적어줍니다. ex. install_requires= ['numpy', 'django'] | |
# 여기에 적어준 패키지는 현재 패키지를 install할때 함께 install됩니다. | |
install_requires = [], | |
# 등록하고자 하는 패키지를 적는 곳입니다. | |
# 우리는 find_packages 라이브러리를 이용하기 때문에 아래와 같이 적어줍니다. | |
# 만약 제외하고자 하는 파일이 있다면 exclude에 적어줍니다. | |
packages = find_packages(exclude = []), | |
# 패키지의 키워드를 적습니다. | |
keywords = ['pypi deploy'], | |
# 해당 패키지를 사용하기 위해 필요한 파이썬 버전을 적습니다. | |
python_requires = '>=3', | |
# 파이썬 파일이 아닌 다른 파일을 포함시키고 싶다면 package_data에 포함시켜야 합니다. | |
package_data = {}, | |
# 위의 package_data에 대한 설정을 하였다면 zip_safe설정도 해주어야 합니다. | |
zip_safe = False, | |
# PyPI에 등록될 메타 데이터를 설정합니다. | |
# 이는 단순히 PyPI에 등록되는 메타 데이터일 뿐이고, 실제 빌드에는 영향을 주지 않습니다. | |
classifiers = [ | |
'Programming Language :: Python :: 3', | |
'Programming Language :: Python :: 3.2', | |
'Programming Language :: Python :: 3.3', | |
'Programming Language :: Python :: 3.4', | |
'Programming Language :: Python :: 3.5', | |
'Programming Language :: Python :: 3.6', | |
'Programming Language :: Python :: 3.7', | |
], | |
) | |
setup.py를 저장소와 연동 | |
패키지 버전 연동 | |
- setup.py 와 저장소를 서로 연동하면 매 릴리즈때마다 setup()의 내용을 수고롭게 수정할 필요 없음 | |
부속 파일 옮기기 | |
- 같이 업로드할 부속 파일들을 수도응로 옴겨야 함 | |
- build, dist, 패지지명.egg-info 세가지 폴더가 생성 | |
- 부속 폴더인 lib 폴더와 resource 폴더를 복사 또는 잘라내기 함 | |
- 파일명.PY 과 동일한 디렉토리 만들기 | |
- 디렉토리에 생성된 lib, resource를 잘라내어 붙여넣기 | |
- 재빌드 하기, 왜: 방금 두 개의 폴더와 파일들을 옮겼기 때문에 패키지에 연결되게 해야 함 | |
본 파일인 py와 같은 경로 __init__.py 파일을 만들기 | |
setup.py 파일과 동일한 경로에 README.md 파일을 만들어 패키지에 대한 간략한 설명 | |
동일한 경로에 setup.cfg파일을 작성 | |
github 등록 전 .gitignore파일을 생성 | |
# vscode | |
.vscode/ | |
# Byte-compiled / optimized / DLL files | |
__pycache__/ | |
*.py[cod] | |
*$py.class | |
# C extensions | |
*.so | |
# Distribution / packaging | |
.Python | |
build/ | |
develop-eggs/ | |
dist/ | |
downloads/ | |
eggs/ | |
.eggs/ | |
lib/ | |
lib64/ | |
parts/ | |
sdist/ | |
var/ | |
wheels/ | |
pip-wheel-metadata/ | |
share/python-wheels/ | |
*.egg-info/ | |
.installed.cfg | |
*.egg | |
MANIFEST | |
# PyInstaller | |
# Usually these files are written by a python script from a template | |
# before PyInstaller builds the exe, so as to inject date/other infos into it. | |
*.manifest | |
*.spec | |
# Installer logs | |
pip-log.txt | |
pip-delete-this-directory.txt | |
# Unit test / coverage reports | |
htmlcov/ | |
.tox/ | |
.nox/ | |
.coverage | |
.coverage.* | |
.cache | |
nosetests.xml | |
coverage.xml | |
*.cover | |
.hypothesis/ | |
.pytest_cache/ | |
# Translations | |
*.mo | |
*.pot | |
# Django stuff: | |
*.log | |
local_settings.py | |
db.sqlite3 | |
# Flask stuff: | |
instance/ | |
.webassets-cache | |
# Scrapy stuff: | |
.scrapy | |
# Sphinx documentation | |
docs/_build/ | |
# PyBuilder | |
target/ | |
# Jupyter Notebook | |
.ipynb_checkpoints | |
# IPython | |
profile_default/ | |
ipython_config.py | |
# pyenv | |
.python-version | |
# celery beat schedule file | |
celerybeat-schedule | |
# SageMath parsed files | |
*.sage.py | |
# Environments | |
.env | |
.venv | |
env/ | |
venv/ | |
ENV/ | |
env.bak/ | |
venv.bak/ | |
# Spyder project settings | |
.spyderproject | |
.spyproject | |
# Rope project settings | |
.ropeproject | |
# mkdocs documentation | |
/site | |
# mypy | |
.mypy_cache/ | |
.dmypy.json | |
dmypy.json | |
# Pyre type checker | |
.pyre/ | |
해당 폴더를 앞에서 만든 github repostory에 등록 시키기 | |
디렉토리 상태는 아래의 트리구조와 같음 | |
패키지명 | |
- 패키지명 | |
- doorbw_test | |
- __init__.py | |
- test.py | |
- .gitignore | |
- README.md | |
- setup.cfg | |
- setup.py | |
필요한 라이브러리 설치 및 빌드 | |
setup.py 파일에서 사용한 setuptools | |
빌드시에 사용할 wheel | |
배포시에 사용할 twine | |
pip install setuptools wheel twine | |
python setup.py 패키지 이름 | |
폴더에 build,dist, <자신의 패키지이름>.egg-info 이름의 3개의 폴더가 생성 | |
이 중에서 dist 폴더 내부에 있는 파일이름을 확장자까지 모두 복사 | |
등록하기 (PyPi 에 업로드 하기) | |
dist 폴더 내부에 있는 확장자를 포함한 파일 이름을 복사 | |
#dist 폴더 아래에 있는 파일명이 doorbw_test-0.1-py3-none-any.whl | |
twine upload dist/doorbw_test-0.1-py3-none-any.whl | |
Reference | |
https://doorbw.tistory.com/225 | |
https://vlee.kr/2928 | |
http://blog.naver.com/PostView.nhn?blogId=lingua&logNo=221537606241&parentCategoryNo=43&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView | |
https://rampart81.github.io/post/python_package_publish/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment