Kompilacje przyrostowe
Kompilacje przyrostowe programu MSBuild to kompilacje zoptymalizowane tak, aby obiekty docelowe, które mają pliki wyjściowe, które są up-to-date w odniesieniu do odpowiednich plików wejściowych, nie są wykonywane.
Element docelowy może mieć zarówno atrybut Inputs
, który wskazuje elementy oczekiwane przez element docelowy jako dane wejściowe, jak i atrybut Outputs
, który wskazuje, jakie elementy generuje jako dane wyjściowe. MSBuild próbuje znaleźć mapowanie jeden na jeden między wartościami tych atrybutów. Jeśli takie mapowanie istnieje, program MSBuild porównuje sygnaturę czasową każdego elementu wejściowego z sygnaturą czasową odpowiadającego mu elementu wyjściowego. Pliki wyjściowe, które nie mają mapowania jeden do jednego, są porównywane ze wszystkimi plikami wejściowymi. Element jest uznawany za up-to-date, jeśli jego plik wyjściowy jest w tym samym wieku lub nowszy niż jego plik wejściowy lub pliki.
Notatka
Gdy program MSBuild ocenia pliki wejściowe, uwzględniana jest tylko zawartość listy w bieżącym wykonaniu. Zmiany na liście z ostatniej kompilacji nie sprawiają automatycznie, że cel jest nieaktualny.
Jeśli wszystkie elementy wyjściowe są up-to-date, program MSBuild pomija element docelowy. Ta przyrostowa kompilacja docelowa może znacznie poprawić szybkość kompilacji. Jeśli tylko niektóre pliki są up-to-date, program MSBuild wykonuje obiekt docelowy, ale pomija up-to-elementy daty i dlatego powoduje wyświetlenie wszystkich elementów up-to-date. Ten proces jest znany jako częściowa kompilacja przyrostowa.
Mapowania jeden do jednego można wygenerować tylko wtedy, gdy atrybut Outputs
jest przekształceniem atrybutu Inputs
. Aby uzyskać więcej informacji, zobacz przekształcenia MSBuild .
Rozważmy następujący cel:
<Target Name="Backup" Inputs="@(Compile)"
Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">
<Copy SourceFiles="@(Compile)" DestinationFiles=
"@(Compile->'$(BackupFolder)%(Identity).bak')" />
</Target>
Zestaw plików reprezentowanych przez typ elementu Compile
jest kopiowany do katalogu kopii zapasowej. Pliki kopii zapasowej mają rozszerzenie nazwy pliku .bak
. Jeśli pliki reprezentowane przez typ elementu Compile
lub odpowiadające im pliki kopii zapasowej, nie zostaną usunięte ani zmodyfikowane po uruchomieniu obiektu docelowego Backup
, obiekt docelowy Backup
zostanie pominięty w kolejnych kompilacjach.
Wnioskowanie danych wyjściowych
Program MSBuild porównuje atrybuty Inputs
i Outputs
elementu docelowego, aby określić, czy element docelowy musi zostać wykonany. W idealnym przypadku zestaw plików, które istnieją po zakończeniu kompilacji przyrostowej, powinien pozostać taki sam, niezależnie od tego, czy skojarzone obiekty docelowe są wykonywane. Ponieważ właściwości i elementy, które zadania tworzą lub zmieniają, mogą mieć wpływ na kompilację, program MSBuild musi wywnioskować ich wartości, nawet jeśli element docelowy, który ma na nie wpływ, zostanie pominięty. Ten proces jest znany jako wnioskowanie wyjściowe .
Istnieją trzy przypadki:
Obiekt docelowy ma atrybut
Condition
, który ocenia się nafalse
. W takim przypadku cel nie jest uruchomiony i nie ma wpływu na kompilację.Element docelowy zawiera nieaktualne dane wyjściowe i jest uruchamiany w celu ich up-to-date.
Cel nie ma przestarzałych danych wyjściowych i jest pomijany. Program MSBuild ocenia element docelowy i wprowadza zmiany w elementach i właściwościach tak, jakby element docelowy został uruchomiony.
Aby wspierać kompilację przyrostową, zadania muszą upewnić się, że wartość atrybutu TaskParameter
dowolnego elementu Output
jest równa parametrowi wejściowemu zadania. Na przykład:
<CreateProperty Value="123">
<Output PropertyName="Easy" TaskParameter="Value" />
</CreateProperty>
Ten kod tworzy właściwość Easy
, która ma wartość 123
, czy obiekt docelowy jest wykonywany, czy pomijany.
Począwszy od programu MSBuild 3.5, wnioskowanie wyjściowe jest wykonywane automatycznie w grupach elementów i właściwości w elemencie docelowym.
CreateItem
zadania nie są wymagane w obiekcie docelowym i należy go unikać. Ponadto zadania CreateProperty
powinny być wykorzystywane w celu jedynie określenia, czy cel został wykonany.
Przed msBuild 3.5 można użyć zadania CreateItem.
Określenie, czy cel jest uruchomiony
Ze względu na wnioskowanie wyników, należy sprawdzić właściwości i elementy celu, aby określić, czy cel został zrealizowany. W tym celu dodaj zadanie CreateProperty
do obiektu docelowego i nadaj mu element Output
, którego TaskParameter
jest ValueSetByTask
. Na przykład:
<CreateProperty Value="true">
<Output TaskParameter="ValueSetByTask" PropertyName="CompileRan" />
</CreateProperty>
Ten kod tworzy właściwość CompileRan
i nadaje jej wartość true
, ale tylko wtedy, gdy obiekt docelowy jest wykonywany. Jeśli obiekt docelowy zostanie pominięty, CompileRan
nie zostanie utworzony.