누군가 내가 작성하려는 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>
답변
이것은 내 프로젝트에서 사용한 복사 작업이며 하위 폴더가있는 폴더를 성공적으로 대상에 복사하는 것이 완벽하게 작동했습니다.
<ItemGroup >
<MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" />
</ItemGroup>
<Target Name="AfterCopy" AfterTargets="WebPublish">
<Copy SourceFiles="@(MyProjectSource)"
OverwriteReadOnlyFiles="true" DestinationFolder="$(PublishFolder)api/% (RecursiveDir)"/>
제 경우에는 프로젝트의 게시 폴더를 다른 대상 폴더에 복사했는데 귀하의 경우와 비슷하다고 생각합니다.
