2010-10-16 10 views
7

Chcę uruchomić zadanie MSBuild (które podpisuje plik wykonywalny/dll), ale tylko wtedy, gdy zmienił się wyjściowy plik exe/dll. Jeśli żaden z plików źródłowych się nie zmienił powodując przekompilowanie pliku exe/dll, nie chcę, aby zadanie zostało uruchomione.Jak można warunkowo uruchomić zadanie MSBuild tylko wtedy, gdy zostały zbudowane wyjścia projektu?

Mimo że spędzam kilka godzin próbując różnych rzeczy, nie mogę się dowiedzieć, jak sprawić, by moje docelowe zadanie działało tylko wtedy, gdy projekt został skompilowany w miejscu, w którym zmieniły się pliki wyjściowe (innymi słowy, cel CoreCompile nie został pominięty) .

Odpowiedz

2

powinna być taka sama jak this answer, używając TargetOutputs parameter ::

<MSBuild Projects="File.sln" > 
    <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" /> 
</MSBuild> 
<Message Text="Assemblies built: @(AssembliesBuiltByChildProjects)" /> <!-- just for debug --> 
<CallTarget Targets="SignExe" Condition="'@(AssembliesBuiltByChildProjects)'!=''" /> 
+0

Myślę, że to inne podejście - staram się zrozumieć, jak to zrobić w kontekście pliku projektu .csproj dla zwykłego projektu - nie tworząc pliku projektu MSBuild, który kieruje się do rozwiązań –

0

można po prostu to zrobić:

<PropertyGroup> 
    <TargetsTriggeredByCompilation>DoStuffWithNewlyCompiledAssembly</TargetsTriggeredByCompilation> 
</PropertyGroup> 

To działa, bo ktoś mądry w Microsoft dodaje następujący wiersz na końcu celu CoreCompile w Microsoft.[CSharp|VisualBasic][.Core].targets (nazwa pliku zależy od wersji językowej i MSBuild/Visual Studio).

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/> 

Więc jeśli określić nazwę docelowej w nieruchomości TargetsTriggeredByCompilation, twój cel będzie działał jeśli CoreCompile runs-- i twój cel nie będzie działać, jeśli CoreCompile jest pomijany (na przykład dlatego, że montażowa jest już w górę-to- data w odniesieniu do kodu).

Powiązane problemy