2014-09-05 5 views
0

저는 연구 프로젝트를 구성하는 더 좋은 방법을 찾고 있습니다. 다음과 같은 설정이 있습니다 :프로젝트 구조. Scientific Python projects

a, b, clib 라이브러리가 있습니다. 각 프로젝트는 다른 리서치 질문을 다루며 라이브러리는 프로젝트 전반에 걸쳐 사용되는 코드를 전달합니다. 따라서 모든 프로젝트는 lib에 의존합니다. 프로젝트 c은 프로젝트 ab에 따라 복잡해집니다. 프로젝트 c에서 작업 할 때 a, b 또는 lib을 동시에 업데이트합니다. 각 프로젝트는 별도의 자식 저장소에 있습니다.

지금까지 위의 종속성을 git submodule을 통해 포함 시켰으며 모든 소스 파일은 프로젝트의 루트 디렉토리에 있습니다. 이점은 내 프로젝트가 어떤 버전의 lib인지 계속 추적한다는 것입니다. 또한 내 프로젝트 중 하나는 lib의 구형 버전에 의존 할 수 있습니다. 모든 패키지를 사이트 패키지에 "설치"하지 않고 루트 디렉토리에서 모든 것을 실행합니다. 경로가 올바르게 설정되지 않은 경우 sys.path.insert을 통해 재정의합니다.

그러나, 다음과 같은 점은 내가 레이아웃을 변경할 수 있도록 : 내가 편집하고 lib의 버전 추적을 잃고 계속

  • .
  • 표준 프로젝트 설정으로 처리하기가 훨씬 쉬운 자동 테스트 도구 (tox, jenkins 등)를 사용하고 싶습니다.
  • sys.path.insert 디버그하기 어려운 미묘한 문제가 발생할 수 있습니다.
  • 나는 보통 모든 프로젝트가 lib의 팁으로 작업하기를 원합니다.

따라서 나는 현재 표준 파이썬 디렉토리 구조에 부합되도록 모든 프로젝트 (especiall lib)를 재 배열 오전 virtualenv에서 작동 할 수 있도록 (하위 디렉토리에 저장된 소스, 루트는 setup.py 파일이 포함되어 있습니다). 그렇다면 내 모든 의존성을 requirements.txt에 나열 할 수 있습니다. 먼저 pip install -e를 통해 lib을 설치합니다. 그런 다음 pip freeze> requirements.txt를 실행하면 다음과 비슷한 줄이 포함됩니다.

-e git+<path_to_remote>@<sha>#egg=`lib` 

그래서 다시 내가 특정에 대한 의존성이 내가 늙은 커밋 체크 아웃 할 수 있고 프로젝트가 실행되도록 보장 git submodule와 마찬가지로 (SHA)를 커밋 발생했다. virtualenv에 모든 것을 설치할 수 있으며 경로 문제를 해결할 수 있습니다. 큰.

나는 새로운 문제에 직면 해있다. 한 가지 문제는 requirements.txt의 sha 업데이트 방법입니다. 가장 쉬운 (그러나 아마도 가장 우아한) 솔루션은 커밋하기 전에 sha를 업데이트하는 pre-commit hook을 작성하는 것입니다. 더 좋은 방법이 있습니까?

그리고 더 일반적으로 - 제 설정이 더 좋은 해결책이 있습니까?

답변

0

나는 당신이 대부분 당신의 문제를 해결했으며, 작은 비트 만 남았음을 알았습니다.

1) 라이브러리의 버전을 식별하는 데 해시를 사용하지 마십시오.라이브러리를 Cheese Shop에 게시하지 않더라도 일반적인 라이브러리 버전 관리 (semver)를 수행하고 리포지토리에 태그를 지정하십시오. 귀하의 git+https://github.com/... 종속성 URL에 인간이 읽고 관리 할 수있는 버전을 갖출 것입니다.

2) 최신 repo 버전에서 종속성의 안정 버전 (지난 번 태그)과 마스터 버전을 테스트 할 수있는 방식으로 tox를 설정하십시오.