최근에 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
그래서 요약 : 왜 내 작업이 한 번 이상 호출지고?
감사
* % * 제어 일괄 처리, * 목적지 * 값마다 한 번 호출되는 작업이 아닙니까? – skolima
몇 가지 추가 정보를 출력했는데 네, 대상의 각기 다른 값에 대해 한 번만 Execute 함수를 호출하는 것으로 보입니다. 그걸하지 않는 어떤 방법이 있니? –
왜 확장 팩에서 robocopy 작업을 사용하지 않았습니까? –