티스토리 뷰

반응형

어느 정도 개발에 익숙해지면 비슷한 종류의 프로젝트를 진행할 때에는 항상 사용하게되는 프레임워크라던가 유틸리티 성격의 클래스라던가 애플리케이션 시작/종료 코드의 패턴 같은 것들이 있기 마련이죠.
또는 IDE가 기본으로 제공하는 프로젝트 템플릿이 마음에 안들 수도 있겠지요.

Visual Studio는 오래전부터 새 프로젝트의 기본형을 프로젝트 템플릿으로 제공해왔습니다.
제대로 프로젝트 템플릿이나 프로젝트 아이템 템플릿을 작성하려면 http://msdn2.microsoft.com/en-us/library/s365byhx(VS.80).aspx를 참고해야 겠지만, 바쁜 세상에 언제 이걸 읽어보고 있겠습니까. 간단하게 하나 만들어보고 응용할 수 있으면 그만이죠. 좋은게 좋은것...

프로젝트 템플릿을 처음부터 만든다는건 거의 불가능할 뿐만 아니라 의미가 없는 짓이죠.
기존에 있던 프로젝트 템플릿을 열어서 수정하는게 훨씬 빠를겁니다.
우선 기본으로 제공되는 프로젝트 템플릿들이 어디에 있고 어떻게 구성되어있는지 보죠.

Visual Studio 2005를 기준으로 모든 프로젝트 템플릿은 [설치된 경로\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates]에 있습니다. 마찬가지로 아이템 템플릿은 [설치된 경로\Microsoft Visual Studio 8\Common7\IDE\ItemTemplates]에 있구요.


ProjectTemplates를 좀 더 자세히 보면...

새 프로젝트를 만들 때 나오는 프로젝트 종류와 같은 구조로 폴더와 파일이 있는 걸 확인할 수 있습니다.

어떤 폴더에는 1033이나 1042와 같은 숫자가 붙어 있는 경우가 있는데요, 이건 언어별 코드페이지를 말합니다. 예를 들어 1033이면 영문-미국이고 1042는 한국어-한국이죠. 더 정확한 내용은 잘 모르니까 만약 기똥차게 편리한 템플릿을 만들어서 배포하고 싶으시다면 MSDN을 참고하는게 나을 것 같습니다.

기존에 있던 WPF 윈도 애플리케이션 템플릿(WinFXApplication.zip)을 압축해제 해보면 다음과 같은 구조가 보입니다.


여기에서 가장 중요한 파일은 .vstemplate인데요, 이 파일은 프로젝트에 포함될 아이템들과 프로젝트의 이름, 설명 등을 지정하는 XML입니다. 메모장에서 열어보면 다음과 같은 항목들이 있습니다.

예제 : WinFXApplication.vstemplate

<?xml version="1.0" encoding="utf-8"?>

<VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.microsoft.com/developer/vstemplate/2005">

  <TemplateData>

    <Name>Windows Application (WPF)</Name>

    <Description>A project for creating an application with a .NET Framework 3.0 user interface</Description>

    <Icon>ProjectIcon.ico</Icon>

    <ProjectType>CSharp</ProjectType>

    <SortOrder>13</SortOrder>

    <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>

    <CreateNewFolder>true</CreateNewFolder>

    <DefaultName>WindowsApplication</DefaultName>

    <ProvideDefaultName>true</ProvideDefaultName>

    <MinFrameworkVersion>3.0</MinFrameworkVersion>

    <MaxFrameworkVersion>3.5</MaxFrameworkVersion>

  </TemplateData>

  <TemplateContent>

    <Project File="WinFXApplication.csproj" ReplaceParameters="true">

      <ProjectItem ReplaceParameters="true" TargetFileName="Properties\AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>

      <ProjectItem TargetFileName="Properties\Resources.resx">Resources.resx</ProjectItem>

      <ProjectItem ReplaceParameters="true" TargetFileName="Properties\Resources.cs">Resources.cs</ProjectItem>

      <ProjectItem TargetFileName="Properties\Settings.settings">Settings.settings</ProjectItem>

      <ProjectItem ReplaceParameters="true" TargetFileName="Properties\Settings.cs">Settings.cs</ProjectItem>

      <ProjectItem ReplaceParameters="true" OpenInEditor="true">Window1.xaml</ProjectItem>

      <ProjectItem ReplaceParameters="true" OpenInEditor="true" SubType="Code">Window1.xaml.cs</ProjectItem>

      <ProjectItem ReplaceParameters="true">App.xaml</ProjectItem>

      <ProjectItem ReplaceParameters="true" SubType="Code">App.xaml.cs</ProjectItem>

    </Project>

  </TemplateContent>

</VSTemplate>


루트 엘리먼트로 VSTemplate이 있고 하위 엘리먼트로 TemplateData와 TemplateContent가 있습니다.
그 아래로 있는 하위 엘리먼트들은 구질구질하게 설명하지 않아도 이름만 봐도 뭐하는건지 알 것 같지 않습니까?
Name, Description, Icon, ProjectType... Project, ProjectItem... 정말 여기서 더 설명을 한다는게 바보같이 느껴질 정도네요.
당연하겠지만 주의할 점이라면 TemplateData.Name 엘리먼트는 기존에 있던 프로젝트의 이름과 같으면 안되겠죠?

다음으로 WinFXApplication.csproj 파일을 열어봅니다. 잘 아시겠지만 이 파일이 바로 C#프로젝트를 정의하는 XML이구요, 중요한 부분만 보자면...

예제: WinFXApplication.csproj
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>

    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

    <ProjectGuid>$guid1$</ProjectGuid>

    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

    <RootNamespace>$safeprojectname$</RootNamespace>

    <AssemblyName>$safeprojectname$</AssemblyName>

    <WarningLevel>4</WarningLevel>

    <OutputType>winexe</OutputType>

...(중략)...

    <PublishUrl>Publish\</PublishUrl>

  </PropertyGroup>

...(중략)...

<ItemGroup>

    <ApplicationDefinition Include="App.xaml" />

    <Page Include="Window1.xaml" />

    <Compile Include="App.xaml.cs">

      <DependentUpon>App.xaml</DependentUpon>

      <SubType>Code</SubType>

    </Compile>

    <Compile Include="Window1.xaml.cs">

      <DependentUpon>Window1.xaml</DependentUpon>

      <SubType>Code</SubType>

    </Compile>

  </ItemGroup>

...(중략)...

</Project>


여기에서 실제 프로젝트에서 사용되는 .csproj와 다른 점이라면
<ProjectGuid>$guid1$</ProjectGuid>라던가 <RootNamespace>$safeprojectname$</RootNamespace>와 같은 곳에서 사용된 $...$치환자인데요, 이것도 역시 척보시면 알겠지만 $guid1$은 고유한 GUID를 임의로 생성해준다는 것을 의미하고 $safeprojectname$은 .vstemplate의 DefaultName을 바탕으로 ProjectName1, ProjectName2등의 프로젝트 명을 자동으로 생성해주는 것을 의미합니다.

이 치환자들은 나머지 다른 프로젝트의 아이템(.cs이나 .xaml 등)에서도 그대로 적용되죠.
치환자에 대한 자세한 설명은 http://msdn2.microsoft.com/en-us/library/eehb4faa(VS.80).aspx을 참고하세요.

다른 관련 파일들의 수정을 마쳤으면 모든 파일을 단순히 하나의 zip 파일로 압축하면 템플릿 패키지가 준비됩니다.

사용자가 생성한 커스텀 프로젝트 템플릿이나 아이템 템플릿은 VS가 설치된 경로아래에 있는 템플릿 폴더에 넣어도 새 프로젝트 위저드에서 보이질 않습니다. 대신 커스텀 템플릿은 [내 문서\Visual Studio 2005\Templates\ProjectTemplates]아래에 원하는 하위 폴더에 넣을 수 있고 새 프로젝트 위저드에서 다음과 같이 나타납니다.

사용자 삽입 이미지
MyTemplates항목에 Windowless Application (WPF)항목이 추가된 것이 보이죠?

예제로 만든 프로젝트 템플릿을 첨부했으니 원본과 비교해보시길 바랍니다.
WinFXWindowlessApplication.zip

윈도 없는 애플리케이션을 위한 기본 프로젝트 템플릿 (Windowless Application)


이런 방법으로 수정하는건 기존에 있던 프로젝트에서 간단히 몇 군데만 고칠 경우에 유용하겠구요, 좀 더 복잡한 프로젝트의 템플릿을 만들고 싶다면 템플릿 내보내기 기능을 쓸 수 있습니다.

먼저 프로젝트를 시작하시구요, 원하는 형태로 자유롭게 클래스, 컨트롤, 리소스 등을 추가하고 기본적인 코드도 작성합니다. 물론 이 프로젝트는 템플릿이니까 자주 사용되는 형태의 기본 뼈대만 작성하는건 당연하겠죠?

그리고 File->Export Template(한글판에는 아마 파일->템플릿 내보내기일겁니다. 제가 한글판이 없어서...)을 선택하면 다음과 같은 위저드가 나옵니다.

두가지 옵션이 있는데, 첫번째는 현재 프로젝트 전체를 프로젝트 템플릿으로 내보내는 것이고 두번째는 프로젝트의 아이템중 하나를 아이템 템플릿으로 내보내는것입니다. 프로젝트 템플릿으로 Next해볼까요?


이것도 당연하겠지만, Template icon에는 프로젝트의 기본 아이콘을 선택하고 Template name에는 원하는 프로젝트의 이름을 넣고 Template description에는 새 프로젝트 위저드에 표시할 설명을 넣습니다.
아래에 있는 옵션은 자동으로 Visual Studio의 커스텀 템플릿에 추가할지 여부와 출력이 끝난후 해당 파일을 보여줄지 여부네요. 둘다 체크 해놓고 Finish를 하면 새로 작성된 템플릿 파일이 [내 문서\Visual Studio 2005\My Exported Templates]에 출력됩니다.

그리고 새 프로젝트 만들기를 해보면...
사용자 삽입 이미지

My Templates에 아까 만든 TestProjectTemplate이 보이고 아이콘과 프로젝트 설명도 제가 지정한대로 나왔습니다.

그런데 템플릿 내보내기 방식은 내보낼 때 xaml 소스코드를 전혀 수정하지 않는다는 문제가 있는데요, 그래서 xaml 소스에서 메인 엘리먼트의 x:Class가 "TestProjectTemplate.App"와 같이 자동으로 템플릿 명이 붙지 않고 내보낼 때 원본으로 사용했던 코드가 그대로 나옵니다.
이 부분은 수작업으로 바꿔주는 수밖에 없네요.

제 경우는 항상 사용하긴하지만 별도의 어셈블리나 DLL로 배포하기는 애매한 Util 성격의 클래스와 프로젝트의 기본 설명 코멘트를 붙이는데 프로젝트 템플릿과 아이템 템플릿을 활용하고 있는데요, 이런 작업은 특히 팀단위 개발에서 프로젝트 가독성을 높히는데 크게 도움이 되니까 적극적으로 활용하는게 좋은 것 같습니다.

-----[2007.04.07 추가]-----
빼먹은게 있네요. 이렇게 생성한 커스텀 템플릿은 최초 사용시 다음과 같은 보안 경고 메시지를 보여줍니다.


당연한 얘기지만 템플릿에 대한 수정이 있었을 경우에도 다시 위와 같은 경고가 나옵니다. 누군가 악의를 담아 배포한 템플릿을 받아서 사용했을 때 받을 수 있는 불이익은 역시 사용자 몫이니까요. :(

반응형
댓글