-
PYPI는Python Packagy Index의 줄임말입니다. PYPI는 간단하게 파이썬 관련 패키지들이 모여있는 저장소라고 할 수 있습니다. 파이썬 개발자들은 자신이 개발한 파이썬 모듈들을 PYPI에 업로드할 수 있습니다. 또한 PYPI에 저장된 이 모듈들은 누구에게나 공개되어 있습니다. 여기서는 PYPI를 private하게 구축하는 방법을 설명하겠습니다.
PYPI 설치
아래명령어로 pypi 이미지를 다운받습니다.
$ docker pull codekoala/pypi
Usage
sudo mkdir -p /srv/pypi # 패키지를 담는 디렉토리를 로컬에 생성합니다. sudo touch /srv/pypi/.htaccess # 패키지를 추가하기 위한 credential 파일 docker run -t -i -d \ -h pypi.local \ # hostname -v /srv/pypi:/srv/pypi:rw \ # 볼륨을 설정해 호스트 디렉토리를 pypi 컨테이너와 공유합니다. :rw로 읽기와쓰기 설정을 해줍니다. -p 8080:80 \ # expose port 80 as port 8080 --name pypi \ # 컨테이너 이름 codekoala/pypi #
먼저 mkdir의 옵션인 -p는 상위 디렉토리를 포함한 디렉토리를 생성할 수 있습니다. 위의 명령어처럼 -p /srv/pypi를 실행하면 /srv 디렉토리를 생성한 후, /srv 디렉토리내에 pypi 디렉토리를 생성합니다.
다음 touch는 파일의 날짜시간정보를 변경하는 명령어입니다. 아무런 옵션이 없으므로, 파일의 최근 사용시간과 최근 변경된 시간을 서버의 현재시간으로 변경하고 파일의 크기가 0인 빈 파일을 생성합니다.
위 처럼 세팅을 한 이유는 아래의 Dockerfile 내용으로 확인할 수 있습니다.
FROM codekoala/saltyarch MAINTAINER Josh VanderLinden <codekoala@gmail.com> RUN pacman -Sy --noconfirm --needed python-pip python-passlib && pip install -U pypiserver && mkdir -p /srv/pypi && rm -rf /var/cache/pacman/* EXPOSE 80 VOLUME ["/srv/pypi"] CMD ["pypi-server", "-p", "80", "-P", "/srv/pypi/.htaccess", "/srv/pypi"]
실행되었을 시, http://localhost:8080으로 접속해 pypi 서버를 확인할 수 있습니다. .tar, .zip, .egg 등 단순하게 추가할 수 있고 /srv/pypi디렉토리에 저장이 됩니다
public pypi 패키지 및 모듈 private pypi에 업로드
pypi는 흔히 사용하는 pip에 존재하는 패키지 및 모듈들을 저장하고 있습니다. 현재까지 조사한 바로는 pypi끼리 패키지 전체를 전송하는 방법은 찾지 못했습니다. 약간의 수작업을 통해 전체 파일을 다운로드받을 수 있는 방법을 찾았습니다.
먼저 pypi에 올라와 있는 패키지는 74594개 입니다. 먼저 위와 같이 세팅이 잘 되어 있다면, /srv/pypi의 폴더는 컨테이너와 공유가 되어 있는 상태입니다.
아래의 명령어로 pypi의 패키지 목록을 받습니다.
$ wget https://pypi.python.org/simple/
그럼 index.html파일이 생성이 되고 아래와 같이 열어 확인을 하면 다음과 같은 형식으로 구성되어 있습니다.
$ vi index.html <html><head><title>Simple Index</title><meta name="api-version" value="2" /></head><body> <a href='0-.-.-.-.-.-.-.-.-.-.-.-.-0'>0-._.-._.-._.-._.-._.-._.-0</a><br/> <a href='00smalinux'>00SMALINUX</a><br/> <a href='02exercicio'>02exercicio</a><br/> <a href='0805nexter'>0805nexter</a><br/> <a href='0x10c-asm'>0x10c-asm</a><br/> <a href='1020-nester'>1020-nester</a><br/> <a href='115wangpan'>115wangpan</a><br/> <a href='131228-pytest-1'>131228_pytest_1</a><br/> <a href='1337'>1337</a><br/> <a href='17monip'>17MonIP</a><br/> <a href='18-e'>18-e</a><br/> <a href='199fix'>199Fix</a><br/> ...
이러한 형식으로 75000여개의 라인을 형성하고 있습니다. 여기서 필요한 것은 href= 안에 있는 패키지 이름입니다. 이 패키지 이름으로 아래와 같이 실행하면 다음과 같은 json 파일을 볼 수 있습니다.
$ sudo wget https://pypi.python.org/pypi/roundup/json $ vi json { "info": { "maintainer": null, "docs_url": null, "requires_python": null, "maintainer_email": null, "cheesecake_code_kwalitee_id": null, "keywords": null, "package_url": "http://pypi.python.org/pypi/roundup", "author": "Ralf Schlatterbeck", "author_email": "rsc@runtux.com", "download_url": "http://pypi.python.org/pypi/roundup", ... "urls": [ { "has_sig": true, "upload_time": "2016-01-11T21:38:39", "comment_text": "", "python_version": "source", "url": "https://pypi.python.org/packages/source/r/roundup/roundup-1.5.1.tar.gz", "md5_digest": "54b21d185dd490ef8697f5a046607a44", "downloads": 384, "filename": "roundup-1.5.1.tar.gz", "packagetype": "sdist", "path": "source/r/roundup/roundup-1.5.1.tar.gz", "size": 2618886 } }
이와 같은 패턴을 사용하여 php나 파이썬 등을 작성해 만들 수 있습니다.
받은 압축파일 및 whl 파일들은 해당 서버에 직접 접근하여 /srv/pypi에 올리면 pypi서버에 반영이 됩니다.
개인 프로젝트 private pypi서버에 업로드
관리자
관리자는 다음과 같이 사용자의 비밀번호와 아이디를 정의합니다.
$ htpasswd -s htaccess yourusername 만약 htpasswd 명령어가 설치가 안되어 있을 경우, http://www.htaccesstools.com/htpasswd-generator/ 해당 url로 들어가 사용자의 아이디와 비밀번호를 입력하고 나온 결과를 복사합니다.
복사한 결과를 아래 파일을 열어 붙여 넣고 저장합니다.
$ cd /srv/pypi $ sudo vi .htaccess 복사내용 붙여넣기
사용자
아래에서는 test_sum이라는 파이썬 파일을 private 저장소 pypi에 업로드하는 방법을 설명합니다.
배포(업로드)하고자 하는 파일이 아래와 같이 있다고 가정합니다.
def sum(a, b): return a + b
다음 같은 폴더 안에 setup.py 파일을 만들고 메타데이터를 작성합니다.
setup ( name = 'factorial', version = '1.0.0', py_modules = ['factorial'], //name과 py_modules 는 동일한 이름이여야 합니다. author = 'ksw', author_email = 'ksw@ksw.com', description = 'factorial method', )
윈도우와 리눅스는 파일 설정 및 지정이 다르기 때문에 나눠서 설명하겠습니다.
윈도우
메모장을 열어 아래의 코드를 붙여넣습니다.
[distutils] index-servers = pypi internal [pypi] username:pypiusername password:pypipassword [internal] repository: http://10.101.30.124:8080 // private 저장소 url을 적습니다. username:duzon // 관리자가 할당해준 아이디를 적습니다. password:duzon // 관리자가 할당해준 비밀번호를 적습니다.
.pypirc로 저장하고 C:\Users\(로그인된 사용자 아이디) 에 저장합니다.
예) C:\Users\ljh 에 저장
리눅스
아래와 같이 이동한 다음 .pypirc 파일을 작성 후 저장합니다.
$ cd ~/ # sudo vi .pypirc [distutils] index-servers = pypi internal [pypi] username:pypiusername password:pypipassword [internal] repository: http://10.101.30.124:8080 // private 저장소 url을 적습니다. username:duzon // 관리자가 할당해준 아이디를 적습니다. password:duzon // 관리자가 할당해준 비밀번호를 적습니다.
위와 같이 저장한 다음 아래의 명령어로 pypi 서버에 파일을 배포(업로드)합니다.
업로드할 시, 위에서 만들었던 setup.py 파일이 있는 경로에서 실행해야 합니다.
$ python setup.py sdist register -r internal upload -r internal
위의 방식은 .tar로 생성하여 올리기 때문에 python3에서만 사용이 가능합니다. python 2나 3 두 버전에서 사용가능한 wheel 타입으로 같이 올리는 방법이 가장 좋습니다.
PIP Config 설정
Mac
터미널에 접근해주세요.
$ mkdir $HOME/.pip $ vi $HOME/.pip/pip.conf
[install] index-url=http://172.16.114.36/simple trusted-host=172.16.114.36
Window
%HOME%\pip\pip.ini
위의 경로에 파일을 생성해주세요. 그리고 아래의 내용을 채워주시기 바랍니다.
[install] index-url=http://172.16.114.36/simple trusted-host=172.16.114.36
wheel 타입 압축 후 업로드
wheel 타입으로 압축을 하기 위해선 먼저 wheel 모듈이 필요합니다.
$ pip3 install wheel
또한 pip와 setuptools의 버전이 최신이어야 합니다.
해당 프로젝트 내에 setup.cfg 파일을 생성합니다.( setup.py 파일의 동일한 위치에 생성하면 됩니다.)
[bdist_wheel] universal = 1
setup.cfg 파일을 생성한 다음, 위의 코드를 넣어줍니다.
마지막으로 PYPI 업로드시, 옵션 선택하기 에서 사용하는 라이브러리는 from distutils.core import setup 입니다. 해당 라이브러리를 사용하면 에러가 나므로 from setuptools import setup 를 대신 사용해 줍니다.
위의 과정을 거친 후 명령어를 입력하여 .tar 와 .whl 압축파일을 업로드합니다.
$ python setup.py sdist bdist_wheel register -r internal upload -r internal
업로드 시 setup의 attribute는 PYPI 업로드시, 옵션 선택하기 에서 확인할 수 있습니다. ( wheel로 압축해야될 경우, from distutils.core import setup 이부분을 from setuptools import setup 같이 변경하여 줍니다.)
private pypi에 올라온 패키지 다른 서버에서 설치 받기
아래와 같이 명령어를 사용하여 쉽게 install 및 download를 받을 수 있습니다. (이를 사용하기 위해 pip 및 easy_install 설치가 필요합니다.)
pip 사용하여 다운로드 받을 때
$ pip download --trusted-host ip주소 --index-url pypi 주소/simple/ 패키지명 -- 예시 $ pip install --trusted-host 10.101.30.124 --index-url http://10.101.30.124:8080/simple/ imi
easy_install 사용하여 다운로드 받을 때
$ easy_install -i pypi 주소/simple 패키지명 --예시 $ easy_install -i http://10.101.30.124:8080/simple imi
Adding Third Party Packages
아래의 명령어를 사용하여 해당 패키지를 미러링할 수 있습니다.
$ pip install -d /srv/pypi 패키지명
미러링된 패키지 업데이트하기
아래 명령어를 실행시켜 미러링된 패키지에 대해 업데이트를 할 수 있습니다.
$ pypi-server -U /srv/pypi
레파지토리에 있는 각 패키지들은 업데이트를 확인하고 업데이트 합니다.