관리 메뉴

HAMA 블로그

[Flask 문서번역] Setuptools 을 이용한 디플로이 본문

Flask

[Flask 문서번역] Setuptools 을 이용한 디플로이

[하마] 이승현 (wowlsh93@gmail.com) 2017. 6. 28. 12:09


아래에 훌륭한 Flask 한글메뉴얼이 존재하며, Flask 를 배우기에 최고의 장소입니다.

링크 : http://flask-docs-kr.readthedocs.io/ko/latest/index.html


Deploying with Setuptools


Setuptools는 Python 라이브러리 및 확장을 배포하는데 일반적으로 사용되는 익스텐션 라이브러리입니다. Python과 함께 제공되는 기본 모듈 설치 시스템인 distutils를 확장하여 더 큰 응용 프로그램을보다 쉽게 배포 할 수있게 해주는 보다 복잡한 여러 구조를 지원합니다.

  • support for dependencies:  라이브러리 또는 응용 프로그램은 자동으로 설치 될 다른 의존 라이브러리의 목록을 선언 할 수 있습니다.
  • package registry:  setuptools는 당신의 패키지를 파이썬 인스톨에 등록합니다. 이렇게 하면 한 패키지가 다른 패키지에서 제공 된 정보를 쿼리 할 수 있습니다. 이 시스템의 가장 잘 알려진 기능은 한 패키지가 다른 패키지를 확장하기 위해 다른 패키지가 후킹 할 수 있는 "진입점"을 선언 할 수있게 해주는 진입점 지원 기능입니다.
  • installation managerpip 다른 라이브러리들을 인스톨 할 수 있습니다.

python.org에서 Python 2 (> = 2.7.9) 또는 Python 3 (> = 3.4)를 설치했다면 이미 시스템에 pip와 setuptools가있을 것입니다. 그렇지 않으면 직접 설치해야합니다.

플라스크 자체와 PyPI 에서 찾을 수있는 모든 라이브러리는 setuptools 또는 distutils와 함께 배포 됩니다.

이 경우에는 응용 프로그램이 yourapplication.py라고 가정하고 모듈을 사용하지 않고 패키지만 사용한다고 가정합니다. 응용 프로그램을 아직 패키지로 변환하지 않았다면 Larger Applications패턴으로 넘어 가서 이것이 어떻게 수행되는지 확인하십시오.

setuptools를 사용한 작업 배포는 좀 더  복잡하고 자동화된 배포 시나리오를 위한 그저 첫 번째 단계입니다. 프로세스를 완전히 자동화하려면  Deploying with Fabric 장을 읽으십시오.

기본 Setup 스크립트

Flask를 설치 했으므로 시스템에서 setuptools를 사용할 수 있습니다. 플라스크는 이미 setuptools에 의존합니다.

표준 항목으로 . vritualenv 을 사용하는 것이 좋습니다.

설정(setup)코드는 항상 응용 프로그램 옆에 setup.py라는 파일로 들어갑니다. 파일의 이름은 관례에 불과하지만 모두가 그 이름을 가진 파일을 찾을 것이므로 변경하지 않는 것이 좋습니다.

Flask 응용 프로그램의 기본 setup.py 파일은 다음과 같습니다.

from setuptools import setup

setup(
    name='Your Application',
    version='1.0',
    long_description=__doc__,
    packages=['yourapplication'],
    include_package_data=True,
    zip_safe=False,
    install_requires=['Flask']
)

서브 패키지를 명시적으로 나열해야한다는 점에 유의하십시오. setuptools가 자동으로 패키지를 검색하도록 하려면 find_packages 함수를 사용할 수 있습니다.

from setuptools import setup, find_packages

setup(
    ...
    packages=find_packages()
)

setup 함수에 대한 대부분의 매개변수는 자체 설명적이어야 하며 include_package_data 및 zip_safe는 아닐 수도 있습니다. include_package_data는 MANIFEST.in 파일을 찾고 패키지데이터와 일치하는 모든 항목을 설치하도록 setuptools에 지시합니다. 이것을 사용하여 정적 파일과 템플릿을 Python 모듈과 함께 배포합니다 (Distributing Resources참조). zip_safe 플래그는 zip 아카이브 생성을 강제하거나 방지하는 데 사용될 수 있습니다. 일반적으로 패키지가 zip 파일로 설치되는 것을 원하지 않는 경우가 있습니다. 일부 도구는 패키지를 지원하지 않으므로 디버깅을 훨씬 더 어렵게 만듭니다.

Tagging Builds

릴리스 빌드와 개발 빌드를 구별하는 것이 유용합니다. 이 옵션을 구성하려면 setup.cfg 파일을 추가하십시오.

[egg_info] tag_build = .dev tag_date = 1

[aliases] release = egg_info -RDb ”

python setup.py sdist를 실행하면 ".dev" 및 현재 날짜가 더해진 개발 패키지가 만들어집니다
: flaskr-1.0.dev20160314.tar.gz.

python setup.pyrelease sdist를 실행하면 버전 : flaskr-1.0.tar.gz 만있는 릴리스 패키지가 생성됩니다.

Distributing Resources

방금 만든 패키지를 설치하려고 하면 static 또는 템플릿과 같은 폴더가 설치되지 않은 것을 알 수 있습니다. 그 이유는 setuptools가 어떤 파일을 추가할 지 모르기 때문입니다. 해야 할 일은 setup.py 파일 옆에 MANIFEST.in 파일을 만드는 것입니다. 이 파일은 tarball에 추가되어야하는 모든 파일을 나열합니다.

recursive-include yourapplication/templates *
recursive-include yourapplication/static *

설치 기능의 include_package_data 매개 변수를 True로 설정하지 않으면 MANIFEST.in 파일에 등록하더라도 사용자를 위해 설치되지 않는다는 사실을 잊지 마십시오!

Declaring Dependencies

종속성은 install_requires 매개 변수에서 목록으로 선언됩니다. 이 목록의 각 항목은 설치시 PyPI에서 가져와야하는 패키지의 이름입니다. 기본적으로 항상 최신 버전을 사용하지만 최소 및 최대 버전 요구 사항을 제공 할 수도 있습니다. 여기에 몇 가지 예가 나와 있습니다.

install_requires=[
    'Flask>=0.2',
    'SQLAlchemy>=0.6',
    'BrokenPackage>=0.7,<=1.0'
]

앞서 언급했듯이, 의존성은 PyPI에서 가져옵니다. PyPI에서 찾을 수 없는 패키지에 의존하고, 다른 사람과 공유하고 싶지 않은 내부 패키지라면? 마치 PyPI 항목이 있는 것처럼 작업하되 setuptools가 tarball을 찾아야 하는 대체 위치 목록을 제공하십시오.

dependency_links=['http://example.com/yourfiles']

페이지에 디렉토리 목록이 있고 페이지의 링크가 올바른 파일 이름을 가진 실제 tarball을 가리키고 있는지 확인하십시오. 이것이 setuptools가 파일을 찾는 방법입니다. 패키지가 포함 된 내부 회사 서버가 있는 경우 해당 서버에 대한 URL을 제공하십시오.

Installing / Developing

응용 프로그램을 설치하려면 (이상적으로는 virtualenv에) setup.py 스크립트를 install 매개 변수와 함께 실행하십시오. 응용 프로그램을 virtualenv의 site-packages 폴더에 설치하고 모든 종속성을 다운로드하여 설치합니다.

$ python setup.py install

패키지를 개발 중이며 요구 사항이 설치되게 하려는 경우 대신  develop 명령을 사용할 수 있습니다.

$ python setup.py develop

이렇게하면 데이터를 복사하는 대신 사이트 패키지 폴더에 대한 링크를 설치하는 장점이 있습니다. 각 변경 후에 설치를 다시 실행하지 않고도 코드 작업을 계속할 수 있습니다.


Comments