Kolejność kompilowania obiektów docelowych
Obiekty docelowe muszą być uporządkowane, jeśli dane wejściowe do jednego obiektu docelowego zależą od danych wyjściowych innego obiektu docelowego. Za pomocą tych atrybutów można określić kolejność uruchamiania obiektów docelowych:
InitialTargets
. TenProject
atrybut określa obiekty docelowe, które będą uruchamiane jako pierwsze, nawet jeśli obiekty docelowe są określone w wierszu polecenia lub w atrybucieDefaultTargets
.DefaultTargets
. TenProject
atrybut określa, które elementy docelowe są uruchamiane, jeśli obiekt docelowy nie jest jawnie określony w wierszu polecenia.DependsOnTargets
. TenTarget
atrybut określa elementy docelowe, które muszą być uruchamiane przed uruchomieniem tego obiektu docelowego.BeforeTargets
iAfterTargets
. TeTarget
atrybuty określają, że ten element docelowy powinien być uruchamiany przed określonymi obiektami docelowymi lub po nich.
Ogólnie rzecz biorąc, nie należy zależeć od kolejności deklaracji, aby określić, jakie zadania są uruchamiane przed innymi zadaniami.
Obiekt docelowy nigdy nie jest uruchamiany dwa razy podczas kompilacji, nawet jeśli będzie on zależny od kolejnego obiektu docelowego w kompilacji. Po uruchomieniu elementu docelowego jego współtworzenie kompilacji zostanie ukończone.
Elementy docelowe mogą mieć Condition
atrybut. Jeśli określony warunek ma wartość false
, element docelowy nie jest wykonywany i nie ma wpływu na kompilację. Aby uzyskać więcej informacji na temat warunków, zobacz Warunki.
Początkowe elementy docelowe
Atrybut InitialTargets
elementu Project określa elementy docelowe, które będą uruchamiane jako pierwsze, nawet jeśli obiekty docelowe są określone w wierszu polecenia lub w atrybucie DefaultTargets
. Początkowe obiekty docelowe są zwykle używane do sprawdzania błędów.
Wartość atrybutu InitialTargets
może być rozdzielana średnikami, uporządkowana lista obiektów docelowych. W poniższym przykładzie określono, że Warm
element docelowy jest uruchamiany, a następnie jest uruchamiany element docelowy Eject
.
<Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Zaimportowane projekty mogą mieć własne InitialTargets
atrybuty. Wszystkie początkowe cele są agregowane razem i uruchamiane w kolejności.
Aby uzyskać więcej informacji, zobacz How to: Specify which target to build first (Jak określić element docelowy do skompilowania).
Domyślne elementy docelowe
Atrybut DefaultTargets
elementu Project określa, który element docelowy lub docelowy są kompilowane, jeśli obiekt docelowy nie jest jawnie określony w wierszu polecenia.
Wartość atrybutu DefaultTargets
może być rozdzielana średnikami, uporządkowana lista domyślnych obiektów docelowych. W poniższym przykładzie określono, że Clean
element docelowy jest uruchamiany, a następnie jest uruchamiany element docelowy Build
.
<Project DefaultTargets="Clean;Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Domyślne obiekty docelowe można zastąpić za pomocą przełącznika -target w wierszu polecenia. W poniższym przykładzie określono, że Build
element docelowy jest uruchamiany, a następnie jest uruchamiany element docelowy Report
. Po określeniu obiektów docelowych w ten sposób wszystkie domyślne obiekty docelowe są ignorowane.
msbuild -target:Build;Report
Jeśli określono zarówno początkowe obiekty docelowe, jak i docelowe domyślne, a jeśli nie określono żadnych obiektów docelowych wiersza polecenia, program MSBuild najpierw uruchamia początkowe obiekty docelowe, a następnie uruchamia domyślne obiekty docelowe.
Zaimportowane projekty mogą mieć własne DefaultTargets
atrybuty. Pierwszy DefaultTargets
napotkany atrybut określa, które domyślne obiekty docelowe zostaną uruchomione.
Aby uzyskać więcej informacji, zobacz How to: Specify which target to build first (Jak określić element docelowy do skompilowania).
Pierwszy element docelowy
Jeśli nie ma żadnych początkowych obiektów docelowych, domyślnych obiektów docelowych lub obiektów docelowych wiersza polecenia, program MSBuild uruchamia pierwszy obiekt docelowy napotkany w pliku projektu lub zaimportowanych plikach projektu.
Zależności docelowe
Obiekty docelowe mogą opisywać relacje zależności ze sobą. Atrybut DependsOnTargets
wskazuje, że element docelowy zależy od innych obiektów docelowych. Na przykład:
<Target Name="Serve" DependsOnTargets="Chop;Cook" />
informuje program MSBuild, że Serve
element docelowy Chop
zależy od wartości docelowej i Cook
docelowej. Program MSBuild uruchamia element docelowy Chop
, a następnie uruchamia element docelowy Cook
przed uruchomieniem Serve
obiektu docelowego.
Uwaga
Standardowe obiekty docelowe w zestawie SDK definiują wiele DependsOn
właściwości, które zawierają listę obiektów docelowych, które są zależnościami dla tego obiektu docelowego (na przykład $(BuildDependsOn)
, $(CleanDependsOn)
i tak dalej). Na przykład:
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">
Aby dostosować projekt, można zastąpić właściwości dodatkowymi obiektami docelowymi niestandardowymi, które rozszerzają proces kompilacji, zgodnie z opisem w temacie Rozszerzanie DependsOn
procesu kompilacji programu Visual Studio.
BeforeTargets i AfterTargets
Kolejność docelową można określić przy użyciu atrybutów BeforeTargets
i AfterTargets
.
Rozważmy następujący skrypt.
<Project DefaultTargets="Compile;Link" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Compile">
<Message Text="Compiling" />
</Target>
<Target Name="Link">
<Message Text="Linking" />
</Target>
</Project>
Aby utworzyć obiekt docelowy Optimize
pośredni uruchamiany po elemenie Compile
docelowym, ale przed elementem Link
docelowym, dodaj następujący element docelowy w dowolnym miejscu w elemecie Project
.
<Target Name="Optimize" AfterTargets="Compile">
<Message Text="Optimizing" />
</Target>
Alternatywnie określ kolejność jako
<Target Name="Optimize" BeforeTargets="Link">
<Message Text="Optimizing" />
</Target>
Nie jest przydatne określenie wartości i BeforeTargets
AfterTargets
na tym samym obiekcie docelowym. Zgodnie z opisem w następnej sekcji tylko pierwszy napotkany element docelowy spowoduje uruchomienie nowego elementu docelowego.
Określanie docelowej kolejności kompilacji
Program MSBuild określa docelową kolejność kompilacji w następujący sposób:
InitialTargets
obiekty docelowe są uruchamiane.Obiekty docelowe określone w wierszu polecenia przez przełącznik -target są uruchamiane. Jeśli nie określisz obiektów docelowych w wierszu polecenia,
DefaultTargets
zostaną uruchomione obiekty docelowe. Jeśli żaden z nich nie jest obecny, zostanie uruchomiony pierwszy napotkany element docelowy.Atrybut
Condition
obiektu docelowego jest obliczany.Condition
Jeśli atrybut jest obecny i ocenia wartośćfalse
, element docelowy nie jest wykonywany i nie ma dalszego wpływu na kompilację.Inne obiekty docelowe, które wyświetlają element docelowy warunkowy w
BeforeTargets
określonej kolejności lubAfterTargets
nadal są wykonywane w określonej kolejności.Przed wykonaniem lub pominięciem obiektu docelowego jego
DependsOnTargets
obiekty docelowe są uruchamiane, chyba żeCondition
atrybut zostanie zastosowany do obiektu docelowego i zostanie obliczony nafalse
wartość .Uwaga
Element docelowy jest uznawany za pominięty, jeśli nie jest wykonywany, ponieważ jego elementy wyjściowe są aktualne (zobacz kompilację przyrostową). To sprawdzenie odbywa się tuż przed wykonaniem zadań wewnątrz obiektu docelowego i nie ma wpływu na kolejność wykonywania obiektów docelowych.
Przed wykonaniem lub pominięciem obiektu docelowego zostanie uruchomiony dowolny inny obiekt docelowy, który wyświetla element docelowy w atrybucie
BeforeTargets
.Przed wykonaniem
Inputs
obiektu docelowego jego atrybut iOutputs
atrybut są porównywane. Jeśli program MSBuild ustali, że wszystkie pliki wyjściowe są nieaktualne w odniesieniu do odpowiedniego pliku wejściowego lub plików, program MSBuild wykonuje obiekt docelowy. W przeciwnym razie program MSBuild pomija element docelowy.Po wykonaniu lub pominięcia obiektu docelowego zostanie uruchomiony dowolny inny element docelowy, który wyświetla listę w atrybucie
AfterTargets
.