[scripting] msbuild를 사용하여 모든 파일 및 폴더 복사

누군가 내가 작성하려는 msbuild 스크립트로 나를 도울 수 있는지 궁금합니다. 내가하고 싶은 것은 msbuild를 사용하여 폴더의 모든 파일과 하위 폴더를 다른 폴더로 복사하는 것입니다.

{ProjectName}
      |----->Source
      |----->Tools
              |----->Viewer
                       |-----{about 5 sub dirs}

내가 할 수 있어야 할 일은 도구 폴더의 모든 파일과 하위 폴더를 응용 프로그램의 디버그 폴더로 복사하는 것입니다. 이것이 제가 지금까지 가지고있는 코드입니다.

 <ItemGroup>
<Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" />
 </ItemGroup>

<Target Name="BeforeBuild">
        <Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" />
  </Target>

빌드 스크립트는 실행되지만 파일 또는 폴더를 복사하지 않습니다.

감사



답변

나도 이것에 대한 도움을 찾고 있었다. 시간이 좀 걸렸지 만 여기 제가 한 일이 정말 잘 작동했습니다.

<Target Name="AfterBuild">
    <ItemGroup>
        <ANTLR Include="..\Data\antlrcs\**\*.*" />
    </ItemGroup>
    <Copy SourceFiles="@(ANTLR)" DestinationFolder="$(TargetDir)\%(RecursiveDir)" SkipUnchangedFiles="true" />
</Target>

이렇게하면 이름이 지정된 폴더의 내용 antlrcs$(TargetDir).


답변

항목 그룹을 만들고 복사 작업을 호출하는 방법에 문제가있을 수 있습니다. 이것이 의미가 있는지 확인하십시오.

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    <PropertyGroup>
        <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory>
        <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory>
    </PropertyGroup>

    <Target Name="BeforeBuild">
        <CreateItem Include="$(YourSourceDirectory)\**\*.*">
            <Output TaskParameter="Include" ItemName="YourFilesToCopy" />
        </CreateItem>

        <Copy SourceFiles="@(YourFilesToCopy)"
                DestinationFiles="@(YourFilesToCopy->'$(YourDestinationDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" />
    </Target>
</Project>


답변

나는 MSBuild에 익숙하지 않지만 EXEC Task가 이와 같은 상황에 편리하다는 것을 알았습니다. 나는 내 프로젝트에서 같은 도전을 만났고 이것은 나를 위해 일했고 훨씬 간단했습니다. 누군가가 좋은 습관이 아니라면 알려주세요.

<Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite">
    <Exec Command="xcopy.exe  $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" />
</Target>


답변

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    <PropertyGroup>
        <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory>
        <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory>
    </PropertyGroup>

    <Target Name="BeforeBuild">
        <CreateItem Include="$(YourSourceDirectory)\**\*.*">
            <Output TaskParameter="Include" ItemName="YourFilesToCopy" />
        </CreateItem>

        <Copy SourceFiles="@(YourFilesToCopy)"
                DestinationFiles="$(YourFilesToCopy)\%(RecursiveDir)" />
    </Target>
</Project>

\**\*.*모든 폴더에서 파일을 가져 오는 데 도움이됩니다. RecursiveDir는 모든 파일을 각 폴더에 넣는 데 도움이됩니다.


답변

대신 구체적인 대상 디렉토리를 지정하려고 했습니까?

DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" ?

저는 고급 MSBuild 구문에 능숙하지 않지만

@(Viewer->'$(OutputPath)\\Tools')

나에게 이상해 보인다. 스크립트가 좋아 보이므로 문제는 다음 값에있을 수 있습니다.$(ApplicationDirectory)$(OutputPath)

편집하다:

다음은 유용 할 수있는 블로그 게시물입니다.

방법 : 작업을 사용하여 재귀 적으로 파일 복사


답변

다음은 작동 한 예입니다.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

   <ItemGroup>
      <MySourceFiles Include="c:\MySourceTree\**\*.*"/>
   </ItemGroup>

   <Target Name="CopyFiles">
      <Copy
        SourceFiles="@(MySourceFiles)"
        DestinationFiles="@(MySourceFiles->'c:\MyDestinationTree\%(RecursiveDir)%(Filename)%(Extension)')"
       />
    </Target>

</Project>

출처 : https://msdn.microsoft.com/en-us/library/3e54c37h.aspx


답변

이것은 내 프로젝트에서 사용한 복사 작업이며 하위 폴더가있는 폴더를 성공적으로 대상에 복사하는 것이 완벽하게 작동했습니다.

<ItemGroup >
<MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" />
</ItemGroup>

<Target Name="AfterCopy" AfterTargets="WebPublish">
<Copy SourceFiles="@(MyProjectSource)"
 OverwriteReadOnlyFiles="true" DestinationFolder="$(PublishFolder)api/% (RecursiveDir)"/>

제 경우에는 프로젝트의 게시 폴더를 다른 대상 폴더에 복사했는데 귀하의 경우와 비슷하다고 생각합니다.