簡體   English   中英

從 NuGet 包實現 StyleCop MSBUILD

[英]Implementing StyleCop MSBUILD From NuGet Package

一個快速的前兆,我已經在論壇和網絡上進行了通常的搜索,並且我已經嘗試了在這個論壇和其他地方找到的大量建議,但均無濟於事。

我遇到的問題是,我的公司正在尋求使用 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 文件以包含以下節點(這當然只是一個片段):

<?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 似乎無法正常工作。 如果刪除文件並創建 StyleCop.Cache 文件,則使用它是因為 Visual Studio 2010 會引發錯誤。 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 不會在“輸出”窗口中顯示任何消息。

干杯!

我正在發布我為處於類似位置的任何人遇到的解決方案。

首先,我遵循了這個關於調試 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 包含到我的 NuGet/lib/net40/ 文件夾中,其中包含 StyleCop.dll、StyleCop.CSharp.dll 和 StyleCop.Settings 文件。

我的項目不需要對上述任何程序集的引用,但我意識到我的 NuGet 包依賴於不包含 StyleCop.CSharpRules.dll 的 StyleCop NuGet 包。

添加此程序集后,我仍然看到 0 個結果,因此我從全新安裝的 StyleCop C:\\Program Files\\StyleCop\\ 安裝程序(來自 CodePlex)中手動覆蓋了所有 3 個程序集和 .Settings 文件。 覆蓋 NuGet 包程序集后,這開始工作了!

所以總結一下,調試您的 MSBuild(使用本文頂部的鏈接)並且暫時不要使用 NuGet 包!

干杯

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

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

您可以使用 nuget 包StyleCop.MSBuildStyleCop.Error.MSBuild 的組合來啟用 stylecop 警告作為錯誤。

轉到打開和關閉 Windows 功能,並確保選中 .Net Framework 在此處輸入圖片說明

然后重建你的項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM