【问题标题】:MSBuild Warning MSB3884 when building from command line从命令行构建时的 MSBuild 警告 MSB3884
【发布时间】:2023-03-13 05:57:01
【问题描述】:

在构建服务器上构建我们的解决方案时(使用Jenkins),MSBuild 14 出现以下警告:

C:\程序文件 (x86)\MSBuild\14.0\bin\Microsoft.VisualBasic.CurrentVersion.targets(133,9): 警告 MSB3884:规则集文件“ManagedMinimumRules.ruleset”无法 找到了。

在我的开发机器上执行相同的命令行调用,不会出现此警告。

知道为什么此警告会出现在构建服务器上吗?

我已经为 MSBuild 打开了一个问题:https://github.com/Microsoft/msbuild/issues/361

【问题讨论】:

标签: jenkins msbuild visual-studio-2015 msbuild-14.0


【解决方案1】:

解决方案:创建一个空的规则集文件并将其作为命令行参数传递给 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 ConsoleOut 显示中显示 cmets。这应该可以帮助您了解您后来为什么这样做。

【讨论】:

    【解决方案2】:

    相关:VS2015: warning MSB3884: Could not find rule set file

    检查您的 csproj 是否有 DevEnvDir 而不是 VS 的路径(尤其是 vs2010)。我认为您的笔记本电脑安装了适当的 VS,而您的构建服务器没有。

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

    【讨论】:

    • 您能详细说明一下吗?我的 .csproj 文件根本没有这些标签。我需要在某处添加它们吗?
    • ManagedMinimumRules 是 Visual Studio 附带的代码分析规则集,我认为您在某些时候已经在您的开发机器上安装了 VS 或其 SDK 之一。当您在本地执行时,您的开发机器很高兴。您的构建主机可能没有添加其中任何一个,并且当 msbuild 查找此文件夹时找不到它。我对 vs2010 所做的评论可能不适用,但有一个类似的错误,其中 VS2010 曾经在您的 csproj 中硬编码此规则集的 2010 路径,然后当同事使用您的解决方案时,例如VS2012 构建会呻吟。
    【解决方案3】:

    在您的构建服务器上创建以下文件夹:

    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\\"
    

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

    【讨论】:

      【解决方案4】:

      将此属性添加到 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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多