2012-05-16 6 views
3

내 응용 프로그램은 Mochiweb을 사용합니다.Git 서브 모듈 및 보강재

{deps, [ 
    {mochiweb, ".*", 
    {git, "git://github.com/mochi/mochiweb.git", "master"}} 

내 응용 프로그램이 VCS를 가지고 있으며,이 자식입니다 : 내가 알고있는 것처럼 내가 make을 실행할 때이 rebar.config에서 선이기 때문에, rebar는 Github에서에서 최신 버전을 가져옵니다. 내가 다른 내부 자식 저장소를 추가하는 것은 좋은 생각 (git add .) 아니라는 것을 알고

myapp 
.git 
deps 
    mochiweb 
    .git 
src 
etc 

: 그래서, 기본적으로 나는 또 다른 하나 개의 내부 자식 저장소있다. Git 하위 모듈 기능을 사용해야합니다.

그래서 deps/mochiweb 디렉토리를 주 자식 저장소에 하위 모듈로 추가했습니다.

문제는 다른 개발자가 처음 deps/mochiweb을 얻기 위해 그가 initupdate 서브 모듈에있는 주요 저장소를 클론 할 때 (그렇지 않으면 빈 것)이다.

ERROR: Dependency dir deps/mochiweb failed application validation with reason: 

{missing_app_file,"deps/mochiweb"} 

make: *** [all] Error 1 

내 질문 : 의 deps에 다른 응용 프로그램을 추가하는 적절한 방법은 무엇

개발자는 단지 그가 메인 저장소를 클론 한 후 make 권리를 실행하는 경우

는 메이크는 다음을 말한다 Erlang 앱을 사용하여 git submodules을 사용하지 않고 다른 개발자가 쉽게 업데이트 할 수있게하려면 어떻게해야합니까?

답변

5

자식 서브 모듈을 사용하지 않고 다른 개발자가 쉽게 업데이트를 허용하는 얼랑 응용 프로그램의 deps에 다른 응용 프로그램을 추가하는 적절한 방법은 무엇입니까?

는 rebar.config 및 사용에 응용 프로그램을 추가

./rebar update-deps 

업데이트.

./rebar get-deps 

참조 : https://github.com/basho/rebar/wiki/Rebar-commands

이제 다시 오류에 처음으로, 당신은 사용할 필요가있다.

내 감정은 아마도 Git 서브 모듈로 연주 한 결과로 deps에 (거의) 빈 디렉토리가 있다는 것입니다. get-deps 명령을 실행할 때 디렉토리가 이미 있으므로 rebar는 mochiweb을 자동으로 버립니다. 그러나 OTP 응용 프로그램을 예상하고 거기에없는 mochiweb.app 파일을 찾습니다 (디렉토리가 비어 있음). 따라서 오류입니다. 내 해석이 맞다면, 당신은 간단하게 수행 할 수 있습니다

rm -rf deps/mochiweb 
./rebar get-deps 

, 그래도 도움이 될 것이다 당신의 rebar.config에 모양을 가졌어요.

+0

이 이슈에 대해 거의 3 일을 헤로큐로 보내려고하면. 이것은 결국 문제를 해결 ....... –

1

철근 get-deps 명령을 찾고 있다고 생각합니다. 좋은 예를 들어 Riak에서 사용한 Makefilerebar.config을 살펴보십시오.

+0

감사합니다. 내 rebar.config에 get-deps 명령이 있는데, 그것이 Makefile을 실행할 때 실패 할 것입니다. – skanatek

+0

Makefile과 rebar.config에서 지금 갖고있는 것을 공유 할 수 있습니까? – klm

4

우리의 내부 Erlang 프로젝트에서 우리는 Git subtree merge 참조 의존성에 접근합니다.

  1. github 모든 빌드 기계 (및 종속성에 대한 소스에서 액세스 할 수 있어야합니다 : 내 관점에서 비록 rebar get-deps는 기업 환경에서 좋은하지 않은 github 호스팅 프로젝트에 대한 종속성을 얻을 handly 방법입니다
  2. 당신은 당신이 특정 커밋을 가리킬 수 있습니다 (즉, 정확하지 의존 프로젝트 비전 수립에 의존) rebar.config에 하드 코드?). 뿐만 아니라 (그것의 버전을 업데이트하지 않고)하지만 일부 종속성 github에 업데이트되면, 프로젝트도 쉽게 나눌 수 있습니다 더 악화 (모든 그 시간에 종속) 과거에 프로젝트의 상태를 재현 할 수 없습니다 .
  3. 종속 프로젝트를 사용자 정의 하시겠습니까? 종속 프로젝트의 'rebar.config'파일에서 작은 변화처럼?

그래서 대신 get-deps 우리는 우리의 프로젝트 분기에 '출발'디렉토리로 병합 모든 종속 프로젝트와 자식 하위 트리 (원격 특정 github 프로젝트를 가리키는 +) 별도의 분기를 사용합니다. 효과적으로 우리는 주요 지점의 모든 종속성을 저장하지만, 그런 식으로 우리는 위의 모든 문제를 해결 :

  1. 당신은 우리의 내부 자식 저장소에서 (또는 DEV 등) 프로젝트의 주요 지점을 잡아 당겨 전체 코드베이스를 얻을. 즉시 제작 가능합니다.
  2. 모든 종속성의 정확한 버전은 하위 트리가 우리의 주 분기로 병합되고 우리가 원하거나 필요로 할 때만 새로운 종속성 버전으로 업데이트합니다 : 종속 브랜치로 전환하면 git pull이되고 하위 트리는 다음과 같은 특정 버전을 병합합니다. 메인 브랜치에 대한 의존성. 언제든지 전체 프로젝트의 이전 버전을 얻을 수 있습니다.
  3. 종속성은 자신의 지점에서 사용자 (또는 다른 사용자 정의 지점)는 의존성을 업데이트 할 시간이되면 할 수 있습니다 : 당신이 당신의 변경 git merge 최신 코드가하지만 그것은 보통 문제가되지 않습니다. 리모컨을 자신의 저장소 (github 또는 내부에 위치)로 지정할 수도 있습니다.

우리는 'github'에이 양식 (모든 종속성 포함)으로 프로젝트를 게시하지 않지만 별도의 분기에서 모든 종속성을 제거하고 ('dep'폴더 제거) 결과를 게시 할 수 있습니다 . 이 방법의 단점은 종속성 업데이트에 약간의 번거 로움이 있습니다. rebar get-deps 대신 업데이트 할 모든 종속성에 대해 git push + git merge -s subtree을 수행해야하지만 이는 엄격한 종속성 관리 및 빌드 용이성의 결과 일뿐입니다. 링크에 대한

+0

나는이 접근법을 정말로 좋아한다. 워크 플로우를 공유해 주셔서 감사합니다. – adammokan

+0

또한 github repo를 포크 한 다음 github에서 자신의 복사본을 사용할 수도 있습니다. 의존하는 버전의 태그를 지정하고 rebar.conf에서 태그를 구성 할 수 있습니다. 이렇게하면 모든 불안정이 사라지고 rebar.conf가 기본 저장소에서 버전 제어이기 때문에 나중에 버전을 사용할 수도 있습니다. 나는 github에 액세스하는 데 전혀 문제가 없었습니다. – mit