7

(다음은 내가 작업하고있는 소스 코드를 구성 할 때 발생하는 복잡성의 "이론적 MCVE"의 한 종류입니다. 구체적인 문제는 그것이 좋을 것입니다. 또는 제기되는 일반적인 우려 사항을 언급하고 해결 방법을 제안 할 수 있습니다.)복잡한 저장소 구조 관리 - 모듈 종속성 및 공유 코드

A, B, C 및 D 코드의 모듈이 있다고 가정하십시오. A는 B ,CD; B는 C에 의존한다. C, D는 다른 모듈에 의존하지 않습니다. (나는 "모듈"이라는 용어를 느슨하게 사용한다.

또한 A, B, C, D 모두에서 몇 개의 동일한 헤더 파일이 사용되며 컴파일 된 객체까지도 사용되며 이러한 파일을 함께 넣어 다섯 번째 모듈을 구성하는 것은 적절하지 않습니다. 너무 작고 쓸모 없을 것입니다. 이 카테고리에 속하는 파일 중 하나가 foo.h입니다.

이러한 모듈은 모두 단일 모 놀리 식 코드 저장소에 보관되지만 모두 훌륭합니다. 정확히 모든 것이 하나의 사본입니다. 그래서 어떻게 버전 관리 저장소에 B의 각, C, D를 만들 수 있죠 : : 질문은

enter image description here

동일한 기능 등으로 컴파일 된 객체 사이에 링커 충돌하지

  • 각 모듈은 서브 모듈/하위 리파지토리 또는 다른 방법으로 종속되는 모듈의 존재 여부만으로 빌드 할 수 있습니다. 및
  • 같은 파일의 별도 버전을 유지 관리/업데이트하거나 한 라이브러리에서 다음 라이브러리로 이월 커밋을 할 필요가 없습니다 (지적한 수정 버전을 변경하는 경우 제외). 그리고
  • A가 빌드 될 때 모두 빌드 될 때, 빌드는 foo.h의 qudaruple 사본과 C의 이중 사본을 포함하지 않습니다 (A는 한 번, B는 한 번). 완벽하게 동기화됩니다.

더 많은 시간을 할애하면이 질문을 좀 더 구체적으로 만들 수 있습니다 (비록 광범위한 질문과 비슷 함). 내 구체적인 경우 코드가 현대 C++, CUDA, bash 스크립트 및 CMake 모듈이라고합니다. 자바 지향적 인 해결책은 그렇게하지 않을 것입니다.

+0

전체 시스템을 컴파일하는 데 몇 시간이 걸립니까? 2 시간에서 3 시간이 지나면 서브 레 포스로 나누지 말아야한다고 생각합니다. –

+0

@IanRingrose : 컴파일하는 데 몇 분이 걸리지 만 몇 시간이 걸리지 않습니다. 그러나 그 중 일부는 독립적으로 게시되었습니다 (하나 이상의 부분). 다른 사람들에 의해 각기 다른 부분에 작업을 분리하거나 다른 "모자"아래서 혼자서 작업하는 문제가 있습니다. – einpoklum

+1

힘내는 서브 모듈을 가지고 있습니다. 서브 모듈을 통해 다른 저장소 내에서 하나의 저장소에 대한 특정 커밋을 참조 할 수 있습니다. (서브 모듈의 소스를 볼 수는 있지만, 점프를하지 않고 변경할 수는 없습니다.) 그것은 가치가있을 수 있습니다. 그래서 git 서브 모듈에 관해서는 많은 질문이 있습니다. –

답변

1

VERY BRIEFLY, 이슈 저장소 (Artifactory) 및 종속성 관리 솔루션 (Ivy, Maven, Gradle)을 살펴볼 수 있습니다. 그런 다음 공유 기본 모듈이 빌드되면이 파일을 아티팩트 저장소에 저장합니다. 공유베이스 모듈에 의존하는 최상위 모듈을 빌드하고자 할 때; 빌드 스크립트는 단순히 공유 기반 모듈의 마지막 버전을 끌어 내고 끌어 내려 놓은 것에 대해 최상위 모듈을 링크/컴파일합니다.

+1

(1)이 기사를 읽는 것을 권장할만한 곳에 링크를 추가 할 수 있습니까? (2) "인공물"과 "의존적 인 관리 솔루션"은 상호 보완 적이거나 상충되는가요? 아니면 직각입니까? (3) Ivy, Maven 및 Gradle이 Java 지향적이지 않습니까? – einpoklum

+0

@einpoklum 예, 자바 용입니다. 그것은 그들을 위해 자바 스크립트를 사용할 수 있지만 C는 그렇게 생각하지 않습니다. – Walfrat