2014-06-18 1 views
4

(여기에서 Heroku의 지원하에 문의 함)왜 Heroku는 새로운 배포에서 오래된 Python (pip) 종속성을 설치합니까?

개발자 환경간에 라이브러리가 일치하지 않는 프로젝트에서 종속성 문제가 발견되었습니다. 세부 정보는 관련이 없지만 근본적인 원인은 setup.py에서 "> ="버전이 일치하는 종속성이었습니다. 즉, 개발자가 환경을 재구성하면 갑자기 최신 버전 (0.4.0)이 그는 이전 버전 (0.3.11)이었고 DeprecationWarning을 받기 시작했습니다.

디버깅 프로세스의 일부로 Repo가 Heroku에 푸시 될 때마다 깨끗한 환경이 재구성되어 DEV 환경 (일일 재 빌드)이 잘못되었다고 가정합니다. 최신 버전이 설치되어 있어야합니다. 우리는 이 아니기 때문에 dev 환경에서이 문제를보고 조사하기로 결정했으며 원격 환경에서 을 실행했습니다.

나는이 결과가 오래되고 만료 된 의존성에 대한 행운을 비는 데 매우 놀랐으며, 이 아닌 깨끗한 환경은 모두입니다. 이전 설치의 일부로 우리가 살고있는 환경에서 행복하게 디버깅하는 문제를 겪었을 수도 있습니다.

가장 쉬운 방법은 BeautifulSoup 라이브러리입니다. 우리는 최근에 v3에서 v4로 업데이트하였고, 그 일환으로 라이브러리 자체가 Py34의 이름을 BeautifulSoup에서 beautifulsoup4으로 변경했습니다. 우리는이를 반영하기 위해 requirements.txt을 업데이트,하지만 지금 우리에게 Heroku 환경에 pip list을 실행하면 둘 다 얻을 :

~ $ heroku run bash 
~ $ pip list 
BeautifulSoup (3.2.1) 
beautifulsoup4 (4.3.2) 

따라서, 기존의 종속성이 해제되지 않은, 그냥 거기에 앉아있다. 나는 파이썬 세션까지 발사 쉽게 충분히 증명할 수 : 이것은 가벼운 쇼크입니다

~ $ python 
Python 2.7.4 (default, Apr 6 2013, 22:14:13) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import bs4 
>>> import BeautifulSoup 
>>> 

을, 나는이 어떤 점에서 우리의 응용 프로그램을 살해하지 않았 음을 깜짝 놀라게?

그래서 Heroku는 어떻게 후드에서 종속성을 관리합니까? 분명히 파이썬 환경을 지우지 않고 각 배포시 pip install을 다시 실행하지 않습니다.이 동작을 강제로 수행 할 수있는 방법이 있습니까?

[EDIT 1]

FWIW,이다 설치 않는 buildpack - https://github.com/heroku/heroku-buildpack-python/blob/master/bin/compile

[EDIT 2

Heroku Buildpack 문서에서 :의

내용을 CACHE_DIR은 빌드간에 유지됩니다. 여기에서 의존성 분석과 같은 긴 프로세스의 결과를 캐시하여 향후 빌드 속도를 높일 수 있습니다.

그리고 further down :

빈은/스크립트를 컴파일하는 빌드 사이에 아티팩트를 저장하는 데 사용할 수있는 두 번째 인수로 cache_dir의 주어집니다. 이 디렉토리에 저장된 아티팩트는 연속 빌드 중에 CACHE_DIR에서 사용 가능합니다.CACHE_DIR은 슬러그 컴파일 중에 만 사용할 수 있으며 빌드중인 앱에만 적용됩니다.

권장 사항은 다음과 같습니다 Heroku가-REPO 플러그인을 사용할 수 있습니다

에게 Heroku의 사용자가 말했다 자신의 응용 프로그램

에 사용하는 buildpack에 의해 생성 된 빌드 캐시를 지우려면 - I 동안 미래의 컴파일 속도를 높이기 위해 캐시가 사용된다는 것을 이해하고, 캐시의 모든 요소가 왜 설치되어 있는지 이해할 수 없습니다. 그건 말이 안되니?

답변

3

는 Heroku가이 /app/.heroku/python에 파이썬 환경을 설치하고 전체 .heroku 디렉토리는 말에 다시 cache_dir의에 다음 각 빌드의 시작 부분에 cache_dir의에서 복사됩니다. (해당 buildpack 스크립트에서 restore_cachedump_cache을 검색하면이 행을 볼 수 있습니다.)

그래서 Heroku 앱에 일단 설치하면 CACHE_DIR이 아무렇게나 지워지지 않으면 그대로 유지됩니다. 분명히 이것은 이상적인 것은 아니지만 배포 할 때마다 모든 종속성을 다시 컴파일하고 설치하는 데 드는 빌드 시간을 피하기 위해 수행되었습니다. (필자가 생각하기에, 컴파일 된 패키지를 캐싱하기 위해 바퀴를 사용하여 이것을 달성하는 더 좋은 방법이 있다고 생각합니다. 모든 것을 다시 빌드 할 때까지 기다리지 않고도 매번 새로운 환경을 얻을 수 있습니다. 예제를 작성하고 찌를 수도 있습니다 Kenneth Reitz에 대해)

즉, 모든 종속성 (의존성 등의 종속성을 포함)의 버전을 명시 적으로 고정하는 것이 도움이되는 것처럼 들립니다. pip freeze > requirements.txt을 단순히 실행하면 좋은 시작이되지만, pip-tools을보고 싶을 수도 있습니다. 개발자가 방금 requirements.txt에서 자신의 환경을 다시 빌드하고 다른 버전의 패키지로 끝내는 방금 설명한 상황을 피하려고합니다.

BeautifulSoup의 경우 패키지 이름 (아마도 가져올 모듈의 이름은 아님)은 정말 끔찍하게 들리지만 정확히 Heroku의 캐싱이 무너지는 상황을 변경합니다. 유일한 해결책은 heroku-repo 플러그인을 사용하고 캐시를 완전히 핵으로 만드는 것이라고 생각합니다.

+0

종합적인 답변 주셔서 감사합니다. 우리는 완전한 고정을 사용하여 오랫동안 실행했지만 종속성의 의존성과 고정 된 버전 간의 불일치로 인해 잡혔습니다. 'heroko_repo'와'purge_cache'를 사용하면 환경을 깨끗이 정리할 수 있었고, 실제로 무슨 일이 일어나고 있는지 알 수있었습니다. 그것은 무엇보다도 가사에 관한 것입니다. 우리가 더 이상 환경에서 벗어나지 않는 오래된 deps를 가지고 있습니다. –

+0

추신 : buildpacks에 대해 KR을 파고 간 경우 -이 문제도 (디버깅의 일환으로) 우리를 트 랩핑했습니다. - https://github.com/heroku/heroku-buildpack-python/pull/152 –

관련 문제