Konfigurowanie obiektów docelowych i zadań
Wybrane zadania programu MSBuild można ustawić tak, aby były uruchamiane w środowisku docelowym, gdy komputer deweloperzy obsługuje środowisko docelowe. Na przykład w przypadku użycia 64-bitowego komputera z systemem Windows do utworzenia aplikacji przeznaczonej dla 32-bitowej architektury systemu Windows wybrane zadania są uruchamiane w procesie 32-bitowym.
Uwaga
Jeśli zadanie kompilacji jest napisane w języku .NET, takim jak Visual C# lub Visual Basic, i nie używa natywnych zasobów lub narzędzi, zostanie ono uruchomione w dowolnym kontekście docelowym bez adaptacji.
Używanie atrybutów i parametrów zadania
Następujące UsingTask
atrybuty mają wpływ na wszystkie operacje zadania w określonym procesie kompilacji:
Atrybut
Runtime
, jeśli jest obecny, ustawia wersję środowiska uruchomieniowego języka wspólnego (CLR) i może przyjąć jedną z następujących wartości:CLR2
, ,CLR4
CurrentRuntime
lub*
(dowolne środowisko uruchomieniowe).Atrybut
Architecture
, jeśli jest obecny, ustawia platformę i bitness i może przyjąć dowolną z następujących wartości:x86
, ,x64
CurrentArchitecture
lub*
(dowolną architekturę).Atrybut
TaskFactory
, jeśli istnieje, ustawia fabrykę zadań, która tworzy i uruchamia wystąpienie zadania, i przyjmuje tylko wartośćTaskHostFactory
. Aby uzyskać więcej informacji, zobacz Fabryki zadań w dalszej części tego dokumentu.
<UsingTask TaskName="SimpleTask"
Runtime="CLR2"
Architecture="x86"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v3.5.dll" />
Można również użyć parametrów MSBuildRuntime
i MSBuildArchitecture
, aby ustawić kontekst docelowy wywołania pojedynczego zadania.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MyTarget">
<SimpleTask MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
</Target>
</Project>
Zanim program MSBuild uruchomi zadanie, wyszukuje dopasowanie UsingTask
, które ma ten sam kontekst docelowy. Parametry określone w obiekcie , UsingTask
ale nie w odpowiednim zadaniu są uznawane za dopasowane. Parametry określone w zadaniu, ale nie odpowiadające im UsingTask
, są również uznawane za dopasowane. Jeśli wartości parametrów nie są określone w UsingTask
zadaniu lub, wartości domyślne to *
(dowolny parametr).
Ostrzeżenie
Jeśli istnieje więcej niż jednaUsingTask
, a wszystkie mają pasujące TaskName
atrybuty , Runtime
iArchitecture
, pierwszy, który ma zostać oceniony, zastępuje pozostałe. Różni się to od zachowania Property
elementów i Target
.
Jeśli parametry są ustawione w zadaniu, program MSBuild próbuje znaleźć element UsingTask
pasujący do tych parametrów lub, przynajmniej, nie jest w konflikcie z nimi. Więcej niż jeden UsingTask
może określać kontekst docelowy tego samego zadania. Na przykład zadanie, które ma różne pliki wykonywalne dla różnych środowisk docelowych, może przypominać następujące:
<UsingTask TaskName="MyTool"
Runtime="CLR2"
Architecture="x86"
AssemblyFile="$(MyToolsPath)\MyTool.v2.0.dll" />
<UsingTask TaskName="MyTool"
Runtime="CLR4"
Architecture="x86"
AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MyTarget">
<MyTool MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
</Target>
</Project>
Zastępowanie wartości domyślnej przy użyciutasks
Domyślnie program MSBuild obsługuje elementy UsingTask jako "pierwsze zwycięstwo". Począwszy od wersji 17.2, program MSBuild obsługuje zastępowanie tego zachowania za pomocą parametru Override
. Parametr UsingTask z ustawionym parametrem Override
true
będzie mieć priorytet nad innymi parametrami UsingTask o tej samej nazwie TaskName.
<UsingTask TaskName="MyTool"
Runtime="CLR4"
Architecture="x86"
Override="true"
AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />
Ostrzeżenie
Można to zrobić tylko raz na zadanie. Kompilacje, które próbują dodać wiele przesłonięć dla tego samego zadania, zostanie wyświetlony błąd MSB4275
MSBuild .
Fabryki zadań
W poniższej tabeli przedstawiono fabryki zadań udostępniane przez instalację programu MSBuild:
Fabryka zadań | opis |
---|---|
AssemblyTaskFactory |
Jest to wartość domyślna. Uruchamia zadanie w procesie. |
TaskHostFactory |
Uruchamia zadanie poza procesem. |
RoslynCodeTaskFactory |
W przypadku zadań wbudowanych napisanych w języku C# lub Visual Basic i przeznaczonych dla platformy .NET Standard; program współpracuje zarówno z programem msbuild.exe , jak i dotnet build . |
CodeTaskFactory |
W przypadku zadań wbudowanych napisanych w języku C# lub Visual Basic i przeznaczonych dla platformy .NET Framework; działa tylko z msbuild.exe programem . |
Mechanizm fabryki zadań jest rozszerzalny, więc można również używać tych utworzonych przez inne firmy lub tworzyć własne. Przyczyną utworzenia jednego z nich jest obsługa innego języka do pisania zadań wbudowanych.
TaskHostFactory
Przed uruchomieniem zadania program MSBuild sprawdza, czy jest wyznaczony do uruchomienia w bieżącym kontekście oprogramowania. Jeśli zadanie jest tak wyznaczone, program MSBuild przekazuje go do AssemblyTaskFactory
elementu , który jest uruchamiany w bieżącym procesie. W przeciwnym razie program MSBuild przekazuje zadanie do TaskHostFactory
programu , które uruchamia zadanie w procesie zgodnym z kontekstem docelowym. Nawet jeśli bieżący kontekst i kontekst docelowy są zgodne, możesz wymusić uruchomienie zadania (w celu izolacji, zabezpieczeń lub innych powodów), ustawiając wartość TaskFactory
.TaskHostFactory
<UsingTask TaskName="MisbehavingTask"
TaskFactory="TaskHostFactory"
AssemblyFile="$(MSBuildToolsPath)\MyTasks.dll">
</UsingTask>
Gdy TaskHostFactory
zostanie określony jawnie, proces, który uruchamia zadanie, jest krótkotrwały. Dzięki temu system operacyjny może wyczyścić wszystkie zasoby związane z zadaniem natychmiast po jego wykonaniu. Z tego powodu należy określić TaskHostFactory
podczas odwoływania się do zadań wbudowanych w ten sam proces kompilacji co ich użycie, aby uniknąć błędów użycia plików podczas aktualizowania zestawu zadań po kompilacji.
RoslynCodeTaskFactory
Udostępnia RoslynCodeTaskFactory
mechanizm, za pomocą którego można napisać kod języka C# lub Visual Basic dla zadania w pliku projektu w celu natychmiastowego użycia. Kod jest kompilowany podczas procesu kompilacji w celu utworzenia zadania, które można wykonać w tej samej kompilacji. Kod, który piszesz, jest przeznaczony dla platformy .NET Standard, dzięki czemu może być używany podczas uruchamiania dotnet build
programu , który korzysta z programu .NET Core (i .NET 5 i nowszych) programu MSBuild, a także msbuild.exe
, który używa programu .NET Framework. RoslynCodeTaskFactory
Jest to najlepsze rozwiązanie w przypadku dostosowywania, które jest nieco zbyt trudne do wykonania w logice MSBuild, ale nie jest wystarczająco skomplikowane, aby utworzyć oddzielny projekt. Zobacz Create an MSBuild inline task with RoslynCodeTaskFactory (Tworzenie wbudowanego zadania MSBuild za pomocą polecenia RoslynCodeTaskFactory).
CodeTaskFactory
CodeTaskFactory
jest starszą wersją RoslynCodeTaskFactory
programu , która jest ograniczona do wersji programu .NET Framework programu MSBuild. Zobacz Zadania wbudowane programu MSBuild. Ta fabryka zadań jest obsługiwana, ale nowszy kod powinien być używany RoslynCodeTaskFactory
w celu szerszego stosowania.
Parametry zadania phantom
Podobnie jak w przypadku innych parametrów zadania i MSBuildRuntime
MSBuildArchitecture
można je ustawić na podstawie właściwości kompilacji.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FrameworkVersion>3.0</FrameworkVersion>
</PropertyGroup>
<Target Name="MyTarget">
<SimpleTask MSBuildRuntime="$(FrameworkVerion)" MSBuildArchitecture= "x86"/>
</Target>
</Project>
W przeciwieństwie do innych parametrów MSBuildRuntime
zadania i MSBuildArchitecture
nie są widoczne dla samego zadania. Aby napisać zadanie, które jest świadome kontekstu, w którym jest uruchamiany, należy przetestować kontekst przez wywołanie programu .NET Framework lub użyć właściwości kompilacji, aby przekazać informacje kontekstowe za pośrednictwem innych parametrów zadania.
Uwaga
UsingTask
atrybuty można ustawiać na podstawie zestawu narzędzi i właściwości środowiska.
Parametry MSBuildRuntime
i MSBuildArchitecture
zapewniają najbardziej elastyczny sposób ustawiania kontekstu docelowego, ale także najbardziej ograniczonego zakresu. Z jednej strony, ponieważ są one ustawione na samym wystąpieniu zadania i nie są oceniane, dopóki zadanie nie zostanie uruchomione, może uzyskać ich wartość z pełnego zakresu właściwości dostępnych zarówno w czasie oceny, jak i w czasie kompilacji. Z drugiej strony te parametry dotyczą tylko określonego wystąpienia zadania w określonym obiekcie docelowym.
Uwaga
Parametry zadania są oceniane w kontekście węzła nadrzędnego, a nie w kontekście hosta zadań. Zmienne środowiskowe zależne od środowiska uruchomieniowego lub architektury (takie jak lokalizacja plików programu) będą oceniać wartość zgodną z węzłem nadrzędnym. Jeśli jednak ta sama zmienna środowiskowa jest odczytywana bezpośrednio przez zadanie, zostanie ona poprawnie obliczona w kontekście hosta zadań.