从命令行构建时出现的MSBuild警告MSB3884

4
在使用MSBuild 14构建我们的解决方案时(使用Jenkins),会出现以下警告:
C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.VisualBasic.CurrentVersion.targets(133,9): warning MSB3884: ruleset file "ManagedMinimumRules.ruleset" could not be found.
在我的开发机上执行相同的命令行调用时,不会出现此警告。
有任何想法为什么这个警告会出现在构建服务器上吗?
我已经为MSBuild打开了一个问题:https://github.com/Microsoft/msbuild/issues/361

请参考此答案:https://dev59.com/BVwY5IYBdhLWcg3wF0he#46309078 通过正确安装VS2017 Build Tools,应该不会出现这个错误。 - Herman Cordes
4个回答

4
解决方案:创建一个空的规则集文件,并将其作为命令行参数传递给MSBuild。
NoRules.ruleset文件:
<?xml version="1.0" encoding="utf-8"?> 
<!--                                   
Problem: warning MSB3884 
  Visual Studio 2015 includes references to MinimumRecommendedRules.ruleset in .csproj files. 
  MSBuild 10 cannot find this reference and generates warning MSB3884. 

Solution: Create NoRules.ruleset [this file] and pass it to MSBuild in a command switch.  Need to pass full path name to MSBuild. 
Example: MSBuild /property:CodeAnalysisRuleSet="$Workspace\NoRules.ruleset" 

References: 
  https://msdn.microsoft.com/en-us/library/dd264949.aspx 
  https://msdn.microsoft.com/en-us/library/ms164311.aspx 
-->      
<RuleSet Name="NoRules" Description="This rule set contains no rules." ToolsVersion="14.0"> 
</RuleSet>     

针对Jenkins构建,添加以下MSBuild开关以覆盖项目设置并使用NoRules文件:

/property:CodeAnalysisRuleSet="$Workspace\NoRules.ruleset" 

您可以将NoRules文件添加到源代码控制中。我选择在MSBuild步骤之前使用批处理文件在Jenkins中动态构建它:

set NoRules=NoRules.ruleset
@echo Making %NoRules%
if not exist %NoRules% (
  @echo ^<?xml version="1.0" encoding="utf-8"?^> >%NoRules%
  @echo ^<!--                                   >>%NoRules%
  call :WriteToFile %NoRules% "Problem: warning MSB3884"
  call :WriteToFile %NoRules% "  Visual Studio 2015 includes references to MinimumRecommendedRules.ruleset in .csproj files."
  call :WriteToFile %NoRules% "  MSBuild 10 cannot find this reference and generates warning MSB3884."
  @echo.          >>%NoRules%
  call :WriteToFile %NoRules% "Solution: Create NoRules.ruleset [this file] and pass it to MSBuild in a command switch."
  call :WriteToFile %NoRules% "  Need to pass full path name to MSBuild."
  @echo Example: MSBuild /property:CodeAnalysisRuleSet="$WORKSPACE\NoRules.ruleset" >>%NoRules%
  @echo.          >>%NoRules%
  call :WriteToFile %NoRules% "References:"
  call :WriteToFile %NoRules% "  https://msdn.microsoft.com/en-us/library/dd264949.aspx"
  call :WriteToFile %NoRules% "  https://msdn.microsoft.com/en-us/library/ms164311.aspx"
  @echo --^>      >>%NoRules%
  @echo ^<RuleSet Name="NoRules" Description="This rule set contains no rules." ToolsVersion="14.0"^> >>%NoRules%
  @echo ^</RuleSet^> >>%NoRules%
)
exit /b %errorlevel%

:WriteToFile
  @echo %~2 >>%1
exit /b %errorlevel%

这个文件也会在Jenkins的控制台输出中显示注释。这样可以帮助你日后了解为什么要这样做。


2

相关链接: VS2015: 警告 MSB3884: 找不到规则集文件

请检查您的 csproj 中是否有 DevEnvDir,而非指向 Visual Studio(特别是 vs2010)的路径。我猜测您的笔记本电脑已经安装了相应的 Visual Studio,而您的构建服务器没有安装。

<CodeAnalysisRuleSet>ManagedMinimumRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRuleSetDirectories>;$(DevEnvDir)\..\..\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>

1
你能详细说明一下吗?我的.csproj文件根本没有这些标签。我需要在哪里添加它们吗? - Jan Hettich
ManagedMinimumRules是一个随Visual Studio提供的代码分析规则集,我认为你在某个时刻已经在开发机上安装了VS或其SDK之一。这样在本地执行开发机时就没有问题了。可能你的构建主机没有添加这些内容,当msbuild查找这个文件夹时找不到它。我所说的关于vs2010的评论可能并不适用,但是存在类似的错误,即VS2010曾经在csproj中将该规则集的路径硬编码为2010,然后当同事使用例如VS2012的解决方案时,构建会出现问题。 - timB33

2
在您的构建服务器上创建以下文件夹:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\Rule Sets

将您所有的规则集文件从开发机器复制到构建服务器。

然后通过创建一个包含以下内容的 "addkey.reg" 文件来添加以下注册表键:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\Setup\EDev]
"StanDir"="C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Team Tools\\Static Analysis Tools\\"

在您的构建服务器上运行它,重新启动,完成,警告消失。


1
将此属性添加到msbuild命令中:

CodeAnalysisRuleSetDirectories="C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Team Tools\Static Analysis Tools\Rule Sets".

例如,我使用了这个命令。
>"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\msbuild" solutionName.sln /target:build /property:Configuration=Release;CodeAnalysisRuleSetDirectories="C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Team Tools\Static Analysis Tools\Rule Sets"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接