MSBuild satır içi görevleri
MSBuild görevleri genellikle arabirimini uygulayan ITask bir sınıf derlenerek oluşturulur. Daha fazla bilgi için bkz . Görevler.
.NET Framework sürüm 4'te başlayarak, proje dosyasında satır içi görevler oluşturabilirsiniz. Görevi barındırmak için ayrı bir derleme oluşturmanız gerekmez. Bu, kaynak kodu izlemeyi ve görevi dağıtmayı kolaylaştırır. Kaynak kodu betikle tümleşiktir.
MSBuild 15.8'de RoslynCodeTaskFactory eklendi. Geçerli geliştirme için CodeTaskFactory yerine RoslynCodeTaskFactory kullandığınızdan emin olun. CodeTaskFactory yalnızca 4.0'a kadar olan C# sürümlerini destekler.
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 dosyasına eklenir ve gerektiğinde diğer proje dosyalarına içeri aktarılır. Burada temel bir satır içi görev yer alır. Hiçbir şey yapmaz.
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This simple inline task does nothing. -->
<UsingTask
TaskName="DoNothing"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
<ParameterGroup />
<Task>
<Reference Include="" />
<Using Namespace="" />
<Code Type="Fragment" Language="cs">
</Code>
</Task>
</UsingTask>
</Project>
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 durumdaDoNothing
görevi olarak adlandırın.özniteliği,
TaskFactory
satı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ğiniAssemblyName
kullanarak genellikle içinde$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll
bulunan 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 konunun ilerleyen bölümlerinde daha sağlam 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 konunun 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,
Reference
kodunuzda kullandığınız .NET derlemelerine başvuruları belirtir. Bu, Visual Studio'da bir projeye başvuru eklemeye eşdeğerdir. özniteliği,Include
başvuruda bulunılan derlemenin yolunu belirtir.öğesi,
Using
erişmek istediğiniz ad alanlarını listeler. Bu, Visual C# deyimineUsing
benzer.Namespace
özniteliği, eklenecek ad alanını belirtir.
Reference
ve Using
öğeleri dil-agnostic. Satır içi görevler desteklenen .NET CodeDom dillerinden herhangi birinde yazılabilir; örneğin, Visual Basic veya Visual C# .
Dekont
öğ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
Type
iseClass
Code
, öğesi arabiriminden türetilen bir sınıfın ITask kodunu içerir.değeri
Type
iseMethod
kod, arabirimininExecute
yönteminin geçersiz kılmasını ITask tanımlar.değeri
Type
iseFragment
, kod yönteminExecute
içeriğini tanımlar, ancak imzayı veya deyiminireturn
tanı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 Source
Code
ö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
.
Dekont
Kaynak dosyada görev sınıfını tanımlarken, sınıf adı ilgili UsingTask öğesinin özniteliğini TaskName
kabul etmelidir.
Helloworld
Burada daha sağlam bir satır içi görev yer alır. 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. Reference
Örnekteki öğe yalnızca çizim için eklenmiştir.
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This simple inline task displays "Hello, world!" -->
<UsingTask
TaskName="HelloWorld"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
<ParameterGroup />
<Task>
<Reference Include="System.Xml"/>
<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 ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<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 Text
tanımlar.
<ParameterGroup>
<Text />
</ParameterGroup>
Parametreler şu özniteliklerden birine veya daha fazlasına sahip olabilir:
Required
varsayılan olarak isteğe bağlı bir özniteliktirfalse
. isetrue
, parametre gereklidir ve görevi çağırmadan önce bir değer verilmelidir.ParameterType
varsayılan olarak isteğe bağlı bir özniteliktirSystem.String
. System.Convert.ChangeType kullanılarak bir 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.)Output
varsayılan olarak isteğe bağlı bir özniteliktirfalse
. isetrue
Execute 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.Files
gerekli bir öğe listesi giriş parametresidir.Tally
System.Int32 türünde bir çıkış parametresidir.
Code
öğesi veya Method
özniteliğine Type
Fragment
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.
Örnek
Aşağıdaki satır içi görev, belirtilen dosyadaki bir belirtecin her oluşumunu verilen değerle değiştirir.
<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' ToolsVersion="15.0">
<UsingTask TaskName="TokenReplace" TaskFactory="CodeTaskFactory" 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="C:\Project\Target.config" Token="$MyToken$" Replacement="MyValue"/>
</Target>
</Project>