2015년 7월 19일 일요일

Python Package

Python Package
  • Introduction
    • package : directory containing python files
  • aim
    • packagers for every target system will be able to repackage your work,
    • the dependencies you have will themselves be repackaged in every target system
    • system dependencies will be clearly described.

`zc.buildout` 이란 걸 이용하는 `Plone` 이란 프로젝트가 나왔으나, OS에 따라서 자동적으로 repackaging 해주지 못함.
그리고 `MathUtils` 라는 프로젝트는 version 이름이 `FumanChu` (자기가 키우던 2번째  개 이름)로 되어 있어서 알아보기 힘듬

  • 최근 아키텍쳐
    • Distutils를 사용함 => 위에 문제들을 풀기 위해 나온 라이브러리
    • Distutils를 베이스로, setuptools, pip, distribute 등이 나옴

  • Distutils
    • contains command, `setup` function을 사용하여 패키지 함
    • commands
      • sdist: dist 폴더를 만들고, 그 안에 archive 파일을 넣음
      • install: package 를 실행할수 있게 third-part 로 설치함
      • upload: online repository 에 package를 올림
      • register: metadata 정보를 online repository에 올림
      • bdist: binary distribution 만듬
      • bdist_msi: msi 파일로 만듬


  • flaws
    • 모든 `setup.py` 를 설치하는데에서만 사용할 것 이라는 가정
    • $ python setup.py --name
      Building lxml version 2.2.
      NOTE: Trying to build without Cython, pre-generated 'src/lxml/lxml.etree.c'
      needs to be available.
      Using build configuration of libxslt 1.1.26
      Building against libxml2/libxslt in the following directory: /usr/lib/lxml
    • `Distutils` 기능은 개발단에서만 사용할 것이다.
    • 많은 롤에 대해서 `setup.py` 가 제대로 동작하지 않을 수도 있다.

  • Metadata and pypi
    • Metadata: project 를 설명하기 위한 static한 파일, 이미 존재할 경우 오류를 발생 시킨다. https://www.python.org/dev/peps/pep-0314/
    • Fields
      • Name: 프로젝트 이름
      • Version: 프로젝트 버전
      • Summary: 프로젝트 요약
      • Description: 프로젝트 설명
      • Home-Page: 프로젝트 URL
      • Author: 프로젝트 작성자 이름
      • Classifiers: 프로젝트 상태, e.g) beta, alpha, final
      • Requires, Provides, Obsoletes: 의존 관계 있는 module 을 정의할 때 사용
  • Pypi (Python Package Index) : a central repository
    • register, upload 메소드가 있습니다.
    • flaws
      • metadata 는 python script를 통해 생성 되기 때문에 , platform 종속적인 metadata file을 만들수 없습니다.

  • Architecture of Pypi
   
    • register & upload
    • post method 사용, Basic Authentication , Authorization header 사용
    • `http://pypi.python.org/simple//` 라는 기본 web page 제공
    • limitation
      • pypi 가 단일 서버라서 다운 될수 있다.
      • metadata가 제공되지 않는다.

  • Architecture of Python installation
    • `python setup.py install` 을 통해 설치 한 경우
      • ubuntu: /usr/local/lib/python2.x/dist-packages/
      • fedora: /usr/local/lib/python2.x/sites-packages/
      • datafiles `project-version.egg-info` 라는 이름으로 module,package 폴더에 존재

  • Setuptools, pip 가 어떻게 문제를 해결 하기위해 노력했을까?
    • The dependency issue
      • module-level dependencies => project-level dependencies
      • 조금 루즈한 dependency를 사용해서 dependency issue를 해결 함

  • Improved Standards
    • Metadata
      • version:
        • N.N[.N]+[{a|b|c|rc}N[.N]+][.postN][.devN]
        • 1.0a1 < 1.0a2.dev456 < 1.0a2 < 1.0a2.1.dev456
            < 1.0a2.1 < 1.0b1.dev456 < 1.0b2 < 1.0b2.post345
              < 1.0c1.dev456 < 1.0c1 < 1.0.dev456 < 1.0
                < 1.0.post456.dev34 < 1.0.post456
      • Dependencies
        • Requires, Provides, Obsoletes => Requires-Dist, Providers-Dist, Obsoletes-Dist 로 변경 하고, 여러번 세팅 가능하도록 변경
        • 환경 변수
        • Requires-Dist: pywin32 (>1.0); sys.platform == 'win32'
          Obsoletes-Dist: pywin31; sys.platform == 'win32'
          Requires-Dist: foo (1,!=1.3); platform.machine == 'i386'
          Requires-Dist: bar; python_version == '2.4' or python_version == '2.5'
          Requires-External: libxslt; 'linux' in sys.platform
  • Architecture of Data Files
    • `__file__` 을 통해 package 에 있는 config 파일 읽을수 있도록 지원,  pkgutil 을 통해 metadata 의 `RESOURCES' 에서 map형태로 사용가능하도록 지원


    • 환경 변수도 사용 가능
      • [files]
        resources =
                config/mopy.cfg {confdir}/{application.name}/
                images/*.jpg    {datadir}/{application.name}/

    • Pypi Improvenments


댓글 없음:

댓글 쓰기