Python 패키지 버전 관리를 위한 pypi simple 저장소를 깃허브 페이지로 해결하기
오늘은 Python 패키지의 버전관리를 할 수 있는 pypi 서버의 역할에서 simple 저장소를 깃허브 페이지로 호스팅해보려 합니다.
pep 규칙
https://www.python.org/dev/peps/pep-0503/
pep 503 규칙으로서 simple 저장소는 PyPI의 https://pypi.org/simple 도메인처럼 최상위에 simple 저장소로 명명하게 됩니다.
패키지가 추가되면 URL은 https://pypi.org/simple/(새로운패키지) 로 정해집니다.
그리고 반드시 저장소 내에서 루트 URL은 저장소의 프로젝트 당 하나의 앵커 태그로 href 속성은 특정 프로젝트의 URL에 연결되어야 합니다.
<a href="pytube/">pytube</a>
단, 파일이 저장소와 관련하여 호스팅하는 위치에 대한 제약이 없으므로 아래와 같이 패키지의 프로젝트 깃 주소를 사용해도 무방합니다.
<a href="git+https://github.com/minwook-shin/pytube@master#egg=pytube-9.5.1">pytube-9.5.1</a><br>
그 외에도 gpg 서명, 파이썬 버전 명시에 대한 내용도 있습니다.
실습
simple이라는 폴더를 만듭니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Simple index</title>
</head>
<body>
<a href="pytube/">pytube</a>
</body>
</html>
위 코드를 index.html로 만들면 simple 저장소 디렉토리의 루트는 완성했습니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>pytube</title>
</head>
<body>
<a href="git+https://github.com/minwook-shin/pytube@master#egg=pytube-9.5.1">pytube-9.5.1</a>
</body>
</html>
이제 세부적으로 특정 패키지의 페이지를 만들어줍니다.
simple/패키지명/index.html로 만들어 줍니다.
위 예제의 pytube는 원 프로젝트에서 한 이슈를 해결한 커밋이 남아있는 포크 프로젝트입니다.
python3 -m http.server
파이썬으로 http 서버를 수행할 수 있도록 터미널에 입력합니다.
pip3 install --extra-index-url (url)/simple pytube==9.5.1
http 서버가 수행되고, 패키지를 설치할 컴퓨터의 터미널에서 위와 같이 명령어를 입력하게 되면, 루프백 아이피의 simple 저장소를 접근해서 특정 패키지를 설치하게 됩니다.
이 때 서버를 찾지 못하거나, pypi 서버에 존재하는 패키지의 버전이 더 높다면 pypi.org에서 패키지를 찾아 설치됩니다.
깃허브 업로드
깃허브에 저장소를 만들고, 기존에 github page를 만들 때처럼 진행하면 됩니다.
만약 github page에 대해서 처음 듣고, 하는 방법을 모르겠으면 아래 url을 참고해주세요.
https://pages.github.com
위 주소에서 설명하는 것을 3줄 요약하자면, 아래와 같습니다.
- 저장소 만들기
- 저장소 클론받기
- 작성한 html 파일 커밋 & 푸시하기
접속할 주소는 저장소의 이름에 따라서 (본인닉네임).github.io 이거나 (본인닉네임).github.io/(저장소 이름)입니다.
단점
pip search는 simple 저장소를 쓰지 않고, post 요청으로 처리하기 때문에 정적 사이트만 지원하는 깃허브 페이지에서는 사실상 pip install만 사용할 수 있습니다.
그래서 서버 비용없이 흩어져 있는 패키지를 한 곳에 모아 관리하겠다고 하면 좋을지도 모르지만, 파일의 호스팅과 터미널에서의 검색도 필요하다면 pypi 서버를 운영하는게 좋을 것 같습니다.
마무리
사실 위와 같이 하면 앵커 태그를 하드코딩으로 처리한 것이라 실제로 서비스에 적용하기에는 무리가 있습니다.
그래서 저와 같은 경우에는 깃허브 API와 jekyll을 사용해서 하드 코딩된 요소를 삭제해보려 노력하고 있습니다.