Kompilacja przyrostowa
Podczas kompilowania dużego projektu ważne jest, aby wcześniej utworzone składniki, które są nadal aktualne, nie zostały ponownie skompilowane. Jeśli wszystkie obiekty docelowe są kompilowane za każdym razem, ukończenie każdej kompilacji zajmie dużo czasu. Aby włączyć kompilacje przyrostowe (kompilacje, w których tylko te obiekty docelowe, które nie zostały skompilowane wcześniej lub docelowe, które są nieaktualne, są odbudowywane), aparat Microsoft Build Engine (MSBuild) może porównać znaczniki czasu plików wejściowych ze znacznikami czasu plików wyjściowych i określić, czy pominąć, skompilować lub częściowo skompilować obiekt docelowy. Musi jednak istnieć mapowanie jeden do jednego między danymi wejściowymi i wyjściowymi. Za pomocą przekształceń można włączyć obiekty docelowe w celu zidentyfikowania tego bezpośredniego mapowania. Aby uzyskać więcej informacji na temat przekształceń, zobacz Przekształcenia.
Określanie danych wejściowych i wyjściowych
Obiekt docelowy można utworzyć przyrostowo, jeśli dane wejściowe i wyjściowe są określone w pliku projektu.
Aby określić dane wejściowe i wyjściowe dla elementu docelowego
Inputs
Użyj atrybutów iOutputs
elementuTarget
. Na przykład:<Target Name="Build" Inputs="@(CSFile)" Outputs="hello.exe">
Program MSBuild może porównać znaczniki czasu plików wejściowych ze znacznikami czasu plików wyjściowych i określić, czy pominąć, skompilować lub częściowo skompilować element docelowy. W poniższym przykładzie, jeśli jakikolwiek plik na @(CSFile)
liście elementów jest nowszy niż plik hello.exe , program MSBuild uruchomi obiekt docelowy. W przeciwnym razie zostanie pominięty:
<Target Name="Build"
Inputs="@(CSFile)"
Outputs="hello.exe">
<Csc
Sources="@(CSFile)"
OutputAssembly="hello.exe"/>
</Target>
Gdy dane wejściowe i wyjściowe są określone w obiekcie docelowym, każde dane wyjściowe mogą być mapowane tylko na jedno dane wejściowe lub nie może istnieć bezpośrednie mapowanie między danymi wyjściowymi i wejściowymi. Na przykład w poprzednim zadaniu Csc dane wyjściowe hello.exe nie mogą być mapowane na żadne pojedyncze dane wejściowe — zależy to od wszystkich z nich.
Uwaga
Obiekt docelowy, w którym nie ma bezpośredniego mapowania między danymi wejściowymi i wyjściowymi, zawsze będzie częściej kompilowany niż obiekt docelowy, w którym każde dane wyjściowe mogą być mapowane tylko na jedno dane wejściowe, ponieważ program MSBuild nie może określić, które dane wyjściowe należy ponownie skompilować, jeśli niektóre dane wejściowe uległy zmianie.
Zadania, w których można zidentyfikować bezpośrednie mapowanie między danymi wyjściowymi i wejściowymi, takimi jak zadanie LC, są najbardziej odpowiednie dla kompilacji przyrostowych, w przeciwieństwie do zadań, takich jak Csc i Vbc, które generują jeden zestaw wyjściowy z wielu danych wejściowych.
Przykład
W poniższym przykładzie użyto projektu, który kompiluje pliki Pomocy dla hipotetycznego systemu Pomocy. Projekt działa przez przekonwertowanie źródłowych plików txt na pliki zawartości pośredniej, które następnie są łączone z plikami metadanych XML w celu utworzenia końcowego pliku pomocy używanego przez system Pomocy. Projekt używa następujących hipotetycznych zadań:
GenerateContentFiles
: konwertuje pliki txt na pliki zawartości .BuildHelp
: łączy pliki zawartości i pliki metadanych XML w celu skompilowania końcowego pliku pomocy .
Projekt używa przekształceń do utworzenia mapowania jeden do jednego między danymi wejściowymi i wyjściowymi w zadaniu GenerateContentFiles
. Aby uzyskać więcej informacji, zobacz Przekształcenia. Ponadto element jest ustawiony tak, Output
aby automatycznie używać danych wyjściowych z GenerateContentFiles
zadania jako danych wejściowych zadania BuildHelp
.
Ten plik projektu zawiera obiekty Convert
docelowe i Build
. Zadania GenerateContentFiles
i są umieszczane odpowiednio w obiektach Convert
docelowych i BuildHelp
Build
, aby każdy obiekt docelowy mógł być kompilowany przyrostowo. Za pomocą Output
elementu dane wyjściowe GenerateContentFiles
zadania są umieszczane na ContentFile
liście elementów, gdzie mogą być używane jako dane wejściowe zadania BuildHelp
. Output
Użycie elementu w ten sposób automatycznie dostarcza dane wyjściowe z jednego zadania jako dane wejściowe dla innego zadania, dzięki czemu nie trzeba wyświetlać listy poszczególnych elementów lub elementów ręcznie w każdym zadaniu.
Uwaga
Convert
Mimo że obiekt docelowy może kompilować przyrostowo, wszystkie dane wyjściowe z tego obiektu docelowego są zawsze wymagane jako dane wejściowe dla Build
obiektu docelowego. Program MSBuild automatycznie udostępnia wszystkie dane wyjściowe z jednego obiektu docelowego jako dane wejściowe dla innego obiektu docelowego podczas korzystania z Output
elementu .
<Project DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<ItemGroup>
<TXTFile Include="*.txt"/>
<XMLFiles Include="\metadata\*.xml"/>
</ItemGroup>
<Target Name = "Convert"
Inputs="@(TXTFile)"
Outputs="@(TXTFile->'%(Filename).content')">
<GenerateContentFiles
Sources = "@(TXTFile)">
<Output TaskParameter = "OutputContentFiles"
ItemName = "ContentFiles"/>
</GenerateContentFiles>
</Target>
<Target Name = "Build" DependsOnTargets = "Convert"
Inputs="@(ContentFiles);@(XMLFiles)"
Outputs="$(MSBuildProjectName).help">
<BuildHelp
ContentFiles = "@(ContentFiles)"
MetadataFiles = "@(XMLFiles)"
OutputFileName = "$(MSBuildProjectName).help"/>
</Target>
</Project>