我正在学习如何最近使用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>
因此,您可以看到我在项目中只调用了一次Copy_To_Build任务。我导入一个xml文件,其中包含传递给Copy_To_Build任务的SourceFiles属性的项目。一切都很好。除了一件事:问题是我的自定义任务上的Execute方法被多次调用 。
public class Copy_To_Build : Microsoft.Build.Utilities.Task
{
[Required]
public ITaskItem[] SourceFiles { get; set; }
[Required]
public ITaskItem[] DestinationFolder { get; set; }
public String BuildDirectory { get; set; }
public bool Clean { get; set; }
public bool SkipUnchangedFiles { get; set; }
public override bool Execute()
{
Console.WriteLine("Build Directory: {0}", BuildDirectory);
...
}
}
我知道它不止一次被调用,因为我在那里放了一个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
总结一下:为什么我的任务不止一次被调用?
由于