20

I want to treat Stylecop warnings as errors, but it's not working for me.

My projects are configured to treat warnings as errors, and if I build with a real "compiler warning" it does indeed display a compiler error. But with a "Stylecop warning" it only displays a compiler warning.

As a result of this, my checkin to TeamCity annoyingly does not break the CI build when there are Stylecop warnings.

I am using VS2013 with Stylecop 4.7.49.

My settings:

  • Project -> Properties -> Build

    • Warning level: 4
    • Suppress warnings: 1591
    • Treat warnings as errors: All
  • Project -> Stylecop Settings -> Options

    • Treat violations as errors: Checked

Example code that breaks the build correctly, containing real compiler warning:

using System;

namespace CodeUsageTest
{
    public class CodeUsage
    {
        private string fff()
        {
            int nobodyLovesMe; //CS0168
            return "";
        }
    }
}

Build output:

1>------ Build started: Project: CodeUsageTest, Configuration: Debug Any CPU ------
1>D:\Sandbox\CodeUsageTest\CodeUsage.cs(9,17,9,30): error CS0168: Warning as Error: The variable 'nobodyLovesMe' is declared but never used
========== Build: 0 succeeded, 1 failed, 3 up-to-date, 0 skipped ==========

Example code that doesn't break the build (although I want it to), containing stylecop warning:

using System;

namespace CodeUsageTest
{
    public class CodeUsage
    {
        private string fff() //SA1300
        {
            return ""; //SA1122
        }
    }
}

Build output:

1>------ Build started: Project: CodeUsageTest, Configuration: Debug Any CPU ------
1>D:\Sandbox\CodeUsageTest\CodeUsage.cs(7,1): warning : SA1300 : CSharp.Naming : method names begin with an upper-case letter: fff.
1>D:\Sandbox\CodeUsageTest\CodeUsage.cs(9,1): warning : SA1122 : CSharp.Readability : Use string.Empty rather than "".
========== Build: 1 succeeded, 0 failed, 3 up-to-date, 0 skipped ==========
demoncodemonkey
  • 11,730
  • 10
  • 61
  • 103
  • 1
    It is a compiler setting. Use the [``](http://blogs.msdn.com/b/sourceanalysis/archive/2008/05/24/source-analysis-msbuild-integration.aspx) property instead. First google hit btw. – Hans Passant Jul 17 '14 at 13:06
  • To make matters worse, it seems that sometimes warnings *are* treated as errors, but not reported as such in the VS "Error List" window: https://developercommunity.visualstudio.com/content/problem/61023/cs0219-displayed-as-warning-in-the-error-list-wind.html. – Ohad Schneider May 24 '17 at 12:42

4 Answers4

23

Modify your csproj file to add the following configuration:

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    ...
    <StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings>
  </PropertyGroup>

Also see this answer that explains why some warnings cannot be promoted to errors.

Community
  • 1
  • 1
ken2k
  • 48,145
  • 10
  • 116
  • 176
3

You can easily configure StyleCop with MSBuild to make warnings appear as errors with the help of StyleCop.MSBuild NuGet package. You have to modify your project file as below.

<PropertyGroup>
  <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  <StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings>
</PropertyGroup>

And also to ignore auto generated files you can modify Settings.StyleCop file as below.

<CollectionProperty Name="GeneratedFileFilters">
  <Value>\.g\.cs$</Value>
  <Value>\.generated\.cs$</Value>
  <Value>\.g\.i\.cs$</Value>
  <Value>TemporaryGeneratedFile_.*\.cs$</Value>
</CollectionProperty>

See the complete post here. Configure StyleCop with MSBuild to treat Warnings as Errors

Saranga
  • 3,178
  • 1
  • 18
  • 26
2

If you are using StyleCop.MSBuild nuget package to enable style cop on your projects. To enable stylecop warnings as errors just add another nuget package StyleCop.Error.MSBuild (https://www.nuget.org/packages/StyleCop.Error.MSBuild/)

Thanks

Manish Kumar
  • 113
  • 3
0

Currently, this is done by using <TreatWarningsAsErrors> tag:

 <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
   <!-- Ideally this is always enabled, but that tends to hurt developer productivity --> 
   <TreatWarningsAsErrors>true</TreatWarningsAsErrors> 
 </PropertyGroup> 
r.pedrosa
  • 709
  • 5
  • 12