2011-12-19 3 views
0

최근에 MSBuild를 사용하는 방법을 배우므로 내 자신의 사용자 지정 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 파일을 가져옵니다. 모든 것이 훌륭하게 작동합니다. 한 가지를 제외하고 문제는 내 사용자 지정 작업에 대한 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 문을 써서 함수가 두 번 이상 나타남을 알고 있기 때문에 두 번 이상 호출되는 것을 알고 있습니다. 나는 한 번만 부름을 기대했다.

일종의 스레딩 옵션 세트가 있기 때문에 두 번 이상 호출되는 것입니까? 나는 현재의 thread 인쇄 성명에 넣어 :

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

* % * 제어 일괄 처리, * 목적지 * 값마다 한 번 호출되는 작업이 아닙니까? – skolima

+0

몇 가지 추가 정보를 출력했는데 네, 대상의 각기 다른 값에 대해 한 번만 Execute 함수를 호출하는 것으로 보입니다. 그걸하지 않는 어떤 방법이 있니? –

+0

왜 확장 팩에서 robocopy 작업을 사용하지 않았습니까? –

답변

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

은 그것은 "대상"메타 데이터의 고유 한 값 당 한 번만 호출됩니다. 이를 '일괄 처리'라고합니다. 현재 작동하는 방식과 같이하거나 DestinationFolder 속성을 선택적으로 만들 수 있으며 지정되지 않은 경우 작업은 "SourceFiles"항목의 "Destination"메타 데이터를 찾고 항목을 다음 위치로 복사 할 수 있습니다. 그 폴더.

하지만 지금 당장하시는대로 일반적인 방법으로 DestinationFolder를 문자열로 만드십시오.

관련 문제