※ 다중 프로젝트 템플릿을 만들기 전에, 

하나의 템플릿으로 합칠 프로젝트들을 커스텀 템플릿으로만들어 줍니다.  

(이전 글 참고 [VisualStudio] Template 생성 1. 하나의 프로젝트를 템플릿으로 만들기)

 저는 총 8개의 프로젝트가 하나의 템플릿으로 묶을것이므로, 일단 전부 각각의 템플릿으로 추출하였습니다.

 

1. 준비가 되었다면, 새로운 폴더를 하나 생성합니다. 이 폴더안에 미리 생성했던 템플릿 ZIP파일을 전부 풀어줄겁니다.

 

2. ZIP파일을 생성한 폴더에 하나씩 풀어줍니다. 이때 경로는 '새폴더 경로/프로젝트명' 으로 지정합니다.

 

3. vstemplate 파일 생성  

정상적으로 압축이 풀렸을 경우 새폴더 내에 프로젝트명으로 된 폴더가 생성되고, 해당 폴더안에는 프로젝트 구성요소들이 위치한것을 확인할 수 있습니다.

 전부 압축을 푼상태 입니다. 폴더 하나를 골라 들어가봅시다.

 

 어느 폴더든 'MyTemplate.vstemplate'이름의 파일이 있습니다. 이것을 복사해서 상위폴더레벨(새폴더\)에 붙여넣기 합니다. 

 

4. vstemplate 수정 

 붙여넣기 한 vstemplate 파일을 열어 다중프로젝트 템플릿에 맞게 수정합니다. 이제부터 이 vstemplate 파일을 '루트vstemplate'이라 명하겠습니다. 이 루트 vstemplate파일은 전체 다중 프로젝트 템플릿에 대한 파일로, 하위 vstmplate 파일을 모두 포함시킬 예정입니다.

 

4-1. VSTemplate 타입 수정

<VSTemplate Version="3.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<VSTemplate Version="3.0.0" Type="ProjectGroup" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" >

단일 프로젝트 템플릿 Type인 Project에서 다중 프로젝트 템플릿 Type인 ProjectGroup으로 변경합니다.

 

4-2. TemplateData 수정

 다중프로젝트의 Template Data에 적절한 정보를 기입해 수정합니다.

 <TemplateData>
    <Name>BaseMultiTemplate</Name>
    <Description>Base MultiTemplate</Description>
    <ProjectType>CSharp</ProjectType>
    <Icon>__TemplateIcon.ico</Icon>
  </TemplateData>
  • Name(필수) : 사용할 템플릿명
  • Description(필수) : 템플릿 설명
  • ProjectType(필수) : 프로젝트 타입
  • Icon(필수) : 프로젝트 생성 시 템플릿 목록에서 보여질 아이콘
  • ProjectSubType : 프로젝트 하위 타입 (https://github.com/MicrosoftDocs/visualstudio-docs.ko-kr/blob/live/docs/extensibility/projectsubtype-element-visual-studio-templates.md 참조)
  • SortOrder : 프로젝트 생성시 템플릿이 보여질순서
  • CreateNewFolder : 프로젝트 생성시 새로운 폴더 생성여부
  • DefaultName : 프로젝트 또는 항목을 만들 때 새 시스템에서 생성되는 이름을 지정합니다.
  • LocationField : 새 프로젝트 대화 상자의 위치 텍스트 상자를 프로젝트 템플릿에 대해 사용, 사용 안 함 또는 숨길지 여부를 지정 합니다.
  • EnableLocationBrowseButton : 사용자가 새 프로젝트가 저장 되는 기본 디렉터리를 쉽게 수정할 수 있도록 새 프로젝트 대화 상자에서 찾아보기 단추를 사용할 수 있는지 여부를 지정 합니다.
  • CreateInPlace : 프로젝트를 만들고 지정 된 위치에서 매개 변수 대체를 수행 하거나 임시 위치에서 매개 변수 대체를 수행 하 고 지정 된 위치에 프로젝트를 저장할 것인지 여부를 지정 합니다.

 

- Templates Data 요소(https://docs.microsoft.com/ko-kr/visualstudio/extensibility/templatedata-element-visual-studio-templates?view=vs-2022 참고)

 

4-3. TemplateContent 수정

프로젝트명에 동일한 이름을 사용하기 위해서 변수 파일 이름을 지정할 수 있습니다.($projectname$)

참조 : https://docs.microsoft.com/ko-kr/visualstudio/ide/template-parameters?view=vs-2022

 

-----------예시 템플릿 구조----------

□ Base.API (Project)

□ Base.API.Models (Project)

□ Base.API.Repositories (Project)

□ Base.API.Services (Project)

■ Contracts (폴더)

   └ Base.API.Contracts (Project)

■ Databases (폴더)

   └ Base.API.Entities (Project)

■ Libraries (폴더)

   └ Base.API.Utilites (Project)

   └ Base.API.LoggerService (Project)

-----------------------------------------

 제가 템플릿으로 만들고자 하는 다중프로젝트의 형태가 폴더속에도 프로젝트를 가지고 있기때문에, 해당 사항도 포함하여 템플릿을 만들어 보겠습니다.

<TemplateContent>
    <ProjectCollection>
      <ProjectTemplateLink ProjectName="$projectname$" CopyParameters="true">
        Base.API\MyTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="$projectname$.Models">
        Base.API.Models\MyTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="$projectname$.Repositories">
        Base.API.Repositories\MyTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="$projectname$.Services">
        Base.API.Services\MyTemplate.vstemplate
      </ProjectTemplateLink>
      
      //============폴더생성 후 폴더안에 프로젝트 템플릿 넣기===============
      //Contract 폴더안에 솔루션명.Contracts 프로젝트 생성
      <SolutionFolder Name="Contracts"> 
            <ProjectTemplateLink ProjectName="$projectname$.Contracts">
                Base.API.Contracts\MyTemplate.vstemplate
            </ProjectTemplateLink>
      </SolutionFolder>
      //Databases 폴더안에 솔루션명.Entities 프로젝트 생성
      <SolutionFolder Name="Databases"> 
            <ProjectTemplateLink ProjectName="$projectname$.Entities">
                Base.API.Entities\MyTemplate.vstemplate
            </ProjectTemplateLink>
      </SolutionFolder>
      //Libraries 폴더안에 솔루션명.Utilities, 솔루션명.LoggerService 프로젝트 생성
      <SolutionFolder Name="Libraries"> 
            <ProjectTemplateLink ProjectName="$projectname$.Utilities">
                Base.API.Utilities\MyTemplate.vstemplate
            </ProjectTemplateLink>
            <ProjectTemplateLink ProjectName="$projectname$.LoggerService">
                Base.API.LoggerService\MyTemplate.vstemplate
            </ProjectTemplateLink>
      </SolutionFolder>

    </ProjectCollection>
  </TemplateContent>

 

이렇게, VSTemplate 작성이 끝났습니다. 아래는 VSTemplate의 전문입니다.

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="ProjectGroup">
  <TemplateData>
    <Name>BaseMultiTemplate</Name>
    <Description>Base MultiTemplate</Description>
    <ProjectType>CSharp</ProjectType>
    <Icon>__TemplateIcon.ico</Icon>
  </TemplateData>
  
  <TemplateContent>
    <ProjectCollection>
       <SolutionFolder Name="Contracts">
            <ProjectTemplateLink ProjectName="$projectname$.Contracts">
                Base.API.Contracts\MyTemplate.vstemplate
            </ProjectTemplateLink>
        </SolutionFolder>
      
      <SolutionFolder Name="Databases">
            <ProjectTemplateLink ProjectName="$projectname$.Entities">
                Base.API.Entities\MyTemplate.vstemplate
            </ProjectTemplateLink>
      </SolutionFolder>
      <SolutionFolder Name="Libraries">
            <ProjectTemplateLink ProjectName="$projectname$.Utilities">
                Base.API.Utilities\MyTemplate.vstemplate
            </ProjectTemplateLink>
            <ProjectTemplateLink ProjectName="$projectname$.LoggerService">
                Base.API.LoggerService\MyTemplate.vstemplate
            </ProjectTemplateLink>
      </SolutionFolder>
      
      <ProjectTemplateLink ProjectName="$projectname$" CopyParameters="true">
        Base.API\MyTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="$projectname$.Models">
        Base.API.Models\MyTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="$projectname$.Repositories">
        Base.API.Repositories\MyTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="$projectname$.Services">
        Base.API.Services\MyTemplate.vstemplate
      </ProjectTemplateLink>
    </ProjectCollection>
  </TemplateContent>
</VSTemplate>

 

5. ZIP파일로 압축하기

VSTemplate작성이 완료 되었다면, 전체 파일을 묶어 ZIP파일로 압축합니다.(압축은 루트 vstemplate과 같은 레벨에서 이루어집니다.)

만들어진 압축파일의 이름을 구별 가능하게 변경하고 잘라내기(Ctrl+X)합니다.

 잘라내기 한 압축파일을 C:\Users\사용자이름\Documents\Visual Studio 2022\Templates\ProjectTemplates붙여넣기(Ctrl+V)합니다.

 

6. 프로젝트 생성

자, 이제 다중 프로젝트를 생성해봅시다.

 Visual Studio에서 새 프로젝트 생성을 선택할 경우, 템플릿을 선택하는 창에서 새로운 템플릿이 만들어진것을 확인할수 있습니다. 만들어진 템플릿 선택 후, 프로젝트 명을 기입해서 새 프로젝트 생성을 완료합니다.

폴더생성 프로젝트명이 공통적으로 적용이 정상적으로 이루어졌습니다.

 

7. 참조 프로젝트명 변경

 단 여기서 문제점이 있다면, 템플릿 기준이 되었던 제 솔루션안에서 프로젝트가 각각을 참조하고 있던 상태여서, 참조 프로젝트명은 기준 프로젝트의 명에서 변경되지 않은상태이기 때문에 실제로 빌드하면 에러가 발생합니다. (따로 프로젝트를 참조하지않았다면 에러발생 없이 바로 사용가능합니다.)

 이때는 Ctrl+Shift+H 단축키를 이용하여 이전 프로젝트 명을 지금 프로젝트 명으로 찾아서 변경(Find and Replace)하고 다시 빌드합니다.

성공적으로 빌드됐습니다.

이제 만들어진 템플릿으로 마구마구 다중 프로젝트를 생성할 수 있게 되었습니다. 

 

현재는 찾아 바꾸기로 문제를 해결하고있으나, 더 효율적인 방법이 있다면 댓글, 이메일 등으로 언제든지 알려주시기 바랍니다 :)

+ Recent posts