我有项目模板,已在dir2中解压缩(带有子文件夹)。模板的源项目位于dir1(带有子文件夹)中。我的任务是使用dir1中的文件的实际版本来更新dir2中来自dir1的所有文件(为简便起见,无论是否更新)。我说“早点来”是指它们与dir1中的文件同名。
问题在于dir1中有文件,而dir2中不存在文件,反之亦然-不能复制它们。 dir1和dir2都有子文件夹,因此仅复制两个目录中都存在的文件是不够的。所有这些都应准确放置在dir2的相应子目录中。
问题是-是否可以不使用内联任务(C#/ VB代码)来做到这一点?我完全理解如何在C#/ VB上执行此操作,但是如果我可以使用预定义的MSBuild任务和属性函数执行此操作,则它不是完美的解决方案。但是-到目前为止,我还没有找到解决方法:-(。
答案 0 :(得分:1)
是否可以不使用内联任务(C#/ VB代码)来做到这一点?
有可能。就像我在评论中提到的一样。构建事件属性或Exec Task可以实现此目标。
第1步:
cmd命令xcopy path\Dir1 path\Dir2 /U /Y /E
可以根据需要工作。
/U
意味着仅将Dir2中存在的文件从Dir1复制到Dir2,就像同名文件的更新一样。(它适用于子文件夹和文件)
建议:使用cmd命令检查它是否可以在步骤2之前运行。
第二步:
对于Msbuild任务Exec。从现在开始,您就熟悉了msbuild,因此简而言之:
<Target Name="MyCopyCommand">
<Exec Command="xcopy path\Dir1 path\Dir2 /U /Y /E"/>
</Target>
此外:您可以将命令的内容添加到xx.bat中,并按以下方式使用它:
<Target Name="MyCopyCommand">
<Exec Command="path\xx.bat"/>
</Target>
不要忘记使用DefaulTargets,AfterTargets,BeforeTargets控制何时运行复制命令来控制目标的顺序。
答案 1 :(得分:0)
对不起,我没有提到目标目录是源目录的子目录。在这种情况下,xcopy不适用于我,即使我提供了适当的/ EXCLUDE参数,也出现了循环错误。
但是-我找到了纯MSBuild解决方案,这是我的变体:
<ItemGroup>
<ProjectFiles Include="**" Exclude="obj\**;bin\**;bak\**" />
<TemplateIntputs Include="@(ProjectFiles)" Condition="Exists('$(IntermediateTemplateSUBPath)%(ProjectFiles.Identity)')" />
<TemplateOutputs Include="@(TemplateIntputs->'$(IntermediateTemplateSUBPath)%(Identity)')" />
</ItemGroup>
显然,键是“存在”功能。