孙展波:实现.NET无限潜力

Realize .NET Potential (中文版)
随笔 - 430, 评论 - 12203, 引用 - 54

导航

关于

贴子以"现状"提供且没有任何担保也没有授予任何权利。
计数器(2005/12/8起).点击阅读我的Blog In English

标签

每月存档

最新留言

广告

自定义MSBuild之Task示例

除了MSBuild自身提供的各项Task(任务),每个项目还可以定义自己的Task。自定义的Task可以通过UsingTask在MSBuild的project中使用。

在Tech Ed课程中得到演示的一个MSBuild Custom Task完成很简单的任务:从RawScoreFile中读取Tech Ed课程评分并计算平均值。因为这个演示不是Tech Ed课程的主要内容(我并没有MSBuild的课程),所以届时没有时间显示代码,而请参考本Blog的内容。

用VS2005创建一个新的Class Library的项目叫做TechEdCourseEvalution,增加对Microsoft.Build.Framework和Microsoft.Build.Utilities的引用(Reference),删除VS2005自动加入的源文件,增加一个新类叫做CountAverage.其内容如下:

using System; using Microsoft.Build.Utilities; using Microsoft.Build.Framework; namespace Microsoft.TechEdCn.Demo { public sealed class CountAverage : Task { public override bool Execute() { bool executeSuccessful = false; this.Log.LogMessage(MessageImportance.Normal, "Tech Ed 2005 China Course Evaluation"); string fileName = this.rawScoreFile.ItemSpec; if (!System.IO.File.Exists(fileName)) { executeSuccessful = false; Log.LogError("RawScoreFile Does Not Exisit. Task Aborted."); } else { int numberOfEvaluations = 0; int totalScores = 0; int score; string[] scoreLines = System.IO.File.ReadAllLines(fileName); foreach (string scoreLine in scoreLines) { if (!(Int32.TryParse(scoreLine, out score))) { Log.LogWarning("Invalid Format : {0}", scoreLine); } else if (score <= 0 || score > 9) { Log.LogWarning("Invalid Score: {0}", score); } else { numberOfEvaluations++; totalScores += score; } } if (numberOfEvaluations == 0) { this.Log.LogError("Nobody submitted evaluation. Task Aborted."); executeSuccessful = false; //unnecessary, but better explicit } else { double average = (double)totalScores / (double)numberOfEvaluations; if (average > 8.88) { this.Log.LogMessage(MessageImportance.High, "Congratulations on your score: {0:N2}", average); } AverageScore = average; executeSuccessful = true; } } return executeSuccessful; } [Required] public ITaskItem RawScoreFile { get { return rawScoreFile; } set { rawScoreFile = value; } } private ITaskItem rawScoreFile; private double averageScore; [Output] public double AverageScore { get { return averageScore; } set { averageScore = value; } } } }

posted on 2005-09-04 19:49:00 by zhanbos  评论(14) 阅读(3656)

MSBuild自身提供的各项Task(任务)参考文档

MSBuildV1版本已基本定形。其自身提供的各项任务在使用上也不会有太大的变化了,并且应该可以满足绝大多数项目的需要。了解每个任务是使用好MSBuild的一个必要条件,因为TaskMSBuild的积木(Building block)。

 

这样的任务有三十多个。不少是对常用的命令行工具的封装。如Csc Task, Vbc Task, Lc Task。还有在Build中常用的任务(现在往往通过批处理文件,脚本文件实现)如Exec TaskMakeDir, RemoveDir,和Touch。以及支持MSBuild的任务如CreateItemCreateProperty.

 

所有的参考文档可以在MSDNMSBuild Task Reference页上看到。注意在ReadLinesFromFile Task页中,其中的例子少了一个 </ReadLinesFromFile>

 

贴子以"现状"提供且没有任何担保也没有授予任何权利

posted on 2005-08-08 01:58:00 by zhanbos  评论(9) 阅读(4412)

Powered by: Joycode.MVC引擎 0.5.2.0