只是想知道是否有人可以通过我尝试编写的某些msbuild脚本来帮助我。 我想做的是使用msbuild将所有文件和子文件夹从一个文件夹复制到另一个文件夹。
{ProjectName}
|----->Source
|----->Tools
|----->Viewer
|-----{about 5 sub dirs}
我需要做的是将所有文件和子文件夹从tools文件夹复制到应用程序的debug文件夹中。 这是我到目前为止的代码。
<ItemGroup>
<Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" />
</ItemGroup>
<Target Name="BeforeBuild">
<Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" />
</Target>
生成脚本会运行,但是不会复制任何文件或文件夹。
谢谢
102 votes
我也在寻找帮助。 我花了一段时间,但这是我所做的,效果很好。
<Target Name="AfterBuild">
<ItemGroup>
<ANTLR Include="..\Data\antlrcs\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(ANTLR)" DestinationFolder="$(TargetDir)\%(RecursiveDir)" SkipUnchangedFiles="true" />
</Target>
这将名为antlrcs
的文件夹的内容递归复制到$(TargetDir)
。
69 votes
我认为问题可能出在您如何创建ItemGroup和调用Copy任务上。 看看这是否有意义:
<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>
35 votes
我是MSBuild的新手,但是我发现EXEC Task非常适合此类情况。 我在项目中遇到了同样的挑战,这对我有用,而且简单得多。 有人请告诉我这是否不是一个好习惯。
<Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite">
<Exec Command="xcopy.exe $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" />
</Target>
10 votes
<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帮助将所有文件放在相应的文件夹中…
4 votes
您是否尝试指定具体的目标目录而不是
DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" ?
我对高级MSBuild语法不是很熟练,但是
@(Viewer->'$(OutputPath)\\Tools')
对我来说看起来很奇怪。 脚本看起来不错,所以问题可能出在$(ApplicationDirectory)
和$(OutputPath)
编辑:
这是一篇可能有用的博客文章:
如何:使用任务递归复制文件
aku answered 2019-09-23T02:47:59Z
2 votes
这是有效的示例:
<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\]
PBo answered 2019-09-23T02:48:30Z
1 votes
我个人使用了CopyFolder,它是SDC任务库的一部分。
[http://sdctasks.codeplex.com/\]
Johan answered 2019-09-23T02:49:01Z
1 votes
这是我在自己的项目中使用的复制任务,对我而言,将带有子文件夹的文件夹成功复制到目标位置的工作非常完美:
<ItemGroup >
<MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" />
</ItemGroup>
<Target Name="AfterCopy" AfterTargets="WebPublish">
<Copy SourceFiles="@(MyProjectSource)"
OverwriteReadOnlyFiles="true" DestinationFolder="$(PublishFolder)api/% (RecursiveDir)"/>
就我而言,我将项目的发布文件夹复制到另一个目标文件夹,我认为它与您的案例相似。
nzrytmn answered 2019-09-23T02:49:33Z
0 votes
使用MSBuild将文件从一个目录递归复制到另一个目录的最佳方法是将Copy任务与SourceFiles和DestinationFiles作为参数一起使用。 例如-将所有文件从构建目录复制到备份目录将是
<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)/%(RecuriveDir)/%(Filename)%
(Extension)')" />
</Target>
现在,在上面的复制命令中,将遍历所有源目录,并将文件复制到目标目录。