当StyleCop遇到X次违规时停止MSBuild

时间:2013-11-13 16:29:37

标签: msbuild stylecop

我已使用StyleCop.MSBuild nuget包将StyleCop集成到构建管道中。它工作得很好,但它有一些局限性。我可以通过将StyleCop违规视为错误来使构建​​失败。这样就可以了,但这意味着我根本不会有任何违规行为。

我们想要做的是逐步将StyleCop引入构建管道,并允许开发人员在某些项目中有10个甚至20个StyleCop违规。

我尝试将StyleCopMaxViolationCount设置为1,希望如果获取1次违规,构建将失败,但是这不起作用 - 构建成功并显示警告。

<StyleCopMaxViolationCount Condition="'$(StyleCopMaxViolationCount)' == ''">1</StyleCopMaxViolationCount>

1 个答案:

答案 0 :(得分:1)

前段时间我做了同样的事情,对我们有用的好事!

我没有找到一种简单(直接)的方式。所以我首先直接从StyleCop.dll运行一个任务(注意它是版本4.6然后)并将结果放入文件中。然后我写了一个简单的MSBuild任务来查找放入该文件的错误数量:

public class AnalyzeStylecopResults : ITask
{
    private IBuildEngine engine;
    public IBuildEngine BuildEngine
    {
        get { return engine; }
        set { engine = value; }
    }

    private ITaskHost host;
    public ITaskHost HostObject
    {
        get { return host; }
        set { host = value; }
    }

    public bool Execute()
    {
        XDocument xdoc = XDocument.Load(StylecopResultsFile);

        _violationCount = xdoc.Descendants().Count();
        return true;
    }

    private string _stylecopResultsFile;

    [Required]
    public string StylecopResultsFile
    {
        get { return _stylecopResultsFile; }
        set { _stylecopResultsFile = value; }
    }

    int _violationCount;
    [Output]
    public int ViolationCount
    {
        get { return _violationCount; }
        set { _violationCount = value; }
    }
}

然后我创建了msbuild文件(stylecopvalidate.msbuild),如下所示:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    <UsingTask AssemblyFile="StylecopAnalyzerTasks.dll" TaskName="StylecopAnalyzerTasks.AnalyzeStylecopResults" />
    <Target Name="StyleCop">
        <AnalyzeStylecopResults StylecopResultsFile="$(CCNetWorkingDirectory)\stylecop-results.xml">
            <Output TaskParameter="ViolationCount" PropertyName="ViolationCount" />
        </AnalyzeStylecopResults>       
        <Error Text="Violations count in results file: $(ViolationCount) but max allowed: $(MaxViolationCount)" Condition=" $(ViolationCount) &gt; $(MaxViolationCount) " />
    </Target>
</Project>

最后从msbuild任务调用它:

<msbuild>
    <description>Stylecop task</description>
    <executable>$(MSBuild4Path)</executable>
    <projectFile>path\to\stylecopvalidate.msbuild</projectFile>         
    <timeout>120</timeout>
    <logger>$(MSBuildLoggerPath)</logger>
</msbuild>

希望它有所帮助,遗憾的是我没有任何“最近”的版本。