직접 만든 파이썬 패키지가 있다는 전제 하에 포스팅을 작성합니다.
직접 파이썬 패키지를 만들려면, 다음 포스팅을 참고하세요. 파이썬 패키지 만들기

사전 준비

사전 준비

실행 위치 참고

  • 🤖 : devpi 가 설치된 서버
  • 🧑‍💻 : 사용자. devpi 로 패키지 설치 요청을 보내는 클라이언트

devpi 에 릴리즈(패키지) 업로드

릴리즈

  • 특정 프로젝트의 배포들 중 특정 버전 (프로젝트 : 하나의 Python 패키지)
  • 즉, 특정 버전의 파이썬 패키지(라이브러리) 를 가리킨다.

릴리즈 준비

  • 🧑‍💻 아래와 같이 릴리즈가 준비되어있다고 전제한다.
  • 릴리즈를 만드는 방법은 다음 포스팅 참고 : 파이썬 패키지 만들기
1
2
3
4
5
my-package
├─ (다른 폴더 생략)
└─ dist/
    ├── my_package-0.1.0-py3-none-any.whl
    └── my_package-0.1.0.tar.gz

릴리즈 파일 업로드 (빌드+업로드)

  • 🧑‍💻 사용할 인덱스를 지정한다.
1
devpi use http://{HOST}:{PORT}/{user}/{index}


  • 🧑‍💻 사용할 인덱스에 유효한 권한을 가진 계정으로 로그인한다.
1
devpi login {user_name} --password={password}


  • 🧑‍💻 devpi upload 명령어를 통해 릴리즈를 업로드한다.
1
2
cd my-package
devpi upload
1
2
3
4
5
6
7
8
# 출력
using workdir ...
pre-build: cleaning dist
--> .$ .../bin/python3.13 -m build 
built: dist/my_package-0.1.0-py3-none-any.whl 3kb
built: dist/my_package-0.1.0.tar.gz 2kb
file_upload of my_package-0.1.0-py3-none-any.whl to http://{HOST}:{PORT}/{user}/{index}/
file_upload of my_package-0.1.0.tar.gz to http://{HOST}:{PORT}/{user}/{index}/


  • 🧑‍💻 또는 이미 빌드된 특정 wheel 파일을 직접 업로드할 수도 있다.
    이는, 외부에서 wheel 파일을 가져와 폐쇄망 내부의 devpi-server에 업로드할 때 유용하다.
1
2
cd my-package
devpi upload dist/*.whl
1
2
# 출력
file_upload of my_package-0.1.0-py3-none-any.whl to http://{HOST}:{PORT}/{user}/{index}


업로드 확인

  • 🧑‍💻🤖 devpi list 명령어로 “직접 추가된” 패키지를 확인할 수 있다.
1
devpi list
1
2
# 출력
my-package


  • 🧑‍💻🤖 devpi list <패키지이름> 으로 패키지에 대한 상세한 내용을 확인할 수 있다.
1
devpi list my-package
1
2
3
# 출력
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.1.0-py3-none-any.whl
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.1.0.tar.gz


  • 🧑‍💻🤖 새로운 버전이 업로드되었다면, 버전별로도 확인 가능하다.
1
devpi list my-package
1
2
3
4
5
# 출력
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.2.0-py3-none-any.whl
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.2.0.tar.gz
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.1.0-py3-none-any.whl
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.1.0.tar.gz


(참고) 릴리즈 업로드시 파일 형식 지정

  • 🧑‍💻 업로드할 릴리즈 파일 형식을 지정할 수 있다.
  • 예를 들어 아래와 같이 지정하면, wheel 파일, 소스 배포 파일이 생성되어 인덱스에 업로드된다.
1
devpi upload --formats=bdist_wheel,sdist.tgz


업로드된 릴리즈를 설치, 사용해보기

테스트 가상환경 생성 및 활성화

  • 🧑‍💻 업로드된 릴리즈를 설치하기 위해, 격리된 가상환경을 생성하고, 생성된 가상환경을 활성화한다.
1
2
python -m venv release-test
source release-test/bin/activate


패키지 설치

  • 🧑‍💻 devpi-server 를 통해 패키지를 설치한다.
1
2
pip install --index-url http://{HOST}:{PORT}/{user}/{index} \
    my-package
1
2
3
4
5
# 출력
Looking in indexes: http://l{HOST}:{PORT}/{user}/{index}
Collecting my-package
...
Successfully installed annotated-types-0.7.0 my-package-0.2.0 ...


import 및 사용 테스트

  • 🧑‍💻 설치한 패키지를 정상적으로 import 하고 사용할 수 있는지 테스트한다.
1
2
# 파이썬 실행 (release-test 가상환경)
python
1
2
3
4
5
6
7
8
# 파이썬 스크립트 내
from calc import Operands, add, sub, mul, div
a = 10
b = 2
print(add(Operands(a=a, b=b)))
print(sub(Operands(a=a, b=b)))
print(mul(Operands(a=a, b=b)))
print(div(Operands(a=a, b=b)))
1
2
3
4
5
# 출력
12
8
20
5.0


릴리즈(또는 프로젝트) 제거

목적

  • 실수로 업로드 된 릴리즈 제거
  • 보안적 문제나 심각한 결함이 있는 릴리즈 제거

전제 조건

  • 휘발성(volatile=True) 인 인덱스에서만 릴리즈 제거가 가능

준비

  • 🧑‍💻🤖 제거할 릴리즈가 위치한 인덱스를 지정한다.
1
devpi use http://{HOST}:{PORT}/{user}/{index}


  • 🧑‍💻🤖 릴리즈를 제거할 수 있는 유효한 권한을 가진 계정으로 로그인한다.
1
devpi login {user_name} --password={password}


릴리즈 제거

  • 🧑‍💻🤖 릴리즈를 확인해본다.
1
devpi list my-package
1
2
3
4
5
6
7
# 출력 (총 3개의 버전이 존재)
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.3.0-py3-none-any.whl
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.3.0.tar.gz
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.2.0-py3-none-any.whl
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.2.0.tar.gz
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.1.0-py3-none-any.whl
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.1.0.tar.gz


  • 🧑‍💻🤖 devpi remove 명령어를 통해 릴리즈를 제거한다.
1
devpi remove -y my-package==0.2.0
1
2
3
4
5
6
7
8
# 출력
About to remove the following releases and distributions
version: 0.2.0
  - http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.2.0-py3-none-any.whl
  - http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.2.0.tar.gz
Are you sure (yes/no)? yes (autoset from -y option)
deleting release 0.2.0 of my-package


  • 🧑‍💻🤖 결과 확인
1
devpi list my-package
1
2
3
4
5
# 출력 -- 0.2.0 버전이 제거됨
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.3.0-py3-none-any.whl
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.3.0.tar.gz
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.1.0-py3-none-any.whl
http://{HOST}:{PORT}/{user}/{index}/+f/.../my_package-0.1.0.tar.gz


프로젝트 제거

  • 🧑‍💻🤖 동일하게 devpi remove 명령어를 사용하되, 버전을 지정하지 않으면 프로젝트 전체가 제거된다.
1
devpi remove my-package


  • 결과 확인
1
devpi list my-package
1
2
# 출력 없음
# 또는, bases 가 지정된 경우 출력이 나올 수도 있으나 원하는대로 제거된 건 맞음


Reference

devpi-stable Documentation - devpi_packages
devpi-stable Documentation - devpi_misc

Comments