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. Ten Project 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 atrybucie DefaultTargets .

  • DefaultTargets. Ten Project atrybut określa, które elementy docelowe są uruchamiane, jeśli obiekt docelowy nie jest jawnie określony w wierszu polecenia.

  • DependsOnTargets. Ten Target atrybut określa elementy docelowe, które muszą być uruchamiane przed uruchomieniem tego obiektu docelowego.

  • BeforeTargets i AfterTargets. Te Target 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 InitialTargetselementu 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 DefaultTargetselementu 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. 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). 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 iBeforeTargetsAfterTargets 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:

  1. InitialTargets obiekty docelowe są uruchamiane.

  2. 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.

  3. 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 lub AfterTargets nadal są wykonywane w określonej kolejności.

  4. Przed wykonaniem lub pominięciem obiektu docelowego jego DependsOnTargets obiekty docelowe są uruchamiane, chyba że Condition atrybut zostanie zastosowany do obiektu docelowego i zostanie obliczony na falsewartość .

    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.

  5. Przed wykonaniem lub pominięciem obiektu docelowego zostanie uruchomiony dowolny inny obiekt docelowy, który wyświetla element docelowy w atrybucie BeforeTargets .

  6. Przed wykonaniem Inputs obiektu docelowego jego atrybut i Outputs 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.

  7. Po wykonaniu lub pominięcia obiektu docelowego zostanie uruchomiony dowolny inny element docelowy, który wyświetla listę w atrybucie AfterTargets .