2010年2月20日

MSBuild任务工厂:客串主演Windows Powershell

安德鲁·阿诺特
首席软件工程师

MSBuild 4.0的一个很酷的新特性是可扩展任务工厂。任务工厂允许您将脚本直接包含在项目文件(或导入的.targets文件)中,并由您喜欢的解释器解析和执行这些脚本。这些脚本甚至可能是C#或VB.NET代码片段,它们被编译成程序集并在构建过程中动态执行。这大大降低了在没有内置MSBuild Task的生成中执行专门工作的门槛,因为您不再需要将带有自定义任务的预编译.dll签入到源代码管理存储库中。出于性能原因或用C#编写MSBuild任务的设计时经验,您可能仍然希望这样做,并获得仅在C#项目中获得的所有C#Intellisense,但对于短任务,动态构建和执行的“内联任务”可能正是您所需的。

MSBuild 4.0附带内置的C#、VB.NET和XAML任务工厂,因此您现在可以在C#或VB.NET内联中定义自定义任务。但编写自己的任务工厂将允许您用Perl、Python或在本例中……Windows Powershell脚本编写内联任务。

举例来说,请考虑没有MSBuild任务在生成结束时发送电子邮件。用编译到.dll中的自定义MSBuild任务修复这个问题似乎有点重。但在项目文件中定义该任务很容易。以下是如何使用Windows Powershell任务工厂编写Powershell内联任务。请注意下面我们是如何首先根据任务执行的代码及其输入和输出参数来定义任务的。然后,在标准MSBuild Target中,我们像调用任何其他MSBuild任务一样调用该内联任务。 

<?xml version=“1.0”encoding=“utf-8”?><Project ToolsVersion=“4.0”DefaultTargets=“Build”xmlns=“http://schemas.microsoft.com/developer/msbuild/2003"><使用任务TaskFactory=“WindowsPowershellTaskFactory”TaskName=“发送邮件”AssemblyFile=“$(TaskFactoryPath)WindowsPowershellTaskFactory.dll”><参数组><From Required=“true”ParameterType=“System.String”/><需要收件人=“true”ParameterType=“System.String”/><Subject Required=“true”ParameterType=“System.String”/><Body Required=“true”ParameterType=“System.String”/><RecipientCount输出=“true”/></ParameterGroup(参数组)><任务><![CDATA(CDATA)[$smtp=新对象系统。净值。邮件。Smtp客户端$smtp(美元)。主机=“mail.microsoft.com”$smtp(美元)。凭据=[System.Net.CredentialCache]::DefaultCredentials$smtp(美元)。发送($From,$Recipients,$Subject,$Body)$RecipientCount=$个收件人。拆分(“;”)。长度$log。LogMessage([Microsoft.Build.Framework.MessageImportance]“高”,“向{0}个收件人发送邮件。”,$recipientCount)]]></任务></使用任务><属性组><构建实验室电子邮件>buildlab@yourcompany.com</BuildLab电子邮件><构建收件人>interested@party.com;boss@guy.com</BuildRecipients></PropertyGroup(属性组)><目标名称=“构建”><SendMail From=“$(BuildLabEmail)”Recipients=“$<Output TaskParameter=“RecipientCount”PropertyName=“ReceipientCount”/></添加></目标></项目>

此项目将生成,并向项目本身确定的收件人发送已生成的完成电子邮件。您唯一需要的程序集是Windows Powershell任务工厂本身,它可以用于包含内联Windows Powershel脚本的所有项目。

请注意,如果上面的内联任务没有它所指向的任务factory.dll,它将无法运行,在本例中是随VS2010一起提供Windows Powershell任务工厂可用作为MSDN代码库上的示例任务工厂。请随意查看并给出反馈。这只是一个示例,因此所有“无法保证适合任何特定任务”的限制都适用。但是你得到了源代码,所以如果你愿意的话,你可以调整它或者归档bug。

作者

安德鲁·阿诺特
首席软件工程师

首席软件工程师和OSS贡献者。Visual Studio平台。

0评论

讨论结束。

反馈