Udostępnij za pośrednictwem


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, , CLR4CurrentRuntimelub * (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, , x64CurrentArchitecturelub * (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 TaskNameatrybuty , RuntimeiArchitecture, 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 Overridetrue 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 MSB4275MSBuild .

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.exeprogramem .

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 AssemblyTaskFactoryelementu , który jest uruchamiany w bieżącym procesie. W przeciwnym razie program MSBuild przekazuje zadanie do TaskHostFactoryprogramu , 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 buildprogramu , 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 MSBuildRuntimeMSBuildArchitecture 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ń.