Open Source 개발

[오픈소스 개발기] 내가 만든 오픈소스 pip 등록하기

콜레오네 2023. 7. 10. 23:23

내가 만든 프로젝트를 오픈소스로 공개하기로 했다.

 

https://github.com/AutoPipo/pypipo

 

GitHub - AutoPipo/pypipo: Python Library based on EasyPipo

Python Library based on EasyPipo. Contribute to AutoPipo/pypipo development by creating an account on GitHub.

github.com

 

오픈소스 공개 과정에서 고민의 흔적을 남겨보려 한다.


오픈소스를 어느정도 만들었다면, 배포 역시 중요하다.

파이썬 유저들은 모두가 pip를 통해 무언가를 시작한 기억이 있을 것이다.

내가 만든 오픈소스를 남들이 쉽게 받아 사용할 수 있게 pip에 등록하는 방법을 따라해보자

1. 회원가입

https://pypi.org/

 

PyPI · The Python Package Index

The Python Package Index (PyPI) is a repository of software for the Python programming language.

pypi.org

[PyPI · The Python Package Index

The Python Package Index (PyPI) is a repository of software for the Python programming language.

pypi.org](https://pypi.org/)

pip를 등록할 수 있는 사이트입니다.

회원가입은 매우 쉬우니, 계정을 하나 만들어 봅시다.

혹시 테스트가 필요하시다면

https://test.pypi.org/

 

TestPyPI · The Python Package Index

The Python Package Index (PyPI) is a repository of software for the Python programming language.

test.pypi.org

[TestPyPI · The Python Package Index

The Python Package Index (PyPI) is a repository of software for the Python programming language.

test.pypi.org](https://test.pypi.org/)

여기에도 똑같이 가입해봅시다.

 

이 홈페이지를 활용하는 방법은 맨 아래 나옵니다.

 

2. 프로젝트 구조 설정 및 추가 파일 작성

  • __init__.py
  • 구현된 라이브러리 코드
  • LICENSE: 라이센스
    • MIT License와 같이 라이선스 등록이 필요합니다.
    • 라이선스 등록은 github repository 내에서 설정 가능합니다.
  • MANIFEST.in: include 관리하는 부분
    • 패키지에 포함되어야할 내용을 담아야 한다.
    • 잘 모르겠으면 아래 그대로 따려쳐도 된다.
include MANIFEST.in README.md LICENSE setup.py setup.cfg
  • README.md
    • Github Repository 생성하면 만들어지는 마크다운 파일이다.
    • 오픈소스 혹은 라이브러리에 대한 설명을 가독성 좋게 핵심만 적으면 된다.
  • requirements.txt: 프로젝트 실행을 위한 필요 라이브러리 목록
    • 라이브러리가 잘 동작하도록 필수로 설치해야할 다른 라이브러리의 목록을 적어주어야 한다.
    • 일반 텍스트 파일이며 아래와 같은 예시로 작성해주면 된다.
    • 패키지명>=버전
numpy >= 1.24.3
opencv-python >= 4.7.0
scipy >= 1.10.1
click >= 8.1.3
  • setup.cfg
    • setup.py에 대한 설정을 적어주면 된다.
[metadata]
description-file = README.md
  • setup.py
    • 오픈소스에 대한 설정이 들어간 파일입니다.
    • name : 프로젝트명
    • version : 1.0.12 와 같이 점으로 구분된 3자리 숫자를 적어줍니다. 작은 변경일수록 뒷 자리를, 큰 변경일수록 앞 자리를 높여서 버전 정보를 수정해주어야 합니다.
    • description : 프로젝트 설명을 적어줍니다.
    • author : 프로젝트 개발자 이름을 적어줍니다.
    • url : github 주소 혹은 홈페이지 주소를 적어줍니다.
    • install_requires : 프로젝트 실행을 위해 사전에 설치되어야하는 파이썬 패키지를 적어줍니다. requirements.txt에 적으신 것과 동일하게 하시면 됩니다.
    • keywords : 프로젝트 검색 시 노출될 키워드를 설정해줍니다.
import os
from setuptools import setup, find_packages

here = os.path.abspath(os.path.dirname(__file__))
about = {}
with open(os.path.join(here, 'pypipo', '__version__.py'), 'r') as f:
    exec(f.read(), about)

with open('README.md', 'r', encoding='utf8') as f:
    readme = f.read()

# requirements.txt 내용과 동일
requires = [
    'numpy >= 1.24.3',
    'opencv-python >= 4.7.0',
    'multiprocessing-generator >= 0.3',
    'tqdm >= 4.65.0',
    'scipy >= 1.10.1',
    'click >= 8.1.3',
]

def setup_package():
    # setup 정보가 담긴 dict 설정
    ## __version__.py 파일을 생성하여 불러왔다.
    ### __title__ = 'pypipo' 이런식으로 변수에 저장해두었다.
    metadata = dict(name=about['__title__'],
                    version=about['__version__'],
                    description=about['__description__'],
                    long_description=readme,
                    long_description_content_type="text/markdown",
                    url=about['__url__'],
                    author=about['__author__'],
                    author_email=about['__author_email__'],
                    license=about['__license__'],
                    keywords=['pipo painting', 'image painting', 'image processing', 'computer vision'],
                    packages=find_packages(exclude=('sample',)),
                    install_requires=requires,
                    entry_points={
                        'console_scripts': [
                            'camelot = camelot.cli:cli',
                        ],
                    },
                    classifiers = [
                        'Programming Language :: Python :: 3.6',
                        'Programming Language :: Python :: 3.7',],
                    )

    try:
        from setuptools import setup
    except ImportError:
        from distutils.core import setup

    setup(**metadata)

if __name__ == '__main__':
    setup_package()  # setup 정보 불러오기

위와 같은 파일이 필요합니다.

 

pip에 등록할 파일을 생성하자

이제 라이브러리에 필요한 파일들을 모두 생성했다.

그렇다면, 프로젝트가 있는 폴더에서 cmd를 열어주어

다음과 같은 명령어를 복붙해보자

python -m pip install --user --upgrade setuptools wheel
python -m pip install --user --upgrade twine
python setup.py sdist bdist_wheel

마지막까지 입력하면 dist 폴더가 생성될 것이고

dist 폴더 안에는 tar 파일과 whl 파일이 생성될 것이다.

그럼 준비는 끝났다.

 

PyPI 등록하기

python -m twine upload --repository-url https://upload.pypi.org/legacy/ dist/*

이 명령어만 쳐주면 끝이다.

맨 처음에 회원가입한 아이디 비밀번호를 치면, 금방 끝이 난다.

 

아래는 예시 cmd 화면이다.

>python -m twine upload --repository-url https://upload.pypi.org/legacy/ dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Enter your username: myid
Enter your password:
Uploading pypipo-0.0.8-py3-none-any.whl
100% ---------------------------------------- 21.8/21.8 kB • 00:00 • ?
Uploading pypipo-0.0.8.tar.gz
100% ---------------------------------------- 17.5/17.5 kB • 00:00 • ?

View at:
https://pypi.org/project/pypipo/0.0.8/

마지막에 View at 아래 URL로 접속하면 된다.

 

짜잔~

 

드디어 pip install로 어디서나 내 라이브러리를 활용할 수 있게 되었다.

 

주의할점

  • 실수로 잘못 올리는 것을 방지하려면, test.pypi로 변경하여 올려보자
  • 만약 올려놓고 이후 수정한다면, 무조건 버전 업그레이드 해주어야 한다.
  • 같은 버전은 절대 등록되지 않는다. 무조건 버전 숫자 하나라도 바꾸어서 등록하자.
  • 버전 업그레이드 이후, dist에 있는 이전 버전의 tar, whl 파일은 삭제해야 새로운 버전이 등록된다.

 

그럼 화이팅

 

반응형