【问题标题】:Implementing StyleCop MSBUILD From NuGet Package从 NuGet 包实现 StyleCop MSBUILD
【发布时间】:2012-03-05 21:49:42
【问题描述】:

先说一下我已经在论坛和网络上进行了通常的搜索,我尝试了在这个论坛和其他地方找到的大量建议,但无济于事。

我遇到的问题是,我的公司正在寻求使用 StyleCop、ReSharper 和 JSLint(等)等工具实施内部自动化同行评审(当然在一定程度上)。

我们针对我们的内部 NuGet 包存储库(提要)使用自定义 NuGet 包,以便我们的开发人员获得工具的管理版本(即,他们无法在最新的 StyleCop 发布前下载它,直到它经过审查和发布)添加我们的自定义规则(StyleCop 设置文件)。因为我们想在构建时使用 StyleCop MSBUILD 任务来突出显示错误,所以 StyleCop 的程序集需要准确,因此我们排除了安装 C:\Program Files\ 版本以支持 NuGet 版本。

我已经成功创建了一个安装到项目(类库、网站等)的 NuGet 包,复制了已批准的 StyleCop 程序集(StyleCop.dll、StyleCop.CSharp.dll 和 StyleCop.CSharpRules.dll), Settings.StyleCop 和 StyleCop.Targets 到包文件夹,并修改 .csproj 文件以包含以下节点(当然这只是一个 sn-p):

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup Condition=" '$(Configuration)' != 'Debug' ">
        <StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings>
    </PropertyGroup>

    <Import Project="$(SolutionDir)\packages\NuGetPackageName.1.0.0\StyleCop.Targets" />
</Project>

如果我将 StyleCop 安装为 C:\Program Files\ 并安装在 C:\Program Files\MSBUILD 中,则一切正常,但使用此方法 StyleCop.Targets 似乎无法正常工作。它被用作 Visual Studio 2010 如果文件被删除并创建一个 StyleCop.Cache 文件会引发错误。 StyleCop.Targets 文件已更改为指向 NuGet 包文件夹中的本地 DLL,我尝试了几个不同的 .Targets 文件,包括标准 StyleCop 文件(具有相对文件路径更改)。即使我在本地覆盖 MSBUILD 属性,它也不起作用,例如 OverrideSettingsFile。

StyleCop.Targets 文件目前如下所示:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- Specify where tasks are implemented. -->
    <UsingTask AssemblyFile="$(SolutionDir)\packages\NuGetPackageName.1.0.0\lib\net40\StyleCop.dll" TaskName="StyleCopTask"/>

    <PropertyGroup>
        <BuildDependsOn>$(BuildDependsOn);StyleCop</BuildDependsOn>
        <RebuildDependsOn>StyleCopForceFullAnalysis;$(RebuildDependsOn)</RebuildDependsOn>
    </PropertyGroup>

    <!-- Define StyleCopForceFullAnalysis property. -->
    <PropertyGroup Condition="('$(SourceAnalysisForceFullAnalysis)' != '') and ('$(StyleCopForceFullAnalysis)' == '')">
        <StyleCopForceFullAnalysis>$(SourceAnalysisForceFullAnalysis)</StyleCopForceFullAnalysis>
    </PropertyGroup>
    <PropertyGroup Condition="'$(StyleCopForceFullAnalysis)' == ''">
        <StyleCopForceFullAnalysis>false</StyleCopForceFullAnalysis>
    </PropertyGroup>

    <!-- Define StyleCopCacheResults property. -->
    <PropertyGroup Condition="('$(SourceAnalysisCacheResults)' != '') and ('$(StyleCopCacheResults)' == '')">
        <StyleCopCacheResults>$(SourceAnalysisCacheResults)</StyleCopCacheResults>
    </PropertyGroup>
    <PropertyGroup Condition="'$(StyleCopCacheResults)' == ''">
        <StyleCopCacheResults>true</StyleCopCacheResults>
    </PropertyGroup>

    <!-- Define StyleCopTreatErrorsAsWarnings property. -->
    <PropertyGroup Condition="('$(SourceAnalysisTreatErrorsAsWarnings)' != '') and ('$(StyleCopTreatErrorsAsWarnings)' == '')">
        <StyleCopTreatErrorsAsWarnings>$(SourceAnalysisTreatErrorsAsWarnings)</StyleCopTreatErrorsAsWarnings>
    </PropertyGroup>
    <PropertyGroup Condition="'$(StyleCopTreatErrorsAsWarnings)' == ''">
        <StyleCopTreatErrorsAsWarnings>true</StyleCopTreatErrorsAsWarnings>
    </PropertyGroup>

    <!-- Define StyleCopEnabled property. -->
    <PropertyGroup Condition="('$(SourceAnalysisEnabled)' != '') and ('$(StyleCopEnabled)' == '')">
        <StyleCopEnabled>$(SourceAnalysisEnabled)</StyleCopEnabled>
    </PropertyGroup>
    <PropertyGroup Condition="'$(StyleCopEnabled)' == ''">
        <StyleCopEnabled>true</StyleCopEnabled>
    </PropertyGroup>

    <!-- Define StyleCopOverrideSettingsFile property. -->
    <PropertyGroup Condition="('$(SourceAnalysisOverrideSettingsFile)' != '') and ('$(StyleCopOverrideSettingsFile)' == '')">
        <StyleCopOverrideSettingsFile>$(SourceAnalysisOverrideSettingsFile)</StyleCopOverrideSettingsFile>
    </PropertyGroup>
    <PropertyGroup Condition="'$(StyleCopOverrideSettingsFile)' == ''">
        <StyleCopOverrideSettingsFile> </StyleCopOverrideSettingsFile>
    </PropertyGroup>

    <!-- Define StyleCopOutputFile property. -->
    <PropertyGroup Condition="('$(SourceAnalysisOutputFile)' != '') and ('$(StyleCopOutputFile)' == '')">
        <StyleCopOutputFile>$(SourceAnalysisOutputFile)</StyleCopOutputFile>
    </PropertyGroup>
    <PropertyGroup Condition="'$(StyleCopOutputFile)' == ''">
        <StyleCopOutputFile>$(IntermediateOutputPath)StyleCopViolations.xml</StyleCopOutputFile>
    </PropertyGroup>

    <!-- Define all new properties which do not need to have both StyleCop and SourceAnalysis variations. -->
    <PropertyGroup>
        <!-- Specifying 0 will cause StyleCop to use the default violation count limit.
         Specifying any positive number will cause StyleCop to use that number as the violation count limit.
         Specifying any negative number will cause StyleCop to allow any number of violations without limit.
    -->
        <StyleCopMaxViolationCount Condition="'$(StyleCopMaxViolationCount)' == ''">0</StyleCopMaxViolationCount>
    </PropertyGroup>

    <!-- Define target: StyleCopForceFullAnalysis -->
    <Target Name="StyleCopForceFullAnalysis">
        <CreateProperty Value="true">
            <Output TaskParameter="Value" PropertyName="StyleCopForceFullAnalysis" />
        </CreateProperty>
    </Target>

    <!-- Define target: StyleCop -->
    <Target Name="StyleCop" Condition="'$(StyleCopEnabled)' != 'false'">
        <Message Text="Forcing full StyleCop reanalysis." Condition="'$(StyleCopForceFullAnalysis)' == 'true'" Importance="Low" />

        <!-- Determine what files should be checked. Take all Compile items, but exclude those that have set ExcludeFromStyleCop=true or ExcludeFromSourceAnalysis=true. -->
        <CreateItem Include="@(Compile)" Condition="('%(Compile.ExcludeFromStyleCop)' != 'true') and ('%(Compile.ExcludeFromSourceAnalysis)' != 'true')">
            <Output TaskParameter="Include" ItemName="StyleCopFiles"/>
        </CreateItem>

        <Message Text="Analyzing @(StyleCopFiles)" Importance="Low" />

        <!-- Show list of what files should be excluded. checked. Take all Compile items, but exclude those that have set ExcludeFromStyleCop=true or ExcludeFromSourceAnalysis=true. -->
        <CreateItem Include="@(Compile)" Condition="('%(Compile.ExcludeFromStyleCop)' == 'true') or ('%(Compile.ExcludeFromSourceAnalysis)' == 'true')">
            <Output TaskParameter="Include" ItemName="StyleCopExcludedFiles"/>
        </CreateItem>

        <ItemGroup>
            <StyleCopFiles Remove="@(ExcludeFromStyleCop)" />
        </ItemGroup>

        <Message Text="Excluding @(StyleCopExcludedFiles)" Importance="Normal" />

        <!-- Run the StyleCop MSBuild task. -->
        <StyleCopTask ProjectFullPath="$(MSBuildProjectDirectory)" SourceFiles="@(StyleCopFiles)"
                  AdditionalAddinPaths="@(StyleCopAdditionalAddinPaths)" ForceFullAnalysis="$(StyleCopForceFullAnalysis)"
                  DefineConstants="$(DefineConstants)" TreatErrorsAsWarnings="$(StyleCopTreatErrorsAsWarnings)"
                  CacheResults="$(StyleCopCacheResults)" OverrideSettingsFile="$(StyleCopOverrideSettingsFile)"
                  OutputFile="$(StyleCopOutputFile)" MaxViolationCount="$(StyleCopMaxViolationCount)" />

        <!-- Make output files cleanable -->
        <CreateItem Include="$(StyleCopOutputFile)">
            <Output TaskParameter="Include" ItemName="FileWrites"/>
        </CreateItem>

        <!-- Add the StyleCop.cache file to the list of files we've written - so they can be cleaned up on a Build Clean. -->
        <CreateItem Include="StyleCop.Cache" Condition="'$(StyleCopCacheResults)' == 'true'">
            <Output TaskParameter="Include" ItemName="FileWrites"/>
        </CreateItem>
    </Target>
</Project>

有谁知道我怎样才能让它工作? Visual Studio 2010 不会在“输出”窗口中显示任何消息。

大家干杯!

【问题讨论】:

标签: c# msbuild nuget stylecop


【解决方案1】:

我将发布我遇到的任何类似职位的解决方案。

首先,我遵循了这个关于调试 MSBuild 操作的优秀指南,它帮助我解决了一些逻辑和变量:

http://blogs.msdn.com/b/visualstudio/archive/2010/07/06/debugging-msbuild-script-with-visual-studio.aspx

在此之后,我检查了 /obj/Debug/ 文件夹中的 StyleCopViolations.xml。然而,这总是返回 0 个结果,只有以下 XML:

<StyleCopViolations/>

我对此进行了一些研究,发现我需要将 StyleCop.CSharpRules.dll 与 StyleCop.dll、StyleCop.CSharp.dll 和 StyleCop.Settings 文件一起包含到我的 NuGet/lib/net40/ 文件夹中。

我的项目不需要对上述任何程序集的引用,但我意识到我的 NuGet 包依赖于不包含 StyleCop.CSharpRules.dll 的 StyleCop NuGet 包。

添加此程序集后,我仍然看到 0 个结果,因此我从全新安装的 StyleCop C:\Program Files\StyleCop\ 安装程序(来自 CodePlex)手动覆盖了所有 3 个程序集和 .Settings 文件。覆盖 NuGet 包程序集后,它开始工作!

最后,调试您的 MSBuild(使用本文顶部的链接),暂时不要使用 NuGet 包!

干杯

【讨论】:

  • 啊...感谢您的解决方案!我尝试使用来自NuGet 包“StyleCop”的StyleCop 来构建我自己的场景,但它什么也没做。问题在于缺少StyleCop.CSharpRules.dll。然后我切换到“StyleCop.MSBuildNuGet 包,其中包含StyleCop.CSharpRules.dll,现在一切正常!
【解决方案2】:

按照 Dmitry Lobanov 的建议,使用 StyleCop.MSBuild 而不是 StyleCop

即在包管理器控制台中使用命令install-package stylecop.msbuild

【讨论】:

    【解决方案3】:

    您可以结合使用 nuget 包 StyleCop.MSBuildStyleCop.Error.MSBuild 来启用 stylecop警告为错误。

    【讨论】:

      【解决方案4】:

      转到打开和关闭 Windows 功能,并确保选中 .Net Framework

      然后重建你的项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-26
        • 2014-11-10
        • 1970-01-01
        • 2018-09-05
        相关资源
        最近更新 更多