2017-10-22 6 views
0

저는 게임과 엔진에서 작업 중이며 둘 다 동시에 작업 중이므로 다음 (단순화 된) 디렉토리의 모든 프로젝트를 참조하는 솔루션 파일 하나가 있습니다. 구조 :Visual Studio 솔루션을 여러 (상호 의존적 인) 자식 저장소로 분리합니다.

Root 
├───Engine 
│ ├───Library1 
│ ├───Library2 
│ └───Library3 
├───Game 
│ ├───Game 
│ ├───Tool1 
│ └───Tool2 
└───GlobalSolution.sln 

빌드 프로세스는 모든 엔진 라이브러리를 컴파일하고 게임이 도구의 일부 비슷한 결과 정적 라이브러리에 링크되는 실행, 동안 하나의 정적 라이브러리로 연결합니다.

안타깝게도 엔진 자체가 실제로는 유용하지 않기 때문에 엔진과 하나의 저장소에 하나의 저장소가 있어야하지만 동일한 저장소에 모든 항목이 있습니다.하지만 자체적으로 컴파일 할 수는 있지만 자신의 저장소에서 호스팅 할 수 있어야하는 다른 게임을 만들고 싶을 수도 있습니다. 난 그냥 게임 솔루션의 라이브러리 경로에 $(SolutionDir)\..\Engine\Build\을 추가하여 엔진 라이브러리를 참조해야하는 경우

Root 
├───Engine 
│ ├───Library1 
│ ├───Library2 
│ ├───Library3 
│ └───EngineSpecificSolution.sln 
├───GameA 
│ ├───GameASpecifics 
│ ├───ToolA1 
│ ├───ToolA2 
│ └───GameASpecificSolution.sln 
└───GameB 
    ├───GameBSpecifics 
    ├───ToolB1 
    └───GameBSpecificSolution.sln 

: 내가 가지고 올 수

유일한 구조는 다음과 같다. 불행히도, 하나의 VS 창에서 모든 것을 (엔진과 게임) 사용하는 편리함을 잃어 가고 있으며 별도의 창에서 코딩해야 할 것입니다. 그렇지 않습니까? 그리고 물론, 엔진을 변경할 때마다 VS가 모든 프로젝트를 한 번에 처리하도록하는 대신 게임 솔루션을 수동으로 컴파일해야합니다.

프로젝트를 여러 저장소로 적절하게 분리하고 가능한 한 편리하게 작업을 유지하는 방법에 대한 제안이 있습니까?

답변

0

이것은 git submodules을 위해 생성 된 것입니다.

많은 사람들이 자식 서브 모듈이 작동하는 방식을 배우기가 쉽지 않으므로 처음에는 약간의 고통이있을 수 있지만 매우 익숙한 사람은 매우 유용한 도구입니다.

git-submodule의 구체적인 내용을 다루지는 않겠지 만, git-submodule 질문을 검색하는 것을 망설이지 말고, 새로운 질문을하고, 특정 지점에 대한 설명이 필요할 경우 의견을 내게 핑하십시오. .

첫째, 특정 자식 저장소에 Engine 프로젝트와 솔루션을 생성합니다 (.git 디렉토리는 자식의 repo이며, 무엇 무엇을 보여 그냥되지 않는 것입니다) : 자식으로

Root 
├───Engine 
    ├───.git/ 
    ├───Library1 
    ├───Library2 
    ├───Library3 
    └───EngineSpecificSolution.sln 

Root 
├───Engine 
│ ├───.git/ 
│ [...] 
├───GameA 
│ ├───.git/ 
│ ├───Engine 
│ │ ├───.git/ 
│ │ ├───Library1 
│ │ ├───Library2 
│ │ ├───Library3 
│ │ └───EngineSpecificSolution.sln 
│ ├───GameASpecifics 
│ ├───ToolA1 
│ ├───ToolA2 
│ └───GameASpecificSolution.sln 
└───GameB 
    ├───.git/ 
    ├───Engine 
    │ ├───.git/ 
    │ ├───Library1 
    │ ├───Library2 
    │ ├───Library3 
    │ └───EngineSpecificSolution.sln 
    ├───GameBSpecifics 
    ├───ToolB1 
    └───GameBSpecificSolution.sln 
: 다음 Engine 저장소 서브 모듈로 추가로

$ mkdir Engine && cd Engine 
$ git init 
** Create the Engine solution ** 
$ git commit -a -m "First commit for Engine" 
$ git remote add origin https://github.com/user/engine.git 
$ git push -u origin master 

그런 다음 당신은 당신에게 게임 디렉토리를 작성

$ mkdir GameA && cd GameA 
$ git init 

# The following command creates a link to the Engine submodule 
$ git submodule add https://github.com/user/engine.git Engine 

# The following command will clone the submodule's repository in place of Engine directory 
$ git submodule update 

** Create the GameA solution and add Engine projects to solution ** 
$ git commit -a -m "First commit for GameA" 
$ git remote add origin https://github.com/user/gamea.git 
$ git push -u origin master 

이제 엔진 코드 그러나 모든 것이 포함되어 하군요 있고, 그 특정의 엔진 저장소 커밋 참조 :

는 자식과 하군요을위한 솔루션을 만듭니다. GameA 만 변경하면 GameA에서 커밋을 만들어야합니다. GameA와 Engine 모두에서 변경 작업을 수행 할 때는 Engine에서 먼저 커밋을 생성 한 다음 GameA에서 커밋을 만들어야합니다.GameA의 커밋에는 참조 된 커밋이 변경되어 Engine에 대한 참조가 변경됩니다. 당신이 엔진을 변경하면

, 당신의 Root/Engine 또는 Root/GameA/Engine 또는 Root/GameB/Engine에 중 할 및 git pushgit push를 사용하여 변경 내용을 동기화 할 수 있습니다.

+0

나는 이것을 전에 사용하지 않았지만 나는 오늘 저녁에 그것을 시험해보고 내가 성공했는지 여부를보고 할 것이다. 모든 것을 설정 한 후 GitHub에서'GameA' 저장소를 가져 오면 자동으로'Engine'도 가져올 것인가? 그렇지 않으면 이것은 단지 당신의 묘사에서 보입니다. 아주 좋습니다. –

+0

서브 모듈을 사용하지 말고 다른 프로젝트에서 사용하는 너겟 패키지를 제작하고 게시하는 것을 권장합니다. – Philippe

+0

이것에 대해 조금 읽은 후에, 제 3 자의 종속성에는 좋지만 자신의 프로젝트에는 적합하지 않은 것으로 나타났습니다. 엔진을 변경한다고 가정하면, 게임 리포지토리의 참조를 엔진의 최신 커밋으로 수동으로 업데이트해야하는데, 이는 약간 불편합니다. 필자의 경우 게임과 엔진 폴더를 분리하는 것이 타사 저장소보다 엔진을 더 자주 업데이트해야하는 경우보다 약간 우수한 것으로 보입니다. –