谢谢!
确实,仅有一个简单的管理界面,查询删除修改到是都有,木有锁定。 或许微软只是觉得这是个源码恢复以前版本的方法,没再多想。 其实有了二次开发,灵活度就大多了。可以做很多事情
其实这么看来是挺好用的。而且灵活度非常的大。等我把源码整理下发上来。
TFS 二次开发 - 基线文件管理器(5)- 源码文件的读取
在上一节中,我们在保存标签之前,已经将勾选的文件路径保存到了 Listbox 中,这里只需要将保存的数据输出去为 txt 文档就可以做版本控制了。
版本文件比较复杂的是如何读取,也就是如何通过文件路径再次读取出一棵树。
这里我主要写一些思路和代码
1 存取的文件我们要将其读出后,存入一个 List 中。 2 通过文件路径,返回此文件的父级路径。
如 $/test2-agile/BuildProcessTemplates/LabDefaultTemplate.xaml
应该获取的路径为
$/test2-agile/BuildProcessTemplates/LabDefaultTemplate.xaml
$/test2-agile/BuildProcessTemplates
$/test2-agile 3 开始构建树。这个可以参考《TFS 二次开发 - 基线文件管理器(3)- 源码文件的读取》中构建项目的第一级目录树。 4 在此数中添加以获取的文件路径,并勾选已经选择的文件。
这种好处就是,无需读取所有树文件,只添加选择的文件的目录树。如果需要添加文件的时候,只需要重新勾选保存即可。
这次主要介绍的功能是 TFS 的登录、读取目录操作以及 Lable 操作。这里我能想到的还可以加上操作工作区的功能,如果可以的话,就可以直接签入签出了。
希望对大家有帮助。谢谢
TFS 二次开发 - 基线文件管理器(4)- 标签的创建
上一节已经完成了源码文件的读取,如果要将已经选择的文件保存为一个标签(Lable)。在 VS 我们只能对一个目录做标签,非常的不方便。如果用下面的方法,将选择的文件路径保存为一个 List 在打标签,就非常的灵活了。
保存为 List 的方法很简单,需要递归将已经选择的书中的文件保存一下。
这里为了显示方便,我先将其存入一个 Listbox 中,
[code] listBox1.Items.Clear();
for (int i = 0; i < treeView1.Nodes.Count; i++)
{
TreeNode node = treeView1.Nodes[i];
SetTreeViewList(node);
}[/code]
递归选取树中选择的节点并放入到 Listbox 中
[code] public void SetTreeViewList(TreeNode nodes) { //防止节点没有子节点被忽略 if (nodes.Checked) { listBox1.Items.Add(nodes.Text); } //有子节点 foreach (TreeNode newNode in nodes.Nodes) { if (newNode.Nodes.Count > 0) { SetTreeViewList(newNode); } //判断孩子节点 else { if (newNode.Checked) { //显示路径及版本 listBox1.Items.Add(newNode.Text); }
} }
}
[/code]
下面是将文件路径保存为标签。
[code] //确定文件数 int FileNum = listBox1.Items.Count; //这个 path 好似没用,不影响,所以写死了 string path = "$/test2-agile"; var versionControlLabel = new VersionControlLabel(version, "标签名称", version.AuthorizedUser, path, "标签注释"); //建立数组,每一个文件需要一个 var labelItemSpec = new LabelItemSpec[FileNum]; for (int i = 0; i < FileNum; i++) { string FileURL = TFSCommon.GetFileURL(listBox1.Items[i].ToString()); //判断是否为文件,因为有可能选的是路径,所以写了一个判断是否为文件的方法 if (! TFSCommon.IsFile(FileURL)) { MessageBox.Show("请选择文件"); return; } //RecursionType 设置递归类型 var itemSpec = new ItemSpec(FileURL, RecursionType.Full); labelItemSpec[i] = new LabelItemSpec(itemSpec, VersionSpec.Latest, false); } //创建 lable //LabelChildOption 其中三个选项,Fail = 失败, Replace = 替换, Merge = 合并 var lb = version.CreateLabel(versionControlLabel, labelItemSpec, LabelChildOption.Replace); MessageBox.Show(lb[0].Status.ToString());
[/code]
这里可以看到,标签的名称和注释可以自己写,比较灵活。在保存 Lable 的时候有三个选项。分别是失败、替换、合并。
当遇到同名标签的时候,如果选择失败会提示。如果选择替换会将原有标签替换为这次保存的文件。如果是合并,会将两次的标签合并。
TFS 二次开发 - 基线文件管理器(3)- 源码文件的读取
TFS 登录成功后,就可以开始读取源码目录树了。
一般来说,我不建议将整个树全部读取出来,因为这里不光存有项目文件,还有项目源码。如果全部读取出会是非常大的一棵树。因此我建议只读出根目录,每一次点击打开一级子目录。这样找到自己需要选取的文件即可。
上一节中,我们已经登录完成。
[code]//获取选择的项目名称,这里是单项目,一次取 pi[0] 的名称
pi = tpp.SelectedProjects;
ProjectURL = pi[0].Name;
VersionControlServer version = server.GetService(typeof(VersionControlServer)) as VersionControlServer;
//此处获取项目第一级文件目录
ItemSet items = version.GetItems(@"$\" + ProjectURL, RecursionType.OneLevel); [/code]
接下来构建项目的第一级目录树。获取的 item 是一个包括父节点的目录,因此要去除后再添加
[code]//先清空树
treeView1.Nodes.Clear();
//获取父节点
Item SubItem = items.Items[0];
string MainSub = SubItem.ServerItem;
foreach (Item item in items.Items)
{
//去除父节点
if (MainSub == item.ServerItem) {
}
else
{
TreeNode tnadd = new TreeNode(item.ServerItem);
tnadd.Name = item.ServerItem;
treeView1.Nodes.Add(item.ServerItem, item.ServerItem);
}
} [/code]
执行后的效果如下。项目下有两级目录。 [attach] 2448[/attach]
接下来做树的点击事件。通过递归,向点击的节点添加子节点。
[code]
///
/// 选择结点后的处理事件
///
///
///
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
version = server.GetService(typeof(VersionControlServer)) as VersionControlServer;
ItemSet items = version.GetItems(e.Node.Text, RecursionType.OneLevel);
foreach (Item item in items.Items)
{
if (e.Node.Text == item.ServerItem)
{
}
else
{
//这里用 name 来存储 changeset 的版本 ID,text 存显示路径
e.Node.Nodes.Add(item.ServerItem, item.ServerItem, item.ChangesetId);
}
e.Node.Expand();
}
}
}[/code]
最终的效果如下。 [attach] 2449[/attach]
TFS 二次开发 - 基线文件管理器(2)-TFS 登录
首先需要做一个 TFS 的登录。
以前的文章是使用的 DomainProjectPicker
最新的 VS 里面使用的是 TeamProjectPicker
首先可以在 WinForm 程序上写一个 Button,然后写入如下代码
[code] Uri tfsUri = new Uri("your TFS");
TfsTeamProjectCollection server = new TfsTeamProjectCollection(tfsUri);
TeamProjectPicker tpp = new TeamProjectPicker(TeamProjectPickerMode.SingleProject, false);
tpp.ShowDialog();
if (tpp.SelectedTeamProjectCollection != null) { server = tpp.SelectedTeamProjectCollection; }
else { MessageBox.Show("请选择项目"); return; } [/code]
这样,server 里面就存储了选取的 TFS 的内容了。
这里 TeamProjectPickerMode 有三个枚举,分别对应着如下的菜单,大家可以根据想达到的效果去选择。
[code] public enum TeamProjectPickerMode
{
NoProject = 0,
SingleProject = 1,
MultiProject = 2,
} [/code]
NoProject [attach] 2445[/attach]
SingleProject [attach] 2446[/attach]
MultiProject [attach] 2447[/attach]
完成选择后可以将其放入 ProjectInfo 中
[code] ProjectInfo[] pi;
pi = tpp.SelectedProjects;
string ProjectURL = pi[0].Name;[/code]
你搞出的问题?修改模板了么? 先上 build 服务器上面手动获取下试试 看看有啥问题不~
呃~~这都是啥?生成失败?
目前只有 20 人左右的开发团队,所以现在想引入 TFS 进行管理,并为今后规模扩充做好准备。因此打算搭建单服务器并配置 SharePoint Site,以便大家能够熟悉具体的使用方法。 [b] 这个是没有问题的,无论是使用域还是工作组环境。当然我是比较建议用域环境的(实际客户端是可以不加入域的,只是服务器在域环境中),如果能够多准备出一台机器做域控的话。这样在无论是在安装配置还是在配置权限上,都会方便很多。新的 TFS2012 可以使用 web 进行管理了,权限配置上在工作组环境应该比以前方便了 [/b]
由于开发过程中有大量的产品需求及设计成果物相关的文档需要进行版本管理及发布,我看 SharePoint 本身就有这样的功能,而且好像还能定义工作流。同时具有诸如会议、Task 日历、团队 WIKI 等功能,所以特别想尝试在 Team 内使用 SharePoint。 [b] 关于 Sharepoint,我们以前使用过,但是最终没有推广。原因是功能比较炫但是如果使用到高阶功能,还是很多地方需要二次开发。如果有一套标准流程的话,实际上是用什么工具都是 OK 的。如果只使用这几个功能,使用 TFS 自带的 Sharepoint Service 就可以了。如果使用这个的话,建议在完全的域环境下操作(预控 + 所有客户端使用域账户登录)。[/b]
关于报表服务,这个我一直没有弄明白怎么用,希望能够麻烦您能给普及一下知识 o(∩_∩) o [b] 报表服务很简单哈,先装 sql(要安装报表服务哦),然后再装 tfs,有配置的选项,配置完成后就可以自动进行了。会统计 bug 量,趋势和其他各种项目相关数据。当然这些操作是根据你的工作项完成情况进行统计的。[/b]
关于 laofo 的问题 授权是这样的 由于工作组环境 而非域环境 你在自己的 pc 机操作,实际上是使用 vs 的进程账户进行操作的(比如你用的 admin,密码是 123456),服务器会以为你使用的是服务器的 admin,但这时候他的密码不是 123456.所以无法进行操作。 这个解决办法出了使用域账户,就是在服务器上进行设置。
我也来回答下吧~ <需求>
1 我想使用 TFS2012 构建一个单服务器的开发环境(开发团队 20 人左右)---[b] 直接准备 TFS 和 sql 即可 [/b] 2 利用 TFS 规划项目各阶段作业计划,同时完成各种开发文档的版本管理与发布制定必要的工作流程---[b] 个人感觉只是管理文档没有使用 sharepoint 的必要.CMMI 中的 cm 在初期会设计好库和版本规则等,直接 TFS 的源码管理里面就可以实现简单的文档管理 [/b] 3 利用团队门户实时查看项目信息(Bug,残作业,统计图等)---[b] 完全没有问题,tfs 可以管理 bug,报表服务可以看统计内容 [/b] 4 我想知道为了完成上面的这些需求,我应该如何安装配置 TFS,以及如何建立起团队门户呢?---[b] 20 人使用单服务器配置完全可以 [/b]
因此,我觉得用单服务器安装,可以装 sql 和 tfs。 sharepoint 不用的说
laofo 于 2011-8-19 15:14 发表
你这样做倒是可以,就是太麻烦了;本来一个 cron job 就可以实现的 [/quote]
至少,脚本是一样的,建立后选择下就可以了 实现起来还是很简单的
laofo 刚刚想明白了
实际上可以这样的,你可以做一个脚本的模板 然后建立 N 个生成 比如 每日早生成 每日午生成 每日晚生成 调用相同的模板 然后为每个生成规定循环的时间就可以了
看着像是那个 extensions 那个插件的东西吧 要上重装下那个呢
这个是 2010 还是 08?
学习了~顶
西点 于 2011-8-4 10:54 发表
如果删除呢? [/quote]
删除文件么?
删除了,变更级应该是仍然存在的
研究了下 未遇见此问题
或许可以尝试将源码管理的生成文件夹重新删除 签入下
还真没注意这个 或许所谓的 dailybuild 就是每日生成一次吧 用来验证下是否下班前能通过:lol
或许有其他方法 我再研究下
却是是在用 vmware,但只是用 scvmm 加载了 Vmware 的虚拟机 最终很悲催 总之和微软的 lab management 不搭调 微软还是得用 hyper-v
先放一部分 看了朽木的部分,也十分赞。希望有机会整合,取长补短的说:)
[[i] 本帖最后由 elvis_0123 于 2011-4-25 00:48 编辑 ]
是不是编译完成后再杀毒会好些? 编译本来就消耗 cpu 和 io 如果有脚本,把杀毒关了。然后编译,然后杀毒 这会不会快些
关于流程,我觉得除了分布式构建,也就是提高生成服务器的硬件了
分布式还是比较复杂的~和程序的架构关系很大 只听说过有几个其他公司项目这么做的 主要为了每日构建和门签入这样的要求~~
[[i] 本帖最后由 elvis_0123 于 2011-4-15 16:55 编辑 ]
在自己的机器上么?还是构建服务器上?
刚刚看到 Microsoft (R) Build Engine Version 4.0.30319.1 [Microsoft .NET Framework, Version 4.0.30319.1] 难道用的是 4.0 的?
TFSBuild.proj 应该是 2008 的啊
还有个方法,就是将生成服务器的生成路径改为绝对路径 因为默认生成服务器使用的是个 temp 路径,很长,直接改为 d:\build 就行