나는 Git 서브 모듈을 좋아한다 . 버전과 함께 종속성을 추적 할 수 있기 때문에 이전 버전의 프로젝트로 롤백하고 해당 버전의 종속성을 안전하고 깨끗하게 빌드 할 수 있습니다. 또한 라이브러리 히스토리는 라이브러리 히스토리가 라이브러리에 종속 된 (및 오픈 소스되지 않을) 애플리케이션과 분리되어 있으므로 오픈 소스 프로젝트로 라이브러리를 공개하는 것이 더 쉽습니다.
직장에서 여러 프로젝트에 대한 워크 플로를 설정하고 있는데, 단일 모 놀리 식 프로젝트를 사용하는 대신이 접근법을 약간 극단적으로 사용하면 어떻게 될지 궁금합니다. 실제로 서브 모듈을 사용 하는 경우 웜의 가능성이 있음을 금방 깨달았습니다 .
: 응용 프로그램의 한 쌍의 치죠 studio
하고 player
, 그리고 종속 라이브러리 core
, graph
그리고 network
다음과 같이 의존성은 :
core
독립형graph
에 따라core
(서브 모듈./libs/core
)network
에 정의 됨core
(의 서브 모듈./libs/core
)studio
에 의존graph
하고network
(AT 서브 모듈./libs/graph
및./libs/network
)player
에 의존graph
하고network
(AT 서브 모듈./libs/graph
및./libs/network
)
CMake를 사용 하고 있으며 각 프로젝트에 단위 테스트와 모든 작업 이 있다고 가정 합니다. 코드 메트릭, 단위 테스트 등을 수행하려면 각 프로젝트 ( studio
및 포함 player
)를 독립형으로 컴파일 할 수 있어야합니다.
문제는 재귀 적 git submodule fetch
이며 다음 디렉토리 구조를 얻습니다.
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/graph/
studio/libs/graph/libs/ (sub-module depth: 2)
studio/libs/graph/libs/core/
studio/libs/network/
studio/libs/network/libs/ (sub-module depth: 2)
studio/libs/network/libs/core/
공지 사항 core
두 번 복제되는 studio
프로젝트. 이 낭비되는 디스크 공간 외에도 core
두 번 빌드 하고 두 개의 다른 버전이 생길 수 있으므로 빌드 시스템 문제 가 core
있습니다.
질문
공통 중첩 하위 모듈의 여러 복사본을 얻지 않고 버전 종속성 및 독립 실행 형 빌드를 얻도록 하위 모듈을 구성하는 방법은 무엇입니까?
가능한 해결책
라이브러리 종속성이 약간의 제안 (예 : "버전 X로 작업하는 것으로 알려진"또는 "버전 X 만 공식적으로 지원됨"방식)이고 잠재적 인 종속 응용 프로그램 또는 라이브러리가 원하는 버전으로 빌드해야하는 경우 다음 시나리오를 상상할 수 있습니다.
- 빌드 시스템을 준비
graph
하고network
찾을 위치를 알려주십시오core
(예 : 컴파일러 포함 경로를 통해). "독립형"및 "종속성"이라는 두 개의 빌드 대상을 정의하십시오. 여기서 "독립형"은 "종속성"을 기반으로하며 로컬core
하위 모듈 을 가리키는 포함 경로를 추가합니다 . - 추가 종속성을 소개하십시오 :
studio
oncore
. 그런 다음studio
buildscore
, 포함 경로를core
하위 모듈 의 자체 복사본으로 설정 한 다음 빌드graph
하고network
"종속성"모드로 설정합니다.
결과 폴더 구조는 다음과 같습니다.
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/core/
studio/libs/graph/
studio/libs/graph/libs/ (empty folder, sub-modules not fetched)
studio/libs/network/
studio/libs/network/libs/ (empty folder, sub-modules not fetched)
그러나,이 몇 가지 빌드 시스템 마술 (나는이 CMake와 함께 할 수 꽤 확신) 및 버전 업데이트 부분에 수동 약간의 작업 (업데이트가 필요 graph
또한 업데이트가 필요할 수 core
와 network
의 호환 버전을 얻기 위해 core
모든 프로젝트를) .
이것에 대한 생각?