2011-12-19 24 views
0

最近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 

ので、要約で:なぜ私のタスクは複数回呼び出さなっていますか?

おかげ

+1

*%*はバッチ処理を制御しますが、* Destination *の値ごとに一度呼び出されるタスクはありませんか? – skolima

+0

私はいくつかの余分な情報を出力しました。はい、Destinationの異なる値ごとにExecute関数を1回呼び出すようです。それをしない方法はありますか? –

+0

なぜ、拡張パックでrobocopyタスクを使用していないのですか? –

答えて

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

それは、「宛先」のメタデータの一意の値ごとに一度呼び出されます。これは「バッチ処理」と呼ばれます。現在作業しているようにするか、DestinationFolderプロパティをオプションにするか、指定しない場合は、タスクは「SourceFiles」アイテムの「Destination」メタデータを検索し、アイテムをそのフォルダ。

しかし、あなたが今行っているように普通のやり方で、単にDestinationFolderを文字列にしてください。

関連する問題