우리는 하나의 개발자와 모든 코드를 포함하는 하나의 svn 저장소로 시작했습니다.
^/foo/trunk/module-a
^/foo/trunk/module-b
^/foo/trunk/module-b/submodule-b1
^/foo/trunk/website1
(당시 이것은 큰 개선이었습니다). 이것이 조금 성장할 기회를 얻은 후에 우리는 순환 의존성, 느린 테스트 슈트 및 코드 재사용에 어려움을 겪기 시작했습니다 (예 : website1의 기능 세트가 일반 모듈-a로 바뀌 었 기 때문에).
코드베이스를 모듈화하고 git으로 곧 이동하고 git이 svn mega-repos를 좋아하지 않는 곳을 읽기를 기대하면서 훨씬 더 세분화 된 구조로 전환했습니다.
^/module-a/trunk/
^/module-b/trunk/
^/module-b/trunk/sumbmodule-b1
^/earlier-sub-sub-sub-module-c/trunk
etc. (about 120 such modules)
이것은 개념적으로 훌륭했습니다. 더 모듈화 된 코드, 훨씬 빠른 테스트 슈트, 문서화 등. 우리는보다 일반적인 구성 요소 중 일부를 오픈 소싱했으며 모든 모듈을 pip 설치 가능하게 만들었습니다 (virtuenv에 설치하는 pip install -e .
데 사용 development
).
우리 ^/srv/trunk
는 런타임 환경의 폴더 구조를 포함 하는 저장소를 만들었습니다 . 웹 사이트 등을위한 ^/srv/trunk/lib
모듈, /srv/trunk/src
유적 ^/foo/trunk
,^/srv/trunk/www
그리고 마지막으로 (perforce에서 아이디어를 얻었습니다. 아주 오래 전에 [ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html] ) 우리는 "vcs- fetch "텍스트 파일에 모든 관련 리포지토리와 dev 환경으로의 체크 아웃 위치 및 해당 명령이 나열되어 있습니다. 예를 들어 vcs-fetc 줄 :
svn srv/lib/module-a ^/module-a/trunk
(처음)
cd /srv/lib && svn co ^/module-a/trunk module-a
또는 (나중에)
cd /srv/lib/module-a && svn up
github repos (자체 및 변경 / 변경되지 않은 공급 업체 패키지 모두)와 유사합니다.
프로덕션 환경을 만드는 데 동일한 vcs-fetch 프로세스를 사용했지만 vcs-fetch를 수행 한 후 prod에서 어떤 버전을 실행했는지 알 수있는 방법이 없다는 것을 빨리 알게되었습니다.
mega-repo를 사용하면 트렁크에서 prod를 업데이트하기 전에 개정 번호를 확인할 수 있었으며 다시 돌아가는 것이 간단했습니다 svn -r nnn up .
. svn 및 git (및 hg의 하나의 모듈)와 ~ 120 repos의 코드 로이 작업을 수행하는 방법은 분명하지 않습니다.
오늘 http://12factor.net/을 읽었 으며 첫 번째 요소는 "하나의 코드베이스"이므로 올바른 경로를 벗어난 지 궁금합니다.
필자가 생각한 한 가지 아이디어는 pip-installable "deployment"-wheel을 생성하고 requirements.txt
파일로 함께 "번들"하는 deploy 스크립트를 작성하는 것이 었습니다 . 그런 다음 배포에는 새 virtualenv 생성, 배포 휠을 나열하는 requirements.txt 파일을 pip 설치 및 활성 virtualenv 전환이 포함됩니다. 이전으로 되 돌리는 것은 virtualenv를 다시 전환하는 것과 관련이 있습니다 (그러나 virtualenv를 영원히 유지하고 싶지 않다면 어느 시점으로도 돌아갈 수 없었습니다.
이 시점에서 내가 잘못된 방향으로 걷고 있는지, 또는 올바른 길을 충분히 걷지 못했는지 궁금합니다 ..? (내가 읽는 모든 것은 "귀하의 앱"에 대해 계속 이야기하고 있으며, 동일한 코드베이스에서 14 개의 웹 사이트를 실행하는 방법을 모르겠습니다 ...)