最近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タスクを呼び出して見ることができるように。 Copy_To_BuildタスクのSourceFiles属性に渡される項目を含むxmlファイルをインポートします。すべて素晴らしいです。 1つのことを除いて:私のカスタムタスクでの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
ので、要約で:なぜ私のタスクは複数回呼び出さなっていますか?
おかげ
*%*はバッチ処理を制御しますが、* Destination *の値ごとに一度呼び出されるタスクはありませんか? – skolima
私はいくつかの余分な情報を出力しました。はい、Destinationの異なる値ごとにExecute関数を1回呼び出すようです。それをしない方法はありますか? –
なぜ、拡張パックでrobocopyタスクを使用していないのですか? –