Tworzenie zadania wbudowanego
Zadania programu MSBuild są zwykle tworzone przez kompilowanie klasy, która implementuje ITask interfejs. Począwszy od programu .NET Framework w wersji 4, można tworzyć zadania wbudowane w pliku projektu. Nie trzeba tworzyć oddzielnego zestawu do hostowania zadania. Aby uzyskać więcej informacji, zobacz Zadania wbudowane.
W tym przewodniku pokazano, jak utworzyć i uruchomić następujące zadania wbudowane:
Zadanie, które nie ma parametrów wejściowych ani wyjściowych.
Zadanie z jednym parametrem wejściowym i bez parametrów wyjściowych.
Zadanie, które ma dwa parametry wejściowe i jeden parametr wyjściowy, który zwraca właściwość MSBuild.
Zadanie, które ma dwa parametry wejściowe i jeden parametr wyjściowy, który zwraca element MSBuild.
Aby utworzyć i uruchomić zadania, użyj programu Visual Studio i okna wiersza polecenia programu Visual Studio w następujący sposób:
Utwórz plik projektu MSBuild przy użyciu programu Visual Studio.
Zmodyfikuj plik projektu w programie Visual Studio, aby utworzyć zadanie wbudowane.
Użyj okna wiersza polecenia, aby skompilować projekt i sprawdzić wyniki.
Tworzenie i modyfikowanie projektu MSBuild
System projektu programu Visual Studio jest oparty na programie MSBuild. W związku z tym można utworzyć plik projektu kompilacji przy użyciu programu Visual Studio. W tej sekcji utworzysz plik projektu Visual C#. (Zamiast tego można utworzyć plik projektu Visual Basic. W kontekście tego samouczka różnica między dwoma plikami projektu jest niewielka.
Aby utworzyć i zmodyfikować plik projektu
W programie Visual Studio utwórz nowy projekt przy użyciu szablonu Aplikacji formularzy systemu Windows w języku C#. W polu Nazwa wpisz
InlineTasks
. Wpisz lokalizację rozwiązania, na przykład D:\. Upewnij się, że wybrano pozycję Utwórz katalog dla rozwiązania, opcja Dodaj do kontroli źródła jest wyczyszczone, a nazwa rozwiązania to InlineTasks.Kliknij przycisk OK , aby utworzyć plik projektu.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy węzeł projektu InlineTasks, a następnie kliknij polecenie Zwolnij projekt.
Ponownie kliknij prawym przyciskiem myszy węzeł projektu, a następnie kliknij polecenie Edytuj inlineTasks.csproj.
Plik projektu zostanie wyświetlony w edytorze kodu.
Dodawanie podstawowego zadania Hello
Teraz dodaj do pliku projektu podstawowe zadanie, które wyświetla komunikat "Hello, world!" Dodaj również domyślny element docelowy programu TestBuild w celu wywołania zadania.
Aby dodać podstawowe zadanie Hello
W węźle głównym
Project
zmień atrybut naDefaultTargets
TestBuild
. WynikowyProject
węzeł powinien przypominać ten przykład:<Project ToolsVersion="4.0" DefaultTargets="TestBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Dodaj następujące zadanie wbudowane i element docelowy do pliku projektu tuż przed tagiem
</Project>
.<UsingTask TaskName="Hello" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > <ParameterGroup /> <Task> <Code Type="Fragment" Language="cs"> Log.LogMessage(MessageImportance.High, "Hello, world!"); </Code> </Task> </UsingTask> <Target Name="TestBuild"> <Hello /> </Target>
Zapisz plik projektu.
Ten kod tworzy wbudowane zadanie o nazwie Hello i nie ma parametrów, odwołań ani
Using
dyrektyw. Zadanie Hello zawiera tylko jeden wiersz kodu, który wyświetla komunikat hello na domyślnym urządzeniu rejestrowania, zazwyczaj w oknie konsoli.
Uruchamianie zadania Hello
Uruchom program MSBuild przy użyciu okna wiersza polecenia, aby skonstruować zadanie Hello i przetworzyć obiekt docelowy programu TestBuild, który go wywołuje.
Aby uruchomić zadanie Hello
Kliknij przycisk Start, kliknij pozycję Wszystkie programy, a następnie znajdź folder Visual Studio Tools , a następnie kliknij pozycję Wiersz polecenia programu Visual Studio.
W oknie wiersza polecenia znajdź folder zawierający plik projektu, w tym przypadku D:\InlineTasks\InlineTasks\InlineTasks\.
Wpisz msbuild bez przełączników poleceń, a następnie naciśnij klawisz Enter. Domyślnie tworzy plik InlineTasks.csproj i przetwarza domyślny docelowy program TestBuild, który wywołuje zadanie Hello.
Sprawdź dane wyjściowe w oknie wiersza polecenia. Powinien zostać wyświetlony następujący wiersz:
Hello, world!
Uwaga
Jeśli nie widzisz komunikatu hello, spróbuj ponownie zapisać plik projektu, a następnie uruchomić zadanie Hello.
Naprzemiennie między edytorem kodu a oknem wiersza polecenia można zmienić plik projektu i szybko wyświetlić wyniki.
Definiowanie zadania Echo
Utwórz wbudowane zadanie, które akceptuje parametr ciągu i wyświetla ciąg na domyślnym urządzeniu rejestrowania.
Aby zdefiniować zadanie Echo
W edytorze kodu zastąp zadanie Hello i element docelowy TestBuild przy użyciu następującego kodu.
<UsingTask TaskName="Echo" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > <ParameterGroup> <Text Required="true" /> </ParameterGroup> <Task> <Code Type="Fragment" Language="cs"> Log.LogMessage(MessageImportance.High, Text); </Code> </Task> </UsingTask> <Target Name="TestBuild"> <Echo Text="Greetings!" /> </Target>
W oknie wiersza polecenia wpisz msbuild bez przełączników poleceń, a następnie naciśnij klawisz Enter. Domyślnie ta funkcja przetwarza domyślny docelowy program TestBuild, który wywołuje zadanie Echo.
Sprawdź dane wyjściowe w oknie wiersza polecenia. Powinien zostać wyświetlony następujący wiersz:
Greetings!
Ten kod definiuje wbudowane zadanie o nazwie Echo i ma tylko jeden wymagany parametr wejściowy Text. Domyślnie parametry są typu System.String. Wartość parametru Text jest ustawiana, gdy obiekt docelowy TestBuild wywołuje zadanie Echo.
Definiowanie zadania dodatku
Utwórz wbudowane zadanie, które dodaje dwa parametry całkowite i emituje sumę jako właściwość MSBuild.
Aby zdefiniować zadanie dodatku
W edytorze kodu zastąp zadanie Echo i obiekt docelowy TestBuild przy użyciu następującego kodu.
<UsingTask TaskName="Adder" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > <ParameterGroup> <A ParameterType="System.Int32" Required="true" /> <B ParameterType="System.Int32" Required="true" /> <C ParameterType="System.Int32" Output="true" /> </ParameterGroup> <Task> <Code Type="Fragment" Language="cs"> C = A + B; </Code> </Task> </UsingTask> <Target Name="TestBuild"> <Adder A="4" B="5"> <Output PropertyName="Sum" TaskParameter="C" /> </Adder> <Message Text="The sum is $(Sum)" Importance="High" /> </Target>
W oknie wiersza polecenia wpisz msbuild bez przełączników poleceń, a następnie naciśnij klawisz Enter. Domyślnie ta funkcja przetwarza domyślny docelowy program TestBuild, który wywołuje zadanie Echo.
Sprawdź dane wyjściowe w oknie wiersza polecenia. Powinien zostać wyświetlony następujący wiersz:
The sum is 9
Ten kod definiuje wbudowane zadanie o nazwie Adder i ma dwa wymagane parametry wejściowe liczby całkowitej, A i B oraz jeden parametr wyjściowy liczby całkowitej, C. Zadanie dodatku dodaje dwa parametry wejściowe i zwraca sumę w parametrze wyjściowym. Suma jest emitowana jako właściwość
Sum
MSBuild . Wartości parametrów wejściowych są ustawiane, gdy obiekt docelowy Programu TestBuild wywołuje zadanie dodatku.
Definiowanie zadania RegX
Utwórz wbudowane zadanie, które akceptuje grupę elementów i wyrażenie regularne, i zwraca listę wszystkich elementów, które mają zawartość pliku zgodną z wyrażeniem.
Aby zdefiniować zadanie RegX
W edytorze kodu zastąp zadanie Adder i element docelowy TestBuild przy użyciu następującego kodu.
<UsingTask TaskName="RegX" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > <ParameterGroup> <Expression Required="true" /> <Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" /> <Result ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" /> </ParameterGroup> <Task> <Using Namespace="System.Text.RegularExpressions"/> <Code Type="Fragment" Language="cs"> <![CDATA[ if (Files.Length > 0) { Result = new TaskItem[Files.Length]; for (int i = 0; i < Files.Length; i++) { ITaskItem item = Files[i]; string path = item.GetMetadata("FullPath"); using(StreamReader rdr = File.OpenText(path)) { if (Regex.Match(rdr.ReadToEnd(), Expression).Success) { Result[i] = new TaskItem(item.ItemSpec); } } } } ]]> </Code> </Task> </UsingTask> <Target Name="TestBuild"> <RegX Expression="public|protected" Files="@(Compile)"> <Output ItemName="MatchedFiles" TaskParameter="Result" /> </RegX> <Message Text="Input files: @(Compile)" Importance="High" /> <Message Text="Matched files: @(MatchedFiles)" Importance="High" /> </Target>
W oknie wiersza polecenia wpisz msbuild bez przełączników poleceń, a następnie naciśnij klawisz Enter. Domyślnie ta funkcja przetwarza domyślny docelowy program TestBuild, który wywołuje zadanie RegX.
Sprawdź dane wyjściowe w oknie wiersza polecenia. Powinny zostać wyświetlone następujące wiersze:
Input files: Form1.cs;Form1.Designer.cs;Program.cs;Properties\AssemblyInfo.cs;Properties\Resources.Designer.cs;Properties\Settings.Designer.cs
Matched files: Form1.cs;Form1.Designer.cs;Properties\Settings.Designer.cs
Ten kod definiuje wbudowane zadanie o nazwie RegX i ma następujące trzy parametry:
Expression
jest wymaganym parametrem wejściowym ciągu, który ma wartość zgodną z wyrażeniem regularnym. W tym przykładzie wyrażenie pasuje do wyrazów "public" lub "protected".Files
jest wymaganym parametrem wejściowym listy elementów, który ma wartość, która jest listą plików do wyszukania dopasowania. W tym przykładzieFiles
Compile
ustawiono element , który zawiera listę plików źródłowych projektu.Result
jest parametrem wyjściowym, który ma wartość, która jest listą plików, które mają zawartość zgodną z wyrażeniem regularnym.Wartość parametrów wejściowych jest ustawiana, gdy obiekt docelowy TestBuild wywołuje zadanie RegX. Zadanie RegX odczytuje każdy plik i zwraca listę plików, które są zgodne z wyrażeniem regularnym. Ta lista jest zwracana jako
Result
parametr wyjściowy, który jest emitowany jako elementMatchedFiles
MSBuild .
Obsługa znaków zarezerwowanych
Analizator MSBuild przetwarza zadania wbudowane jako XML. Znaki, które mają zastrzeżone znaczenie w kodzie XML, na przykład "<" i ">", są wykrywane i obsługiwane tak, jakby były xml, a nie kodem źródłowym platformy .NET. Aby uwzględnić zastrzeżone znaki w wyrażeniach kodu, takich jak Files.Length > 0
, zapisz Code
element, aby jego zawartość znajdowała się w wyrażeniu CDATA w następujący sposób:
<Code Type="Fragment" Language="cs">
<![CDATA[
if (Files.Length > 0)
{
// Your code goes here.
}
]]>
</Code>