Porady: kompilacja przyrostowa
Tworzenie dużego projektu, jest ważne, że wcześniej wbudowane składniki, które są wciąż aktualne nie są odbudowywane.Jeśli wszystkie obiekty docelowe są zbudowane za każdym razem, każdy build zajmie dużo czasu, aby zakończyć.Aby włączyć przyrostowe kompilacje (buduje, w którym tylko do tych celów, które nie zostały zbudowane przed lub cele, które są nieaktualne, są przebudowywane), Microsoft Build Engine (MSBuild) można porównać sygnatury czasowe plików wejściowych z sygnatur czasowych plików wyjściowych i ustalić, czy należy pominąć, zbudować lub częściowo odbudować elementu docelowego.Jednakże musi być mapowanie jeden do jednego między wejść i wyjść.Można użyć transformacji, aby włączyć cele do zidentyfikowania to bezpośredniego mapowania.Aby uzyskać więcej informacji na temat transformacji, zobacz Przekształcenia w programie MSBuild.
Określanie wejść i wyjść
Element docelowy może być zbudowany przyrostowo, jeśli wejścia i wyjścia są określone w pliku projektu.
Aby określić wejść i wyjść dla obiektu docelowego
Użycie Inputs i Outputs atrybuty Target element.Na przykład:
<Target Name="Build" Inputs="@(CSFile)" Outputs="hello.exe">
MSBuildmożna porównać sygnatury czasowe plików wejściowych z sygnatur czasowych plików wyjściowych i ustalić, czy należy pominąć, zbudować lub częściowo odbudować elementu docelowego.W poniższym przykładzie, jeśli dowolny plik w @(CSFile) lista elementów jest nowszy od pliku hello.exe MSBuild uruchomi docelowego; w przeciwnym razie zostanie ona pominięta:
<Target Name="Build"
Inputs="@(CSFile)"
Outputs="hello.exe">
<Csc
Sources="@(CSFile)"
OutputAssembly="hello.exe"/>
</Target>
Po określeniu wejść i wyjść w cel każdego wyjścia można mapować tylko jedno wejście lub nie może być brak bezpośredniego mapowania między wejść i wyjść.W poprzednim Csc — Zadanie, na przykład danych wyjściowych, hello.exe, nie może być mapowane do jednego udziału – zależy to wszystkie z nich.
[!UWAGA]
Element docelowy, w którym nie ma bezpośredniego mapowania między wejść i wyjść zawsze będzie budować częściej, niż docelowe, w którym każdego wyjścia można mapować tylko jedno wejście bo MSBuild nie może określić, które wyjścia trzeba przebudowywane, jeśli zmieniły się część komponentów.
Zadania, w których można zidentyfikować bezpośredniego mapowania między wyjść i wejść, takich jak LC — Zadanie, są najbardziej odpowiednie do pierwotnych buduje, w przeciwieństwie do zadań takich jak Csc i Vbc, które wytwarzają jednego zestawu danych wyjściowych z liczby wejść.
Przykład
W poniższym przykładzie użyto projekt, który tworzy pliki pomocy dla hipotetyczny system pomocy.Projekt polega na konwertowaniu plików .txt źródła pośredniego .content plikami, które następnie są połączone z XML pliki metadane w celu utworzenia pliku końcowego .help używany przez system pomocy.Program project używa hipotetyczny następujące zadania:
GenerateContentFiles: Konwertuje pliki z rozszerzeniem .txt do plików .content.
BuildHelp: Łączy z plików .content i XML metadanych plików zbudować plik .help końcowego.
Projekt używa transformacje utworzyć mapowanie jeden do jednego między wejścia i wyjścia w GenerateContentFiles zadania.Aby uzyskać więcej informacji, zobacz Przekształcenia w programie MSBuild.Także Output element jest ustawiona na automatycznie używać wyjść z GenerateContentFiles zadanie jako nakłady dla BuildHelp zadania.
Ten plik projektu zawiera zarówno Convert i Build celów.GenerateContentFiles i BuildHelp zadań są umieszczane w Convert i Build cele odpowiednio tak, że każdy cel może być zbudowany przyrostowo.Za pomocą Output element, wyjścia z GenerateContentFiles zadań są umieszczane w ContentFile elementu listy, gdzie mogą być używane jako nakłady dla BuildHelp zadania.Za pomocą Output elementu w ten sposób automatycznie udostępnia wyjść od jednego zadania jako dane wejściowe dla innego zadania, dzięki czemu nie trzeba poszczególne elementy listy lub elementu listy ręcznie w poszczególnych zadań.
[!UWAGA]
Chociaż GenerateContentFiles miejsce docelowe można zbudować przyrostowo, wszystkie dane wyjściowe obiektu docelowego zawsze są wymagane jako nakłady dla BuildHelp miejsce docelowe.MSBuildautomatycznie zapewnia wszystkie wyjścia z jednego jako nakłady dla innego obiektu docelowego korzystając z Output element.
<Project DefaultTargets="Build"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003" >
<ItemGroup>
<TXTFile Include="*.txt"/>
<XMLFile 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 = "@(XMLFile)"
OutputFileName = "$(MSBuildProjectName).help"/>
</Target>
</Project>