2016-06-03 2 views
0

디렉터리 목록에서 특정 파일을 가져 와서 다른 이름의 파일을 같은 디렉터리에 복사하는 MSBuild 대상을 작성하려고합니다. "대상"이름은 디렉토리에 직접 종속됩니다.MSBuild 복사 작업 및 상관 관계 메타 데이터 일괄 처리

의이 예제를 설명하자

|-\Source\MySolution.ProjectFoo\ 
| -- App.config.tpl 
| -- MySolution.ProjectFoo.exe 
| -- (Target) MySolution.ProjectFoo.exe.config.tpl 
|-\Source\MySolution.ProjectBar\ 
| -- App.config.tpl 
| -- MySolution.ProjectBar.exe 
| -- (Target) MySolution.ProjectBar.exe.config.tpl 

내가 구축하기 시작했다 나의 이런 ItemGroup : 나는 Correlate 메타 데이터 속성에 배치 할 수 있도록 기대했다

<ItemGroup> 
    <AppConfigTemplates Include="Source\**\App.config.tpl"> 
     <Correlate>%(RecursiveDir)</Correlate> 
    </AppConfigTemplates> 
    <ExeFiles Include="Source*\**\*.exe"> 
     <Correlate>%(RecursiveDir)</Correlate> 
    </ExeFiles> 
</ItemGroup> 

. 예 :

<Copy Batch="%(Correlate)" SourceFiles="%(AppConfigTemplates.FullPath)" 
          DestinationFiles="%(ExeFiles.FullPath).config.tpl" /> 

어떻게하면됩니까?

답변

1

그런 식으로 개별 항목 그룹을 '상관'할 수도 있지만 동일한 순서로 항목의 수가 동일해야합니다 (예 : exe는 있지만 .tpl은없고 부통령은 제외). -versa), 아마도 엉망이 될 것입니다. 더 간단한 해결책은 exe 파일을 나열하고 tpl 파일 (고정 된 이름이있는 경우)을 복사하는 것입니다.

<ItemGroup> 
    <ExeFiles Include="Source\**\*.exe"> 
    <!-- expected location of the tpl: same directory --> 
    <AppConfigTpl>%(RootDir)%(Directory)App.config.tpl</AppConfigTpl> 
    </ExeFiles> 
</ItemGroup> 

<Target Name="CopyTpl"> 
    <Copy SourceFiles="%(ExeFiles.AppConfigTpl)" 
     DestinationFiles="%(ExeFiles.FullPath).config.tpl" 
     Condition="Exists('%(ExeFiles.AppConfigTpl)') /> 
    <!-- If needed you could raise an error like this --> 
    <Error Text="oops no tpl" Condition="!Exists('%(ExeFiles.AppConfigTpl)')" /> 
</Target> 
+0

그게 정확히 내가 원하는 해결책입니다! 감사! – MarioDS