gpt4 book ai didi

c# - 从 NuGet 包实现 StyleCop MSBUILD

转载 作者:太空狗 更新时间:2023-10-29 17:49:47 27 4
gpt4 key购买 nike

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

我遇到的问题是,我的公司正在寻求使用 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 到 package 文件夹,并修改 .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 似乎无法正常工作。它被用作 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 不在“输出”窗口中显示任何消息。

干杯!

最佳答案

我正在为处于类似位置的任何人发布我遇到的解决方案。

首先,我遵循了这个关于调试 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 个结果,因此我手动覆盖了所有 3 个程序集和全新安装的 StyleCop C:\Program Files\StyleCop\安装程序(来自 CodePlex)的 .Settings 文件。覆盖 NuGet 包程序集后,它开始工作了!

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

干杯

关于c# - 从 NuGet 包实现 StyleCop MSBUILD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9278387/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com