변환은 한 항목 목록을 다른 항목 목록으로 일대일로 변환하는 것입니다. 변환을 사용하면 Visual Studio의 프로젝트가 항목 목록을 변환할 수 있습니다. 또한 변환을 통해 대상은 입력과 출력 간의 직접 매핑을 식별할 수 있습니다.
이 문서에서는 변환과 MSBuild(Microsoft Build Engine)가 변환을 사용하여 프로젝트를 보다 효율적으로 빌드하는 방법을 설명합니다.
변환 한정자
변환은 임의로 정의되지 않습니다. 각 변환은 형식의 한정자로 식별됩니다 %(\<ItemMetaDataName>)
. 만들 때 모든 항목에 할당된 잘 알려진 항목 메타데이터를 포함하여 모든 항목 메타데이터를 변환 한정자로 사용할 수 있습니다. 잘 알려진 항목 메타데이터 목록은 MSBuild 잘 알려진 항목 메타데이터를 참조하세요.
다음 예제에서는 .resx 파일 목록을 .resources 파일 목록으로 변환합니다.
%(filename)
변환 한정자는 각 .resources 파일의 파일 이름이 해당 .resx 파일과 같게 지정합니다.
@(RESXFile->'%(filename).resources')
항목 목록의 @(RESXFile)
항목이 Form1.resx, Form2.resx 및 Form3.resx인 경우 변환된 목록에는 Form1.resources, Form2.resources 및 Form3.resources 출력이 포함됩니다.
비고
변환된 목록의 항목에 대한 기본 구분 기호는 세미콜론 ;
입니다. 표준 항목 목록의 구분 기호를 지정하는 것과 동일한 방식으로 사용자 지정 구분 기호를 지정할 수 있습니다. 항목을 쉼표 ,
로 구분하려면 구문을 @(RESXFile->'Toolset\%(filename)%(extension)', ',')
사용합니다.
여러 변환 한정자
변환 식은 순서에 따라 결합할 수 있고 반복될 수 있는 여러 한정자를 포함할 수 있습니다. 다음 예제에서는 파일이 포함된 디렉터리의 이름이 변경되지만 파일은 원래 이름과 파일 이름 확장명을 유지합니다.
@(RESXFile->'Toolset\%(filename)%(extension)')
항목 목록의 RESXFile
항목이 Project1\Form1.resx, Project1\Form2.resx 및 Project1\Form3.text인 경우 변환된 목록에는 Toolset\Form1.resx, Toolset\Form2.resx 및 Toolset\Form3.text 출력이 포함됩니다.
대상 매핑 및 종속성 분석
변환은 변환된 항목 목록과 원래 항목 목록 간의 일대일 매핑을 보장합니다. 대상이 입력의 변환인 출력을 만드는 경우 MSBuild는 입력 및 출력의 타임스탬프를 분석할 수 있습니다. MSBuild는 이 정보를 사용하여 대상을 건너뛰거나 빌드하거나 부분적으로 다시 빌드할지 여부를 결정합니다.
다음 예제에서는 복사 태스크 의 입력을 출력으로 변환합니다. 입력 항목 목록의 모든 파일은 BuiltAssemblies
특성의 변환을 사용하여 지정한 작업의 대상 폴더에 있는 Outputs
파일에 매핑됩니다. 항목 목록의 BuiltAssemblies
파일이 변경 Copy task
되면 변경된 파일에 대해서만 실행되고 다른 모든 파일은 건너뜁니다.
<Target Name="CopyOutputs"
Inputs="@(BuiltAssemblies)"
Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">
<Copy
SourceFiles="@(BuiltAssemblies)"
DestinationFolder="$(OutputPath)"/>
</Target>
종속성 분석 및 변환을 사용하는 방법에 대한 자세한 내용은 새 대상 또는 부실 대상에 대한 MSBuild 증분 빌드를 참조하세요.
변환이 있는 프로젝트 파일
다음 예제에서는 변환을 사용하는 MSBuild용 프로젝트 파일을 보여 줍니다. 이 예제에서는 c:\sub0\sub1\sub2\sub3 디렉터리에 .xsd 파일이 하나만 있고 작업 디렉터리가 c:\sub0이라고 가정합니다.
<Project>
<ItemGroup>
<Schema Include="sub1\**\*.xsd"/>
</ItemGroup>
<Target Name="Messages">
<Message Text="rootdir: @(Schema->'%(rootdir)')"/>
<Message Text="fullpath: @(Schema->'%(fullpath)')"/>
<Message Text="rootdir + directory + filename + extension: @(Schema->'%(rootdir)%(directory)%(filename)%(extension)')"/>
<Message Text="identity: @(Schema->'%(identity)')"/>
<Message Text="filename: @(Schema->'%(filename)')"/>
<Message Text="directory: @(Schema->'%(directory)')"/>
<Message Text="relativedir: @(Schema->'%(relativedir)')"/>
<Message Text="extension: @(Schema->'%(extension)')"/>
</Target>
</Project>
이 예제에서는 다음 출력을 생성합니다.
rootdir: C:\
fullpath: C:\sub0\sub1\sub2\sub3\myfile.xsd
rootdir + directory + filename + extension: C:\sub0\sub1\sub2\sub3\myfile.xsd
identity: sub1\sub2\sub3\myfile.xsd
filename: myfile
directory: sub0\sub1\sub2\sub3\
relativedir: sub1\sub2\sub3\
extension: .xsd