简单地说,我已经在论坛和网络上做了通常的搜索,我尝试了在这个论坛和其他地方找到的大量建议,但都无济于事。
我遇到的问题是,我的公司正在寻求通过使用StyleCop、ReSharper和JSLint (等)等工具来实现内部自动同行评审(当然是在一定程度上)。
我们在内部NuGet包库(feed)上使用了一个自定义的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似乎不能正常工作。它被用作Visual Studio2010在删除该文件并创建一个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不会在输出窗口中显示任何消息。
干杯!
发布于 2012-02-15 19:35:14
我把我遇到的解决方案发布给任何有类似情况的人。
首先,我遵循了这篇关于调试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/>我对此做了一些研究,发现我需要在我的NuGet/lib/net40/文件夹中包含StyleCop.dll、StyleCop.CSharp.dll和StyleCop.Settings文件中的StyleCop.CSharpRules.dll。
我的项目不需要引用前面提到的任何程序集,但我意识到我的NuGet包依赖于不包含StyleCop.CSharpRules.dll的StyleCop NuGet包。
添加此程序集后,我仍然看到0个结果,因此我手动覆盖了所有3个程序集和StyleCop C:\Program Files\StyleCop\ installer (来自CodePlex)的全新安装中的.Settings文件。在覆盖NuGet包程序集之后,这就开始工作了!
所以最后,调试你的MSBuild (链接在这篇文章的顶部),现在不要使用NuGet包!
干杯
发布于 2014-05-15 17:34:57
按照Dmitry Lobanov的建议,使用StyleCop.MSBuild代替StyleCop。
即在包管理器控制台中使用命令install-package stylecop.msbuild。
发布于 2015-01-19 07:35:35
您可以结合使用nuget包、StyleCop.MSBuild和StyleCop.Error.MSBuild来将样式转换警告作为错误启用。
https://stackoverflow.com/questions/9278387
复制相似问题