언어 Language/파이썬 Python

Q. 파이썬 비공개 패키지를 만들고 다른 프로젝트에서 쓰는 방법은?

Tap to restart 2024. 7. 13. 23:00

언제 비공개 패키지가 필요한가?

팀 내에서 여러 저장소에서 사용하는 공통 모듈들이 있다. 공통 모듈을 한 저장소에 모아두고 오픈 소스로 공개하면 쉽게 쓸 수 있다. 하지만 보안상 이유로 공개할 수 없다면 비공개 패키지를 사용하게 된다.
 

1. Github에서 비공개 저장소 만들기

비공개 저장소를 하나 만들자. private-package로 하나 만들었다. 이름은 원하는대로 만들면 된다.

 
실습을 위해서 아주 간단한 더하기 메소드만 갖고 있는 Calculator 클래스를 하나 추가하자.

 

class Calculator:
    def sum(self, a, b):
        return a + b

 
pyproject.toml은 아래처럼 간단히 입력하자. name은 패키지명인 calculator와 동일하게 적어야 한다. version은 숫자.숫자.숫자만 가능하고 원하는대로 입력하면 된다.
(참고: Writing your pyproject.toml)

[project]
name = "calculator"
version = "0.1.0"
license = "MIT"
requires-python = ">=3.6"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

 
버전 0.1.0 숫자는 패키지를 설치했을 때 나타난다. calculator-0.1.0

 
그리고 태그로 v0.1.0을 추가하자. 태그명은 원하는대로 해도 된다. 찾아보면 각 프로젝트마다 다양하게 태그를 사용하고 있다. cpython이 v0.0.0 형태를 사용하고 있다.

 
태그를 바탕으로 설치할 수도 있고, 보통 다른 오픈소스처럼 버전을 바탕으로 설치할 수도 있다.
 
 

2. 다른 프로젝트에서 pip로 설치하기

 
requirements.txt 파일을 추가한다.
 
아래 예는 태그를 바탕으로 설치하는 예이다. 
태그나 버전이나 편한 것을 정해서 하면 된다. 태그는 중복이 허용되지 않으므로 비공개 패키지는 태그를 추천한다.
실수로 pyproject.toml의 버전을 변경하지 않은 경우 서로 다른 소스인데 version 중복이 발생할 수 있기 때문이다. 
(오픈소스는 https://pypi.org/ 에서 내려받게 되는데 pypi에 올릴 때 version을 확인해서 중복 시 업로드를 막기 때문에 공개 패키지는 version 중복이 없다.)
 

git+https://x-access-token:${GITHUB_TOKEN}@github.com/taptorestart/private-package@v0.1.0

 

 
pip install -r requirements.txt를 실행한다. 에러가 발생한다.

 
GITHUB_TOKEN 환경변수 등록이 되지 않아서 토큰이 잘못 되어 접근 권한이 없기 때문이다.
 
https://github.com/settings/tokens/new 로 가서 토큰을 만들자.
아래는 classic token을 만드는 예이다. repo와 admin_org 권한을 부여하자. 권한을 필요한 것만 최소한으로 부여해도 관계 없다.

 

 
Generate Token 버튼을 눌러서 토큰을 만든다.
 
토큰을 복사한다.

 
위 토큰을 복사해서 아래 예처럼

$ export GITHUB_TOKEN=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

 
환경 변수를 등록하자.
 
다시 pip install -r requirements.txt를 실행한다. 
 
이제 정상 설치되는 것을 볼 수 있다.

 
calculator가 추가된 것을 볼 수 있다. Github 저장소(repository) 명칭과 관계 없이 최상위 패키지 이름대로 설치되는 것을 확인할 수 있다. 오픈소스 패키지와 최상위 패키지명이 겹치지 않도록 회사명을 접두사로 붙이는 형태를 추천한다. 오픈 소스를 내려받는 pypi에서는 당연히 중복 패키지가 없다. 중복 시 업로드를 막기 때문이다. 위 예제처럼 calculator로 할 경우, 추후 오픈 소스 calculator 패키지를 받을 경우 에러가 발생할 수 있다.

 
 
파이썬 파일을 만들어서 실행해보면 정상적으로 해당 모듈을 불러서 실행되는 것을 볼 수 있다.

 

 
위와 같은 방식으로 팀 내에서 공통 모듈을 비공개 저장소로 분리해서 필요할 때 pip로 설치해서 사용할 수 있다.

 

# 주의사항

반드시 최상위 패키지는 하나여야 한다.

아래 예처럼 최상위 패키지가 calculator, commons 2개 이상이면 다른 프로젝트에서 설치 시 최상위 패키지가 2개 이상이라고 에러가 발생한다.

 

최상위 패키지명에는 회사명 접두사를 붙이자.

예를 들어 회사명이 taptorestart라면 taptorestart-util 식으로 최상위 패키지를 만들자. 위 예시처럼 calculator로 하는 경우 calculator란 오픈 소스 패키지를 설치할 때 충돌이 발상할 수 있다.

 

의존성 패키지가 있는 경우 반드시 추가해야 한다.

의존성 패키지가 있는 경우 아래 예처럼 dependencies를 추가해줘야 한다. 추가하지 않으면 다른 프로젝트에서 비공개 패키지를 설치해서 실행할 때 에러가 발생하고 제대로 실행이 안된다. 의존성 패키지가 설치되지 않았기 때문이다.

[project]
...
dependencies = ["Django>=4.2"]