Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
MSBuild görevleri genellikle arabirimini uygulayan ITask bir sınıf derlenerek oluşturulur. Daha fazla bilgi için bkz. Görevler.
Derlenmiş görev oluşturma yükünü önlemek istediğinizde, proje dosyasında veya içeri aktarılan bir dosyada satır içi bir görev oluşturabilirsiniz. Görevi barındırmak için ayrı bir derleme oluşturmanız gerekmez. Satır içi görev kullanmak, kaynak kodu izlemeyi ve görevi dağıtmayı kolaylaştırır. Kaynak kod, MSBuild proje dosyasıyla veya içeri aktarılan dosyayla (genellikle bir dosya) tümleşiktir .targets .
Kod görev fabrikası kullanarak satır içi görev oluşturursunuz. Geçerli geliştirme için, yerine CodeTaskFactoryRoslynCodeTaskFactory kullandığınızdan emin olun.
CodeTaskFactory yalnızca 4.0'a kadar olan C# sürümlerini destekler.
Satır içi görevler, karmaşık bağımlılıklar gerektirmeyen küçük görevler için kolaylık sağlamak amacıyla tasarlanmıştır. Satır içi görevler için hata ayıklama desteği sınırlıdır. Daha karmaşık kod yazmak, NuGet paketine başvurmak, dış araçlar çalıştırmak veya hata koşulları oluşturabilecek işlemler gerçekleştirmek istediğinizde satır içi görev yerine derlenmiş bir görev oluşturmanız önerilir. Ayrıca, satır içi görevler her derlemenizde derlenir, bu nedenle derleme performansı üzerinde belirgin bir etki olabilir.
Satır içi görevin yapısı
Satır içi görev UsingTask öğesi tarafından bulunur. Satır içi görev ve UsingTask onu içeren öğe genellikle bir .targets dosyaya eklenir ve gerektiğinde diğer proje dosyalarına içeri aktarılır. Aşağıda, hiçbir şey yapmaz ancak söz dizimini gösteren temel bir satır içi görev bulunur:
<!-- This simple inline task does nothing. -->
<UsingTask
TaskName="DoNothing"
TaskFactory="RoslynCodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
<ParameterGroup />
<Task>
<Reference Include="" />
<Using Namespace="" />
<Code Type="Fragment" Language="cs">
</Code>
</Task>
</UsingTask>
UsingTask Örnekteki öğesi, görevi açıklayan üç özniteliği ve onu derleyen satır içi görev fabrikasına sahiptir.
TaskNameÖzniteliği, bu durumdaDoNothinggörevi olarak adlandırın.özniteliği,
TaskFactorysatır içi görev fabrikasını uygulayan sınıfı adlandırıyor.AssemblyFileözniteliği satır içi görev fabrikasının konumunu verir. Alternatif olarak, özniteliğiniAssemblyNamekullanarak genellikle içinde$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dllbulunan satır içi görev fabrikası sınıfının tam adını belirtebilirsiniz.
Görevin kalan öğeleri DoNothing boş ve satır içi görevin sırasını ve yapısını göstermek için sağlanır. Bu makalenin devamında eksiksiz bir örnek verilmiştir.
ParameterGroupöğesi isteğe bağlıdır. Belirtildiğinde, görevin parametrelerini bildirir. Giriş ve çıkış parametreleri hakkında daha fazla bilgi için bu makalenin devamında yer alan Giriş ve çıkış parametreleri bölümüne bakın.Tasköğesi görev kaynak kodunu açıklar ve içerir.öğesi,
Referencekodunuzda kullandığınız .NET derlemelerine başvuruları belirtir. Bu öğenin kullanılması, Visual Studio'da bir projeye başvuru eklemekle eşdeğerdir. özniteliği,Includebaşvuruda bulunılan derlemenin yolunu belirtir. Mscorlib, .NET Standard, Microsoft.Build.Framework ve Microsoft.Build.Utilities.Core'daki derlemelerin yanı sıra geçişli olarak bağımlılık olarak başvuruda bulunan bazı derlemeler olmadanReferenceda kullanılabilir.öğesi,
Usingerişmek istediğiniz ad alanlarını listeler. Bu öğe C# içindeki yönergesineusingeşdeğerdir.Namespaceözniteliği, eklenecek ad alanını belirtir. Bu kod, yönergelerin izin verilmediği bir yöntem gövdesine yerleştirildiğindenusing, satır içi koda bir yönerge koymakusingişe yaramaz.
Reference ve Using öğeleri dil-agnostic. Satır içi görevler Visual Basic veya C# dilinde yazılabilir.
Uyarı
öğesinin Task içerdiği öğeler, bu örnekte kod görev fabrikası olan görev fabrikasına özeldir.
Kod öğesi
öğesi içinde Task görünecek son alt öğe öğesidir Code . öğesi, Code bir görevde derlenmiş olmasını istediğiniz kodu içerir veya bulur. öğesine ne koyacağınız Code , görevi nasıl yazmak istediğinize bağlıdır.
Language özniteliği kodunuzun yazıldığı dili belirtir. Visual Basic için C# vb için kabul edilebilir değerlerdircs.
Type özniteliği, öğesinde Code bulunan kodun türünü belirtir.
değeri
TypeiseClassCode, öğesi arabiriminden türetilen bir sınıfın ITask kodunu içerir.değeri
TypeiseMethodkod, arabirimininExecuteyönteminin geçersiz kılmasını ITask tanımlar.değeri
TypeiseFragment, kod yönteminExecuteiçeriğini tanımlar, ancak imzayı veya deyiminireturntanımlamaz.
Kodun kendisi genellikle bir <![CDATA[ işaretçi ile ]]> işaretçi arasında görünür. Kod bir CDATA bölümünde olduğundan, "" veya> "<" gibi ayrılmış karakterlerden kaçış konusunda endişelenmeniz gerekmez.
Alternatif olarak, öğesinin SourceCode özniteliğini kullanarak görevinizin kodunu içeren bir dosyanın konumunu belirtebilirsiniz. Kaynak dosyadaki kod özniteliği tarafından Type belirtilen türde olmalıdır.
Source Özniteliği varsa, varsayılan değeri Type olurClass. Yoksa Source , varsayılan değer olur Fragment.
Uyarı
Kaynak dosyada görev sınıfını tanımlarken, sınıf adı ilgili UsingTask öğesinin özniteliğini TaskName kabul etmelidir.
HelloWorld
Aşağıda basit bir satır içi görev örneği verilmiştir. HelloWorld görevi, genellikle sistem konsolu veya Visual Studio Çıkış penceresi olan varsayılan hata günlüğü cihazında "Hello, world!" ifadesini görüntüler.
<Project>
<!-- This simple inline task displays "Hello, world!" -->
<UsingTask
TaskName="HelloWorld"
TaskFactory="RoslynCodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
<ParameterGroup />
<Task>
<Using Namespace="System"/>
<Using Namespace="System.IO"/>
<Code Type="Fragment" Language="cs">
<![CDATA[
// Display "Hello, world!"
Log.LogError("Hello, world!");
]]>
</Code>
</Task>
</UsingTask>
</Project>
HelloWorld görevini HelloWorld.targets adlı bir dosyaya kaydedebilir ve sonra bir projeden aşağıdaki gibi çağırabilirsiniz.
<Project>
<Import Project="HelloWorld.targets" />
<Target Name="Hello">
<HelloWorld />
</Target>
</Project>
Giriş ve çıkış parametreleri
Satır içi görev parametreleri bir ParameterGroup öğenin alt öğeleridir. Her parametre, onu tanımlayan öğenin adını alır. Aşağıdaki kod parametresini Texttanımlar.
<ParameterGroup>
<Text />
</ParameterGroup>
Parametreler şu özniteliklerden birine veya daha fazlasına sahip olabilir:
-
Requiredvarsayılan olarak isteğe bağlı bir özniteliktirfalse. isetrue, parametre gereklidir ve görevi çağırmadan önce bir değer verilmelidir. -
ParameterTypevarsayılan olarak isteğe bağlı bir özniteliktirSystem.String. kullanılarak ChangeTypebir dizeye ve dizeden dönüştürülebilen bir öğe veya değer olan herhangi bir tam türe ayarlanabilir. (Başka bir deyişle, dış göreve ve dış görevden geçirilebilen herhangi bir tür.) -
Outputvarsayılan olarak isteğe bağlı bir özniteliktirfalse. isetrueExecute yönteminden dönmeden önce parametresine bir değer verilmelidir.
Örneğin
<ParameterGroup>
<Expression Required="true" />
<Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
<Tally ParameterType="System.Int32" Output="true" />
</ParameterGroup>
şu üç parametreyi tanımlar:
Expression, System.String türünde gerekli bir giriş parametresidir.Filesgerekli bir öğe listesi giriş parametresidir.TallySystem.Int32 türünde bir çıkış parametresidir.
Code öğesi veya Methodözniteliğine TypeFragment sahipse, her parametre için otomatik olarak özellikler oluşturulur. Aksi takdirde, özelliklerin görev kaynak kodunda açıkça bildirilmesi ve parametre tanımlarıyla tam olarak eşleşmesi gerekir.
Satır içi görevde hata ayıklama
MSBuild, satır içi görev olarak bir kaynak dosyası oluşturur ve çıkışı appdata\local\temp\MSBuildTemp geçici dosyalar klasöründe guid dosya adıyla metin dosyasına yazar. Çıkış normalde silinir, ancak bu çıkış dosyasını korumak için ortam değişkenini MSBUILDLOGCODETASKFACTORYOUTPUT 1 olarak ayarlayabilirsiniz.
Örnek 1
Aşağıdaki satır içi görev, belirtilen dosyadaki bir belirtecin her oluşumunu verilen değerle değiştirir.
<Project>
<UsingTask TaskName="TokenReplace" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
<ParameterGroup>
<Path ParameterType="System.String" Required="true" />
<Token ParameterType="System.String" Required="true" />
<Replacement ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs"><![CDATA[
string content = File.ReadAllText(Path);
content = content.Replace(Token, Replacement);
File.WriteAllText(Path, content);
]]></Code>
</Task>
</UsingTask>
<Target Name='Demo' >
<TokenReplace Path="Target.config" Token="$MyToken$" Replacement="MyValue"/>
</Target>
</Project>
Örnek 2
Aşağıdaki satır içi görev serileştirilmiş çıkış oluşturur. Bu örnekte çıkış parametresi ve başvuru kullanımı gösterilmektedir.
<Project>
<PropertyGroup>
<RoslynCodeTaskFactoryAssembly Condition="$(RoslynCodeTaskFactoryAssembly) == ''">$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll</RoslynCodeTaskFactoryAssembly>
</PropertyGroup>
<UsingTask
TaskName="MyInlineTask"
TaskFactory="RoslynCodeTaskFactory"
AssemblyFile="$(RoslynCodeTaskFactoryAssembly)">
<ParameterGroup>
<Input ParameterType="System.String" Required="true" />
<Output ParameterType="System.String" Output="true" />
</ParameterGroup>
<Task>
<Reference Include="System.Text.Json" /> <!-- Reference an assembly -->
<Using Namespace="System.Text.Json" /> <!-- Use a namespace -->
<Code Type="Fragment" Language="cs">
<![CDATA[
Output = JsonSerializer.Serialize(new { Message = Input });
]]>
</Code>
</Task>
</UsingTask>
<Target Name="RunInlineTask">
<MyInlineTask Input="Hello, Roslyn!" >
<Output TaskParameter="Output" PropertyName="SerializedOutput" />
</MyInlineTask>
<Message Text="Serialized Output: $(SerializedOutput)" />
</Target>
</Project>