DIY增量包工具:Package Macker

zhongdaiqi · 2016-08-18 10:25 · 7 次阅读
Uncategorized

做版本发布,获取,编译,将增量变更的组件提出来,一直是人工操作,这可是人肉活ING!基本上来讲,小伙伴都不太喜欢,纯人肉,而且要非常小心,不小心搞错了,还要背个大黑锅.今天做了个Package Macker专门用来生成增量包,感觉就是妥妥的,再也不用担心增量包制作出问题啦,以后工作也更省心了。

image

Package Macker主要是通过TFS接口,获取变更集,窗体上的树形控件展示了所有的变更集,勾选所需要包含的变更集,点“生成版本包”,则可以增量包包,原来需要好一会儿的工作,现在只需要几秒钟就搞定,点点就OK.

好东东不独享,下面分享一下详细的技术知识与开发过程的经验:总得来说,这个小工具本身没有技术含量,用到的技术都是很简单的,只是TFS接口这东东得查资料,毕竟不是常用的东东。下面分几个方向介绍:

一、TFS接口引用

使用TFS接口,要引用相应的程序集,VS 2015对应的程序集位置:

在C盘搜索“Microsoft.TeamFoundation.Client”基本就能找到了,其他版本的VS也适用。

C:\Program Files\Common Files\microsoft shared\Team Foundation Server\14.0\Microsoft.TeamFoundation.Client.dll

程序集的引用,要引用不少,编译的时候有报错提醒,缺什么补什么,一会儿就能通过了。我在研发Package Macker的时候用到了以下引用:

image

小插曲:开始比较郁闷,网上的教程都是点引用,然后在.net组件里可以直接找到,我这一打开可是看了半天也没有。百度\Bing\So.com\MSDN都找了半天,硬是没有直接找到VS 2015 TFS接口组件的位置。突然,想到这招,既然在我电脑上,就直接在C盘搜索一下,对,就这么找到了。

二、获取TFS变更集的核心代码

Microsoft.TeamFoundation.VersionControl.Client.TeamProject[] tplist = GetAllTeamProject("http://server:8080/tfs/HelloCollection");
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(tfsUri);
//版本控制
VersionControlServer version = tpc.GetService(typeof(VersionControlServer)) as VersionControlServer;
//var histories = version.QueryHistory(serverDir, VersionSpec.Latest, 0, RecursionType.OneLevel, null, null, null, int.MaxValue, true, false);
var histories = version.QueryHistory(serverDir, VersionSpec.Latest, 0, RecursionType.Full, null, null, null, int.MaxValue, true, false);

foreach (Changeset history in histories) //遍历路径下的内容的所有历史版本
{
TreeNode tn = new TreeNode();
tn.Text =String.Format("{0}-{3}-{1}-{2}" ,history.ChangesetId,history.Comment,history.OwnerDisplayName,history.CreationDate);
tn.Tag = history;

treeViewHistory.Nodes.Add(tn);
foreach (Change change in history.Changes)//每个历史版本下修改了几个文件
{
string serverItem = change.Item.ServerItem;
string path = "D:\\" + change.Item.ChangesetId + "\\" + serverItem.Split('/').Last();
TreeNode changeTreeNode = new TreeNode();
changeTreeNode.Text = change.Item.ServerItem;
changeTreeNode.Tag = change;
tn.Nodes.Add(changeTreeNode);
}
}

注意:这里没有使用到TFS的凭证Credentials,但是代码就是能跑起来。所以使用的时候,先将自己的TFS连一下代码库,不连一次的话,估计会失败。

这段代码直接把更新集放到了树形组件上,同时对象也全部塞进到Tag里,方便生成时使用。如果你也想DIY一个增量包生成工具,这段代码可以解决关键问题。

三、增量包生成技巧

3.1 项目分类

项目比较多,但是主要分为类库项目,站点项目,因此,在处理变更记录时,要针对不同的项目进行处理。这里,通过正则表达式提取出项目名称。

Regex regex = new Regex(@"^\$/YueMA/0\.YueMa Code/trunk/(.*?)/[\s\S]*$");

通过使用正则表达式,可以提升工具的通用式,放到配置里面后,其他小伙伴要使用的话,直接将配置调整一下。

3.2 依据目标dll库,决定增量dll位置
这个说起来用点小绕,有的dll是多个站点共用的,有的则是一个站点单独使用的,如果去读取工程配置文件的引用关系,再决定放到哪个项目,那还得读取工程配置(csproj)。这里通过检查站点bin中是否存在来判断项目间的引用关系。代码片段:

//提取dll到相应的文件夹
foreach (String prj in specialPrj) {
String prjDllFile = Path.Combine(localDir, String.Format(@"{0}\bin\{1}.dll", prj, targetPrj));
if (File.Exists(prjDllFile)) {
Directory.CreateDirectory(Path.Combine(packageDir, prj, "bin"));
File.Copy(prjDllFile, Path.Combine(packageDir, String.Format(@"{0}\bin\{1}.dll", prj, targetPrj)),true);
}
}

3.3 生成版本更新清单说明

直接将更新集里的Commont拼成一个串,Write到记事本里,发版本通知的时候,直接帖上。

总结:

这个小工具的能解决增量包生成的问题,简单化版本工作,后续可以将Package压缩到zip里,服务器上再加一个自动部署的小工具,发布工作就更省心了。小工具启动的时候加载了所有变更集,如果有小伙伴的项目是几十年了,变更集比较多,不知道会不会把内存吃完,对于我们的项目来说,完全不会有这个问题。

评论

还没有评论,登录后来说两句。