2013-03-27 2 views
2

저는 현재 Python 기반 Google App Engine 프로젝트를 진행하고 있습니다. 특히, 응용 프로그램에 대해 Flask를 사용하고 있습니다. 나는 외부 파이썬 모듈을 포함하는 것으로 받아 들여지는 방법이 무엇인지, 특히 저장소에 관해서 궁금해한다. 내가 말할 수있는 것부터, 내 저장소에있는 다른 사람들의 코드를 포함하여 여러 가지 이유로 나쁜 형태입니다. 그러나 다른 사람들이 동일한 저장소에서 작업 할 것이므로 동일한 결과를 보장하기 위해 동일한 외부 모듈을 사용해야합니다.GAE - 저장소에 추가하지 않고 외부 파이썬 모듈 포함?

특히 Flask (및 그 의존성)를 내 응용 프로그램에 포함시켜야합니다. 구글 앱 엔진이 작업을 수행하는 가장 쉬운 방법은 루트 레벨로 던져 그냥 :

MyProject 
    app.yaml 
    main.py 
    MyApp 
    Flask 
    ... 

같은 프로젝트에서 이러한 외부 모듈을 유치하는 적절한 방법은 무엇입니까? 일반화 된 대답과 나의 경우에 특정한 것이 모두 유용 할 것입니다. 또한, 기타 관련 권장 사항은 인정 될 것입니다. 고맙습니다.

+0

앱 엔진. – dusual

답변

3

외부 리포지토리의 서브 모듈이나 심볼릭 링크로 제 3 자 라이브러리를 실제로 포함 할 수 있지만 실제로는 좋지 않습니다.

  1. 타사 라이브러리 릴리스 기능을 나누기 새로운 버전의 경우가이 중 필요한 모든 변경이 새로운 요구 사항을 충족하거나 단순히를 찾을 수 있습니다 : 여기 잘못 될 수 있는지에 대한 두 가지 시나리오는 이전 버전은 작업을 유지하고 외부 연결을 끊을 수 있습니다. 일반적으로 이것은 마감 시간에 매우 가까울 때 발생합니다.

  2. 타사 라이브러리가 새 버전을 릴리스하고 동료 중 하나가 업그레이드되고 새 버전을 지원하기 위해 필요한 모든 변경을 수행 한 경우 업그레이드 할 때까지 코드가 손상됩니다.

위의 예는 훨씬 더 눈에 보이는 의존성이 많은 대형 프로젝트에 많은 사람들이 장기적으로 프로젝트에 합류으로는 큰 문제가된다! 더 많은 예를 생각해 낼 수는 있지만 그 점을 알 수 있다고 생각합니다.

가장 좋은 방법은 리포지토리에 외부 라이브러리를 포함시키는 것입니다.이 방법은 전체 프로젝트를 많은 종속성이없는 새 컴퓨터에서 실행할 수 있다는 이점이 있습니다. how to organize your third party libraries에는 여러 가지 방법이 있으며 모두 app.yaml 파일과 동일하거나 더 깊은 레벨에 포함되어야합니다. @dragonx에서 언급 한 핵심 라이브러리 코드 만 포함됩니다.

저장소 공간에 공간을 두는 것을 두려워하지 마십시오. 오늘날에는 문제가되지 않으며 일반적으로 이러한 라이브러리는 자주 업데이트되지 않으므로 저장소 크기가 시간이지나면서 커지지는 않습니다.

Google App Engine에서 Flask에 대해 언급 한 이후 gae-init 프로젝트를 확인하실 수 있습니다. 여기에서 external libraries이 어떻게 구성되어 있는지 실제로 확인할 수 있습니다.

1

requirements.txt을 만들어 GAE에 넣을 수는 없습니다. 코드에는 프로젝트를 사용하고 GAE (https://developers.google.com/appengine/docs/python/tools/libraries27)에서 지원하지 않는 순수 파이썬 라이브러리가 모두 포함되어야합니다.

당신이 플라스크를 보면 당신은 flask, werkzeug 등과 같은 일부 종속성을 찾을 수 있으며,이 모든 당신이 GAE 서버에 푸시해야 종속성 GAE (http://flask.pocoo.org/docs/quickstart/#deploying-to-a-web-serverhttps://github.com/kamalgill/flask-appengine-template) 예를 배포합니다.

그래서 나는 세 가지 솔루션 참조 : 지역 개발을위한

  1. 사용 지역의 요구 사항 및 응용 프로그램과 함께 넣고 GAE 서버에 업로드, 모든 종속성을 다운로드 할 기능을 사용자 지정 빌드합니다.

  2. 응용 프로그램과 함께 필요한 라이브러리를 넣는 프로젝트를 시작할 때 로컬 배포 용 도구를 추가하십시오 (.gitignore 잊지 마세요).

  3. 요구 사항 리포지토리에 git submodules과 같은 것을 사용하십시오.

2

실제로 두 가지 질문을하고 있습니다.

  1. GAE 프로젝트에 외부 라이브러리를 포함하려면 어떻게해야합니까?

올바른 아이디어가 있습니다. 당신이 그것에 대해 어떻게 생각하든간에, 당신은 어쨌든 Flask와 그것의 의존성을 GAE 프로젝트의 루트에 포함시켜야합니다. 한 가지 방법은 거기에 직접 사본을 넣는 것입니다.

두 번째 방법은 외부 라이브러리가 포함 된 폴더에 대한 심볼 링크를 사용하는 것입니다. Flask에 대해서는 잘 모르겠지만, 종종 외부 레포지토리에는 서브 디렉토리에 실제 라이브러리 코드가 들어 있습니다. 따라서 실제 소스의 루트 인 GAE 앱에서 repo의 루트를 원하지 않는 경우가 종종 있습니다. 이 경우 원본 폴더에 링크되는 심볼릭 링크를 넣는 것이 더 쉽습니다.

  1. 소스 리포에서 외부 라이브러리를 어떻게 관리합니까?

사용하는 소스 제어 도구에 따라 달라 지므로이 질문에 대답하기가 더 어려워집니다.예, 여러분은 모든 사람들이 동일한 버전의 외부 라이브러리를 사용하기를 원하며 어떻게 든 소스 제어에 포함시켜야합니다.

자식을 사용하는 경우 git submodule이 좋습니다. 약간 혼란 스럽지만 일을 끝내야합니다.

나는 당신이 타사 폴더에 외부 라이브러리에 소스를 유지하는이 예에서는이

repo/ 
    thirdparty/ 
     flask/ 
     other_dependency/ 
     another_dependency/ 
      README.TXT 
      setup.py 
      src/ 
    app/ 
     app.yaml 
     your_source.py 
     softlink_to_flask 
     softlink_to_other_dependency 
     softlink_to_another_dependency_src 

같은 것을 보이는 REPO 구조를 권 해드립니다. 이들은 git submodules 일 수 있습니다. app 폴더에는 소스가 있고 앱을 실행하는 데 실제로 필요한 적절한 파일에 대한 소프트 링크가 있습니다. 이 경우 another_dependency의 실제 코드는 다른 종속성의 실제 루트가 아닌 another_dependency/src 폴더에있을 수 있습니다. 이렇게하면 배포 폴더에 불필요한 파일을 포함 할 필요가 없지만 전체 라이브러리를 계속 repo에 보관할 수 있습니다.

0

구글 애플 리케이션 엔진 프로젝트에 파이썬 타사 패키지를 사용하여 두 가지 경우가 있습니다 :

라이브러리가

이 당신의 응용 프로그램에 추가 supported runtime-provided third-party libraries of GAE 섹션 중 하나 인 경우.도서관에서 YML 파일

libraries: 
     - name: package_name 
      version: latest 

import pack_name 

때때로 당신이

를 사용하여 당신이 올바른 인터프리터를 사용하고 있는지 확인

pip install package_name 

으로 패키지를 설치할 필요가 코드 추가

pip freeze 

을 사용하면 패키지가 올바른 경로에 성공적으로 설치되었는지 확인할 수 있습니다.

그렇지 않으면, GAE 경우 도서관, 수동으로 다운로드하고 루트/lib 디렉토리 디렉토리에 로컬로 저장해야 지원하지 않습니다 (설치 PIP 또는 GIT 을 통해 또는 PIP를 통해 package_name을 -t 경로 /로/당신의/lib 디렉토리/디렉토리) 그 후

, 우리는 해방 디렉토리를 선택하고 소스로 표시 pycharm pycharm-> 환경 설정 -> 프로젝트 구조 에서 소스 디렉토리로 lib 디렉토리 디렉토리를 선언해야합니다.
그런 다음 가져 오십시오.

import pack_name 

가져 오기를 수행 할 때 파이썬 경로가 아닌 로컬 경로를 선택해야합니다.

일반적으로 사용되는 모든 패키지 이름을 포함하는 requirements.txt 파일을 사용하는 것이 좋으며 pycharm은 제거 된 패키지를 인식하고 설치하도록 제안합니다. Heroku가 당신이 외부 모듈 자식 서브 모듈을 사용할 수 있지만 외부 libs가 설치되지 않습니다 달리

행운

관련 문제