Udostępnij za pośrednictwem


Docelowa kolejność kompilacji

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:

  • . Ten 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 .

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

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

  • i . Te atrybuty określają, że ten element docelowy powinien być uruchamiany przed określonymi obiektami docelowymi lub po nich.

Ogólnie rzecz biorąc, nie powinno się polegać na kolejności deklaracji, aby określić, które zadania są uruchamiane przed innymi.

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 wkład w kompilację jest zakończony.

Elementy docelowe mogą mieć atrybut. Jeśli określony warunek zostanie obliczony na wartość , element docelowy nie zostanie wykonany i zostanie uznany za pominięty. Zobacz Określanie kolejności kompilacji docelowej, aby uzyskać szczegółowe informacje na temat zachowania pominiętych obiektów docelowych. Aby uzyskać więcej informacji na temat warunków, zobacz Warunki.

Początkowe cele

Atrybut 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 . Początkowe cele są zwykle używane do sprawdzania błędów.

Wartość atrybutu może być uporządkowaną listą celów, rozdzielaną średnikami. W poniższym przykładzie określono, że działa element docelowy , a następnie działa element docelowy .

<Project InitialTargets="Warm;Eject">

Zaimportowane projekty mogą mieć własne atrybuty. Wszystkie początkowe cele są agregowane razem i uruchamiane w kolejności.

Aby uzyskać więcej informacji, zobacz Jak określić, który element docelowy skompilować jako pierwszy.

Domyślne cele

Atrybut elementu Project określa, które cele lub cele są budowane, jeśli cel nie jest jawnie określony w wierszu polecenia.

Wartość atrybutu może być uporządkowaną listą domyślnych obiektów docelowych rozdzielaną średnikami. W poniższym przykładzie określono, że działa element docelowy , a następnie działa element docelowy .

<Project DefaultTargets="Clean;Build">

Domyślne obiekty docelowe można zastąpić za pomocą przełącznika -target w wierszu polecenia. W poniższym przykładzie określono, że działa element docelowy , a następnie działa element docelowy . 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 atrybuty. Pierwszy napotkany atrybut określa, które domyślne obiekty docelowe zostaną uruchomione.

Aby uzyskać więcej informacji, zobacz Jak określić, który element docelowy skompilować jako pierwszy.

Pierwszy cel

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 wskazuje, że element docelowy zależy od innych obiektów docelowych. Na przykład

<Target Name="Serve" DependsOnTargets="Chop;Cook" />

informuje program MSBuild, że element docelowy zależy od elementów docelowych i . Program MSBuild uruchamia element docelowy , a następnie uruchamia element docelowy przed uruchomieniem obiektu docelowego.

Uwaga / Notatka

Standardowe obiekty docelowe w zestawie SDK definiują wiele właściwości, które zawierają listę obiektów docelowych, które są zależnościami dla tego obiektu docelowego (na przykład , i tak dalej). Na przykład

<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">

Aby dostosować projekt, można zastąpić właściwości DependsOn dodatkowymi niestandardowymi celami, które rozszerzają proces kompilacji, zgodnie z opisem w Rozszerzanie procesu kompilacji w Visual Studio.

BeforeTargets i AfterTargets

Kolejność docelową można określić przy użyciu atrybutów i .

Rozważmy następujący skrypt.

<Project DefaultTargets="Compile;Link">
    <Target Name="Compile">
        <Message Text="Compiling" />
    </Target>
    <Target Name="Link">
        <Message Text="Linking" />
    </Target>
</Project>

Aby utworzyć obiekt docelowy pośredni uruchamiany po elemenie docelowym, ale przed elementem docelowym, dodaj następujący element docelowy w dowolnym miejscu w elemecie .

<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 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. obiekty docelowe są uruchamiane.

  2. Obiekty docelowe określone w wierszu polecenia przez przełącznik -target są uruchamiane. Jeśli nie określisz celów w wierszu polecenia, wtedy zostaną uruchomione cele . Jeśli żaden nie jest obecny, wtedy zostanie uruchomiony pierwszy napotkany cel.

  3. Atrybut obiektu docelowego jest obliczany. Jeśli atrybut jest obecny i przyjmuje wartość , cel nie jest wykonywany i jest uznawany za pominięty.

    Inne cele, które wymieniają cel warunkowy w lub , nadal są wykonywane w określonej kolejności, niezależnie od wyniku warunku.

    Uwaga / Notatka

    Pomijany cel nie jest traktowany jako uruchomiony. Jeśli inny element docelowy później żąda go za pośrednictwem , a warunek zostanie obliczony na wartość , element docelowy zostanie wykonany w tym momencie. Jednak zarówno te, które już działały na pierwotnie pominięty cel, jak i inne nie będą działać ponownie.

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

    Uwaga / Notatka

    Element docelowy jest uznawany za pominięty, jeśli nie jest wykonywany, ponieważ jego elementy wyjściowe są up-to-date (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 .

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

  7. Po wykonaniu lub pominięciu celu zostanie uruchomiony dowolny inny cel, który go wymienia w atrybucie .

  • Cele