직접 만든 파이썬 패키지가 있다는 전제 하에 포스팅을 작성합니다.
직접 파이썬 패키지를 만들려면, 다음 포스팅을 참고하세요. 파이썬 패키지 만들기
사전 준비
사전 준비
실행 위치 참고
- 🤖 : 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 명령어로 “직접 추가된” 패키지를 확인할 수 있다.
- 🧑💻🤖
devpi list <패키지이름> 으로 패키지에 대한 상세한 내용을 확인할 수 있다.
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
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
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
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
2
| # 출력 없음
# 또는, bases 가 지정된 경우 출력이 나올 수도 있으나 원하는대로 제거된 건 맞음
|
Reference
devpi-stable Documentation - devpi_packages
devpi-stable Documentation - devpi_misc
Comments