2013-05-14 4 views
1

내가 발견 한 몇 가지 다른 유사한 답변을있는 전체 디렉토리를 복사, 그러나 아무도 내 질문에 응답하지 :MSBuild에서 여기

Copying entire project structure into another directory using afterbuild task

Copy all files and folders using msbuild

MSbuild Copy whole folder

을 내가 뭘하려고하는지 :

나는 여러 다른 디렉토리 트리로 복사해야한다. 컴파일시 프로젝트의 장소. 여기 그것이 현재 수행되는 방법입니다

<ItemGroup> 
    <MediaFiles Include="$(ProjectDir)media\**\*.*" /> 
    <DeployLabel Include="$(ProjectDir)deploy\x"> 
     <Dir>x</Dir> 
    </DeployLabel> 
    <DeployLabel Include="$(ProjectDir)deploy\y"> 
     <Dir>y</Dir> 
    </DeployLabel> 
    <DeployLabel Include="$(ProjectDir)deploy\z"> 
     <Dir>z</Dir> 
    </DeployLabel> 
    </ItemGroup> 
    <Target Name="GenericDeploy" 
      Inputs="@(DeployLabel)" 
      Outputs="%(Identity).Dummy"> 
    <Message Text="Deploying: @(DeployLabel)" /> 
    <Copy SourceFiles="@(MediaFiles)" 
      DestinationFiles="@(MediaFiles->'$(ProjectDir)deploy%(Dir)media\%(RecursiveDir)%(Filename)%(Extension)')"/> 

이 실행하는 척하지만, 복사 아무것도 전혀. %(DeployLabel.Dir)도 사용하려고했지만 오류가 발생합니다.

xcopy을 사용하고 싶지 않습니다.이 프로그램이 Windows 설치의 기본 인벤토리에없는 것 같습니다 (내 컴퓨터에는이 프로그램이 없습니다). 또한 나는 고백해야한다, 나는 무엇이 % thingy가하는 것을 완전히 이해하지 않는다. 처음에 @ 및 %를 보았을 때, Make에서 복사 된 것으로 생각했지만 이제는 의심 스럽습니다 ... ->이 의미하는 바가 무엇인지에 대한 통찰도 있습니다.이 비밀스러운 이름에 대한 문서를 찾는 것은 매우 어렵습니다.

답변

1

OK, 실제로 어떻게 든 그것을 해결,하지만 난 여전히 "보너스"질문에 대답에 관심이 있어요/아마 내 솔루션은 좋지 않다 :

내가 대상 내부 PropertyGroup을 추가하고이 경로를 연결된 : 두 개의 서로 다른 PL에서 오는

는 나중에 그 목표에 내가 대신

DestinationFiles="@(MediaFiles->'$(Deploydir)\%(RecursiveDir)%(Filename)%(Extension)')" 

사용

<PropertyGroup> 
    <Deploydir>$(ProjectDir)deploy\%(DeployLabel.Dir)\media</Deploydir> 
</PropertyGroup> 

, 그래서 이것은 (아마도) 퍼센트와 문제를 피할 수 에이스.

+0

나에게 잘 보이는 : - - \

\ %를 사용하여 C를 \ TMP \ myFile2.txt. –

1

일괄 처리의 일부 조합이 다른 ItemGroup과 작동하고 일부 조합이 작동하지 않기 때문에 이러한 일괄 처리는 매우 혼란 스럽습니다. 나는 약간의 차이를 보여주기 위해 작은 PROJ를 만들 :

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Batch" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
<ItemGroup> 
    <BatchItem Include="myFile.txt"> 
    <Folder>c:\Temp</Folder> 
    </BatchItem> 
    <BatchItem Include="myFile2.txt"> 
    <Folder>c:\Tmp</Folder> 
    </BatchItem> 

    <DifferentItem Include="myFile3.txt"> 
    <Folder>c:\diff</Folder> 
    </DifferentItem> 
</ItemGroup> 

<Target Name="Batch"> 
    <Message Text="Using (at) @(BatchItem) -- @(DifferentItem)" /> 
    <Message Text="Using -> @(BatchItem->'%(Folder)\somethingInbetween\%(Identity)') -- @(DifferentItem->'%(Folder)\somethingInbetween\%(Identity)')" /> 
    <Message Text="Using percent %(BatchItem.Folder)\%(BatchItem.Identity) -- %(DifferentItem.Folder)\%(DifferentItem.Identity)" /> 
</Target> 
</Project> 
  • 첫 번째는 바로 모든 문자열 세미콜론 분리에있는 항목 이후에 넣어 것입니다.
  • 두 번째 항목은 한 항목의 특정 메타 데이터를 사용하여 문자열을 만듭니다. 이것은 모든 요소에 대해 수행되며 세미콜론은 하나의 항목으로 분리됩니다.
  • 세 번째 표현식은 항목의 메타 데이터를 참조하지만 그룹의 각 항목에 대한 대상도 호출합니다. 그렇게하면 ItemGroups를 혼합 할 수 없습니다. \ TMP \ somethingInbetween \ myFi le2.txt :; C \ 온도 \ somethingInbetween \ MYFILE.TXT :; MYFILE.TXT (AT)를 사용

    myFile2.txt는 -> C - 사용

    을 myFile3.txt - c : \ diff \ somethingInbetween \ myFile3.txt

    % c : \ Temp \ myFile을 사용합니다.TXT - %의 C를 사용하여

    \ : \ DIFF \ myFile3.txt

+0

이것에 관해 좋은 문서를 읽은 것을 기억할 수는 없지만 일괄 처리 및 변환은 올바른 이름이어야합니다. http://msdn.microsoft.com/en-us/library/ms171469.aspx 저에게있어서 그것은 "노력함으로써 학습"을 많이;) – MikeR