TFS 签入时的自动代码分析

Automatic code analysis on check-in in TFS

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

问题是该项目的大多数开发人员只从事遗留技术的工作,很难让他们了解正确代码形式的重要性。

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

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

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

是否有一种方法可以在 TFS 服务器级别实现这一点,从而防止人们向文件添加行,但他们不会被迫重构 20k class 只是为了提交他们的更改?

没有默认方法可以实现您的要求。您需要自定义签入策略以将本地文件与同一文件的服务器副本进行比较。

您需要做的第一步是从 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();
        }
    }
}