your programing

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

lovepro 2020. 10. 6. 18:51
반응형

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


개인적으로 저는 SDC Tasks Library의 일부인 CopyFolder를 사용했습니다.

http://sdctasks.codeplex.com/


This is copy task i used in my own project, it was working perfectly for me that copies folder with sub folders to destination successfully:

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

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

In my case i copied a project's publish folder to another destination folder, i think it is similiar with your case.


The best way to recursively copy files from one directory to another using MSBuild is using Copy task with SourceFiles and DestinationFiles as parameters. For example - To copy all files from build directory to back up directory will be

<PropertyGroup>
<BuildDirectory Condition="'$(BuildDirectory)' == ''">Build</BuildDirectory>
<BackupDirectory Condition="'$(BackupDiretory)' == ''">Backup</BackupDirectory>
</PropertyGroup>

<ItemGroup>
<AllFiles Include="$(MSBuildProjectDirectory)/$(BuildDirectory)/**/*.*" />
</ItemGroup>

<Target Name="Backup">
<Exec Command="if not exist $(BackupDirectory) md $(BackupDirectory)" />
<Copy SourceFiles="@(AllFiles)" DestinationFiles="@(AllFiles-> 
'$(MSBuildProjectDirectory)/$(BackupDirectory)/%(RecursiveDir)/%(Filename)% 
(Extension)')" />
</Target>

Now in above Copy command all source directories are traversed and files are copied to destination directory.


If you are working with typical C++ toolchain, another way to go is to add your files into standard CopyFileToFolders list

<ItemGroup>
  <CopyFileToFolders Include="materials\**\*">
    <DestinationFolders>$(MainOutputDirectory)\Resources\materials\%(RecursiveDir)</DestinationFolders>
  </CopyFileToFolders>
</ItemGroup>

Besides being simple, this is a nice way to go because CopyFilesToFolders task will generate appropriate inputs, outputs and even TLog files therefore making sure that copy operations will run only when one of the input files has changed or one of the output files is missing. With TLog, Visual Studio will also properly recognize project as "up to date" or not (it uses a separate U2DCheck mechanism for that).

참고URL : https://stackoverflow.com/questions/119271/copy-all-files-and-folders-using-msbuild

반응형