WriteCodeFragment — zadanie
Generuje plik kodu tymczasowego na podstawie określonego wygenerowanego fragmentu kodu. Nie usuwa pliku.
Parametry
W poniższej tabeli opisano parametry WriteCodeFragment
zadania.
Parametr | Opis |
---|---|
AssemblyAttributes |
Opcjonalny ITaskItem[] parametr.Opis atrybutów do zapisu. Wartość elementu Include jest pełną nazwą typu atrybutu, na przykład System.AssemblyVersionAttribute .Każda metadana jest parą name-value parametru. Przyjmuje się, że parametry mają być typu String w programie MSBuild 17.6 lub starszym, ale w programie MSBuild 17.7 lub nowszym można również używać typów innych niż String te, które są częścią mscorlib programu . Można na przykład użyć true wartości logicznych, false liczb całkowitych, wyliczenia i typów zmiennoprzecinkowych. Typ jest automatycznie wnioskowany ze składni. W przypadku typu innego mscorlib niż , określ typ parametru, podając wartości metadanych w formularzu {parameter}_TypeName .Niektóre atrybuty zezwalają tylko na argumenty konstruktora pozycyjnego. Można jednak użyć takich argumentów w dowolnym atrybucie. Aby ustawić atrybuty konstruktora pozycyjnego, użyj nazw metadanych przypominających _Parameter1 , _Parameter2 i tak dalej. Nie można pominąć indeksu parametrów.W programie MSBuild 17.7 lub nowszym można również określić metadane formularza {parameter}_IsLiteral , aby poinstruować zadanie o interpretowaniu tekstu wartości parametru w taki sposób, jak to jest, bez otaczania cudzysłowami (tak jak w przypadku wartości ciągu domyślnego). |
Language |
Wymagany parametr interfejsu String .Określa język kodu do wygenerowania. Language może być dowolnym językiem, dla którego jest dostępny dostawca CodeDom, na przykład "C#" lub "VisualBasic". Emitowany plik będzie miał domyślne rozszerzenie nazwy pliku dla tego języka. |
OutputDirectory |
Opcjonalny ITaskItem parametr. Określa folder docelowy wygenerowanego kodu, zazwyczaj folder pośredni. |
OutputFile |
Opcjonalny ITaskItem parametr wyjściowy. Określa ścieżkę wygenerowanego pliku. Jeśli ten parametr jest ustawiany przy użyciu nazwy pliku, folder docelowy jest poprzedzony nazwą pliku. Jeśli jest ona ustawiona przy użyciu katalogu głównego, folder docelowy zostanie zignorowany. Jeśli ten parametr nie jest ustawiony, nazwa pliku wyjściowego jest folderem docelowym, dowolną nazwą pliku i domyślnym rozszerzeniem nazwy pliku dla określonego języka. |
Uwagi
Oprócz parametrów wymienionych w tabeli to zadanie dziedziczy parametry z TaskExtension klasy, która sama dziedziczy po Task klasie. Aby uzyskać listę tych dodatkowych parametrów i ich opisy, zobacz TaskExtension, klasa bazowa.
To zadanie nie jest zwykle używane bezpośrednio w kodzie użytkownika.
Generowanie atrybutów na poziomie zestawu
W programie MSBuild 17.7 lub nowszym to zadanie zostało zaktualizowane w celu obsługi większej gamy typów parametrów dla atrybutów na poziomie zestawu. Program MSBuild 17.6 i starsze wersje są obsługiwane tylko String
jako typ parametru dla atrybutów na poziomie zestawu. W programie MSBuild 17.7 lub nowszym można utworzyć dowolny atrybut zestawu platformy .NET, nie tylko tych, których parametry były typami ciągów, jak we wcześniejszych wersjach programu MSBuild.
Aby na przykład zdefiniować atrybut CLSCompliant(true)
na poziomie zestawu , który używa parametru logicznego, można użyć następującej składni:
<ItemGroup>
<AssemblyAttribute Include="System.CLSCompliantAttribute">
<_Parameter1>true</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
Wygenerowany kod zależy od języka docelowego. W przypadku języka C#będzie to wyglądać następująco:
[assembly: System.CLSCompliantAttribute(true)]
Typy zdefiniowane w programie mscorlib
są automatycznie wnioskowane, takie jak wartość logiczna w poprzednim przykładzie. Metadane formularza {parameter}_TypeName
można zdefiniować, aby określić typy, których nie można wywnioskować.
<ItemGroup>
<AssemblyAttribute Include="Microsoft.Owin.OwinStartup">
<_Parameter1>Microsoft.Examples.Startup</_Parameter1>
<_Parameter1_TypeName>System.Type</_Parameter1_TypeName>
</AssemblyAttribute>
</ItemGroup>
Kod wygenerowany w języku C# jest następujący:
[assembly: Microsoft.Owin.OwinStartup(typeof(Microsoft.Examples.Startup))]
W przypadku bardziej skomplikowanych wartości parametrów można użyć polecenia {parameter}_IsLiteral
.
<ItemGroup>
<AssemblyAttribute Include="NUnit.Framework.Parallelizable">
<_Parameter1>NUnit.Framework.ParallelScope.Fixtures</_Parameter1>
<_Parameter1_IsLiteral>true</_Parameter1_IsLiteral>
</AssemblyAttribute>
</ItemGroup>
Poprzedni przykład tworzy następujący atrybut zestawu w języku C#:
[assembly: NUnit.Framework.Parallelizable(NUnit.Framework.ParallelScope.Fixtures)]
Można użyć dowolnej składni, która normalnie będzie dozwolona w deklaracji atrybutu w języku projektu. W przypadku parametru tablicy można użyć kodu podobnego do następującego:
<ItemGroup>
<AssemblyAttribute Include="TestAttribute">
<_Parameter1>new int[] { 1, 3, 5 } /* odd numbers */</_Parameter1>
<_Parameter1_IsLiteral>true</_Parameter1_IsLiteral>
</AssemblyAttribute>
</ItemGroup>
W przypadku używania składnia IsLiteral
jest interpretowana przez odpowiedni kompilator i dlatego jest specyficzna dla języka. Jeśli masz sytuacje, w których więcej niż jeden język współużytkuje ten sam plik importu MSBuild i/lub pliki projektu, może być konieczne użycie składni warunkowej, aby upewnić się, że kod kompiluje się z odpowiednim językiem specyficznym dla projektu.
Uwaga
Składnia opisana w tej sekcji (_TypeName
i _IsLiteral
sufiksach) nie jest obsługiwana w języku F#.
Przykład
Typowy przypadek użycia zadania WriteCodeFragment
znajduje się w obiekcie docelowym, który generuje plik, który definiuje atrybut na poziomie zestawu i dodaje go do kompilacji. Po AssemblyAttribute
zdefiniowaniu można wywołać WriteCodeFragment
zadanie, tak jak w poniższym kodzie.
<Target Name="AddAssemblyVersion" BeforeTargets="Build">
<ItemGroup>
<AssemblyAttribute Include="AssemblyVersion">
<_Parameter1>1.2.3.4</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
<WriteCodeFragment AssemblyAttributes="@(AssemblyAttribute)"
Language="C#"
OutputDirectory="$(IntermediateOutputPath)"
OutputFile="AssemblyVersion.cs">
<Output TaskParameter="OutputFile" ItemName="Compile" />
<Output TaskParameter="OutputFile" ItemName="FileWrites" />
</WriteCodeFragment>
</Target>
Parametr ma określoną nazwę pliku. Jeśli OutputFile
nie zostanie określona, nazwa pliku jest generowana losowo. Ponadto, aby dodać wygenerowany plik do kompilacji, Compile
lista elementów jest podawana jako dane wyjściowe. Plik jest również dodawany do listy elementów, dzięki czemu jest usuwany po uruchomieniu FileWrites
Clean
elementu docelowego.