在TFS

时间:2018-01-07 09:04:30

标签: visual-studio tfs code-analysis

我们正在研究遗留的WinForms项目,该项目忽略了基本的编码标准,现在有很多类,有20k +代码行。

问题在于,这个项目的大多数开发人员只研究过遗留技术,而且对于正确代码形式的重要性教育他们有点困难。

我正在考虑在我们的TFS服务器中实施检查,如果一个(或多个)更改文件的大小超过2000行并且新版本大于前一个版本,它将阻止他们检查代码

这会阻止文件增长,只会减小文件大小。

不幸的是,据我所知,TFS代码分析规则集只考虑了签入代码的当前状态,并且无法与以前的版本进行比较(工作区版本与服务器版本)版本)。

是否有办法在TFS服务器级别实现此功能,以防止人们向文件添加行,但是他们不会被迫重构20k类只是为了提交更改?

1 个答案:

答案 0 :(得分:0)

没有默认方式来满足您的要求。您需要自定义签入策略,以将本地文件与同一文件的服务器副本进行比较。

您需要的第一步是从TFS获取最新版本的文件。然后将本地文件与下载的文件进行比较。这里有a blog分享了如何检索给定文件的最新版本的示例:

using System;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string teamProjectCollectionUrl = "https://YourTfsUrl/tfs/YourTeamProjectCollection";
            string filePath = @"C:\project\myfile.cs";

            // Get the version control server
            TfsTeamProjectCollection teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(teamProjectCollectionUrl));
            VersionControlServer versionControlServer = teamProjectCollection.GetService<VersionControlServer>();

            // Get the latest Item for filePath
            Item item = versionControlServer.GetItem(filePath, VersionSpec.Latest);

            // Download and display content to console
            string fileString = string.Empty;

            using (Stream stream = item.DownloadFile())
            {
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    stream.CopyTo(memoryStream);

                    // Use StreamReader to read MemoryStream created from byte array
                    using (StreamReader streamReader = new StreamReader(new MemoryStream(memoryStream.ToArray())))
                    {
                        fileString = streamReader.ReadToEnd();
                    }
                }
            }

            Console.WriteLine(fileString);
            Console.ReadLine();
        }
    }
}