코드 패키징하기

../_images/36137234682_be6898bf57_k_d.jpg

코드를 다른 개발자와 공유하기 위해 패키징하세요. 예를 들어 다른 개발자가 자신의 응용에서 사용할 라이브러리를 공유하거나, ‘py.test’ 같은 개발 도구를 공유하기 위해서입니다.

이 배포 방식의 장점은 PyPI와 pip 같은 잘 정립된 도구 생태계입니다. 덕분에 다른 개발자가 가벼운 실험을 위해서든 크고 전문적인 시스템의 일부로서든 여러분의 패키지를 쉽게 다운로드하고 설치할 수 있습니다.

파이썬 코드를 이런 식으로 공유하는 것은 잘 정립된 컨벤션입니다. 코드가 PyPI에 패키징되어 있지 않다면, 다른 개발자가 그것을 찾아 자신의 기존 프로세스에 사용하기가 더 어려워집니다. 그러한 프로젝트는 관리가 잘 되지 않거나 버려진 것으로 상당한 의심을 받게 됩니다.

이런 식으로 코드를 배포하는 것의 단점은, 수신자가 필요한 파이썬 버전을 설치하는 방법을 이해해야 하고 pip 같은 도구로 코드의 다른 의존성을 설치할 수 있고 또 기꺼이 그렇게 해야 한다는 점에 의존한다는 것입니다. 다른 개발자에게 배포할 때는 괜찮지만, 이 방식은 응용을 최종 사용자에게 배포하기에는 적합하지 않습니다.

Python Packaging Guide 는 파이썬 패키지를 만들고 유지보수하는 데에 대한 광범위한 안내를 제공합니다.

패키징의 대안

응용을 최종 사용자에게 배포하려면 응용을 프리징(freezing) 해야 합니다.

리눅스에서는 리눅스 배포판 패키지를 만드는 것 (예: Debian이나 Ubuntu용 .deb 파일)도 고려해 볼 만합니다.

파이썬 개발자를 위해

오픈 소스 파이썬 모듈을 작성하고 있다면, 더 정확히는 The Cheeseshop 으로 알려진 PyPI 가 그것을 호스팅할 곳입니다.

Pip vs. easy_install

pip 을 사용하세요. 더 자세한 내용은 여기 를 참고하세요.

개인용 PyPI

PyPI가 아닌 다른 출처에서 패키지를 설치하고 싶다면(예를 들어 패키지가 상용/사설 인 경우), 설치할 패키지가 있는 디렉토리에서 실행되는 간단한 HTTP 서버를 호스팅하여 할 수 있습니다.

예시를 보여주는 것은 항상 도움이 됩니다

예를 들어 MyPackage.tar.gz 라는 패키지를 설치하고 싶고, 디렉토리 구조가 다음과 같다고 가정합니다:

  • archive
    • MyPackage
      • MyPackage.tar.gz

명령 프롬프트로 가서 다음을 입력하세요:

$ cd archive
$ python -m http.server 9000

이것은 9000번 포트에서 실행되는 간단한 HTTP 서버를 띄우고, (MyPackage 같은) 모든 패키지를 나열합니다. 이제 어떤 파이썬 패키지 설치 도구로든 MyPackage 를 설치할 수 있습니다. pip을 사용한다면 다음과 같이 합니다:

$ pip install --extra-index-url=http://127.0.0.1:9000/ MyPackage

여기서는 패키지명과 같은 이름의 폴더를 갖는 것이 결정적 입니다. 저도 한번 그 점 때문에 속았었습니다. 하지만 MyPackage 라는 폴더를 만들고 그 안에 MyPackage.tar.gz 를 두는 것이 중복 처럼 느껴진다면, 다음과 같이 MyPackage를 설치할 수도 있습니다:

$ pip install  http://127.0.0.1:9000/MyPackage.tar.gz

pypiserver

pypiserver 는 PyPI와 호환되는 최소한의 서버입니다. easy_install이나 pip에 패키지 모음을 제공하는 데 사용할 수 있습니다. 모든 패키지를 PyPI에서 찾을 수 있는 최신 버전으로 갱신해주는 관리용 명령어(-U)와 같은 유용한 기능을 포함합니다.

S3 호스팅 PyPi

개인 PyPI 서버를 위한 간단한 선택지 하나는 Amazon S3를 사용하는 것입니다. 이를 위한 사전 요구사항은 S3 버킷을 갖춘 Amazon AWS 계정을 가지고 있는 것입니다.

  1. PyPi 또는 다른 출처에서 모든 요구사항을 설치합니다

  2. pip2pi 설치

  • pip install git+https://github.com/wolever/pip2pi.git

  1. pip2tgz 및 dir2pi 명령어는 pip2pi README를 따릅니다

  • pip2tgz packages/ YourPackage (또는 pip2tgz packages/ -r requirements.txt)

  • dir2pi packages/

  1. 새 파일 업로드

  • Cyberduck 같은 클라이언트를 사용해 packages 폴더 전체를 s3 버킷과 동기화하세요.

  • packages/simple/index.html 과 모든 새 파일 및 디렉토리를 함께 업로드해야 합니다.

  1. 새 파일 권한 수정

  • 기본적으로 S3 버킷에 새 파일을 업로드하면 잘못된 권한이 설정되어 있습니다.

  • Amazon 웹 콘솔을 사용하여 파일의 READ 권한을 EVERYONE으로 설정하세요.

  • 패키지를 설치하려고 할 때 HTTP 403이 발생한다면, 권한을 올바르게 설정했는지 확인하세요.

  1. 모두 완료

  • 이제 pip install --index-url=http://your-s3-bucket/packages/simple/ YourPackage 명령으로 패키지를 설치할 수 있습니다.

리눅스 배포판을 위해

리눅스에서 코드를 배포하는 “올바른 방법”은 아마도 리눅스 배포판 패키지를 만드는 것이라고 할 수 있습니다.

배포판 패키지에는 파이썬 인터프리터가 포함되지 않기 때문에, 응용을 프리징 하는 것보다 다운로드와 설치 용량이 약 2-12 MB 더 작아집니다.

또한 배포판이 파이썬에 대한 새 보안 업데이트를 릴리즈하면, 여러분의 응용도 자동으로 그 새 파이썬 버전을 사용하기 시작합니다.

bdist_rpm 명령어는 Red Hat이나 SuSE 같은 배포판에서 사용할 RPM 파일 만들기 를 아주 쉽게 해줍니다.

그러나 각 배포판 포맷에 필요한 서로 다른 설정(예: Debian/Ubuntu용 .deb, Red Hat/Fedora용 .rpm 등)을 만들고 유지보수하는 것은 상당한 작업입니다. 코드가 다른 플랫폼에도 배포할 계획인 응용이라면, Windows와 OS X용으로 응용을 프리징하기 위한 별도의 설정도 만들고 유지해야 합니다. 대신 모든 리눅스 배포판은 물론 Windows와 OS X용 독립 실행 파일을 만들어주는 크로스 플랫폼 프리징 도구 중 하나를 위한 단일 설정만 만들고 유지하는 편이 훨씬 일이 적습니다.

배포판이 현재 지원하지 않는 파이썬 버전을 위한 코드인 경우에도 배포판 패키지를 만드는 일은 문제가 있습니다. 일부 버전 의 Ubuntu 최종 사용자에게 .deb 파일을 설치하기 전에 sudo apt-repository 명령으로 ‘dead-snakes’ PPA 를 추가해야 한다고 말해야 한다면, 이는 극도로 적대적인 사용자 경험이 됩니다. 그뿐 아니라, 모든 배포판마다 이런 안내의 사용자 정의 버전을 유지해야 하고, 더 나쁜 점은 사용자가 그것을 읽고 이해하고 그대로 따라야 한다는 점입니다.

이 모든 점을 말한 뒤에, 그래도 해보겠다면 다음과 같이 합니다:

유용한 도구