Msbuild 自定义任务被多次调用

Msbuild 自定义任务被多次调用,msbuild,msbuild-task,msbuild-4.0,Msbuild,Msbuild Task,Msbuild 4.0,最近我正在学习如何使用MSBuild,所以我决定着手编写自己的自定义MSBuild任务。我发现MSBuild调用我的任务很好。。。但它一遍又一遍地呼唤它。它多次重复对它的调用,即使msbuild项目只调用它一次 以下是我的项目XML: <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/ms

最近我正在学习如何使用MSBuild,所以我决定着手编写自己的自定义MSBuild任务。我发现MSBuild调用我的任务很好。。。但它一遍又一遍地呼唤它。它多次重复对它的调用,即使msbuild项目只调用它一次

以下是我的项目XML:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0"
        xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

<PropertyGroup>
<BuildDir>build directory specified here</BuildDir>
.. various other stuff here too
</PropertyGroup>
<Import Project="file1.xml" />
<Import Project="file2.xml" />

<UsingTask TaskName="CopyToBuild.Copy_To_Build"
           AssemblyFile="CopyToBuild.dll" />

<Target Name="MyNewCopyTask">
    <Copy_To_Build  SourceFiles="@(copy_to_build)"
            DestinationFolder="%(Destination)"
            SkipUnchangedFiles="true"
            BuildDirectory="$(BuildDir)" />
</Target>

</Project>
我知道它被调用了不止一次,因为我在其中放了一个print语句,这表明函数被调用了不止一次。我以为它只会被叫一次

它是否因为设置了某种线程选项而多次被调用?我放入一条语句以打印当前线程:

Console.WriteLine("Current Thread: {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
但这表明一切都在同一条线上。 最后但并非最不重要的一点是,以下是我用来调用所有内容的命令行脚本:

@echo off

call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" x64

rem set some build properties
set MISC=/nologo /verbosity:Normal
set LOGGING=/fileLogger /fileloggerparameters:LogFile=msbuild_foo.log;Encoding=UTF-8;Verbosity=Normal
set PROPERTY=/property:Platform=x64;Configuration=DebugUnicode;BuildDir=E:\foo
set TARGET=/target:MyNewCopyTask

msbuild %MISC% %LOGGING% %PROPERTY% %TARGET% foo.xml

pause

@echo on
总之:为什么我的任务会被多次调用

谢谢


每个“目标”元数据的唯一值将调用一次。这称为“批处理”。您可以按照当前的工作方式执行,也可以将DestinationFolder属性设置为可选,如果未指定该属性,则任务可以在项目“SourceFiles”中查找“Destination”元数据并将项目复制到该文件夹


但是现在通常的方法是将DestinationFolder设置为字符串。

%控制批处理,不是为每个Destination值调用一次任务吗?我输出了一些额外的信息,是的,它似乎为每个Destination值调用了一次Execute函数。有没有办法不这样做?为什么不在扩展包中使用robocopy任务呢?我从来没有听说过robocopy。(当然不是任务版本)。扩展包在哪里?啊。谷歌的扩展包。找到了。那不太适合我目前的需要。
@echo off

call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" x64

rem set some build properties
set MISC=/nologo /verbosity:Normal
set LOGGING=/fileLogger /fileloggerparameters:LogFile=msbuild_foo.log;Encoding=UTF-8;Verbosity=Normal
set PROPERTY=/property:Platform=x64;Configuration=DebugUnicode;BuildDir=E:\foo
set TARGET=/target:MyNewCopyTask

msbuild %MISC% %LOGGING% %PROPERTY% %TARGET% foo.xml

pause

@echo on
  <Copy_To_Build  SourceFiles="@(copy_to_build)"
        DestinationFolder="%(Destination)"
        SkipUnchangedFiles="true"
        BuildDirectory="$(BuildDir)" />