【问题标题】:MSBuild File to Run Code Analysis Without OverlapMSBuild 文件运行代码分析而不重叠
【发布时间】:2013-03-31 01:54:10
【问题描述】:

我正在创建一个 MSBuild 文件,以便将我需要在构建服务器上执行的一些任务合并到一个步骤中。此过程的一部分需要运行代码分析。我的问题是我为多个顶级项目运行代码分析,但它们每个都对其他项目(如我们的实用程序库)具有相同的依赖关系。这意味着每次运行代码分析都会重复运行实用程序库的代码分析。这是我的 MSBuild 文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
    <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Dev</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
        <RunCodeAnalysis>true</RunCodeAnalysis>
        <CodeAnalysisTargets>C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\CodeAnalysis\Microsoft.CodeAnalysis.targets</CodeAnalysisTargets>
        <CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
        <StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings>
        <DefineConstants>TRACE;DEBUG;CODE_ANALYSIS</DefineConstants>
        <BuildInParallel>true</BuildInParallel>
        <WebProjectTargets>Clean;Build;Package</WebProjectTargets>
        <OtherProjectTargets>Clean;Build</OtherProjectTargets>
        <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    </PropertyGroup>

    <Target Name="Build">
        <!-- Web Projects -->
        <MSBuild
            Projects="$(MSBuildProjectDirectory)\Source\WebProjects\WebApp1\WebApp1.csproj"
            Properties="
                Configuration=$(Configuration);
                PackageLocation=$(MSBuildProjectDirectory)\Packages\WebApp1.zip;
                RunCodeAnalysis=$(RunCodeAnalysis);
                CodeAnalysisTargets=$(CodeAnalysisTargets);
                CodeAnalysisTreatWarningsAsErrors=$(CodeAnalysisTreatWarningsAsErrors);
                StyleCopTreatErrorsAsWarnings=$(StyleCopTreatErrorsAsWarnings);
                DefineConstants=$(DefineConstants);
                BuildInParallel=$(BuildInParallel);
                GenerateSerializationAssemblies=$(GenerateSerializationAssemblies);
                "
            Targets="$(WebProjectTargets)" />
        <MSBuild
            Projects="$(MSBuildProjectDirectory)\Source\WebProjects\WebApp2\WebApp2.csproj"
            Properties="
                Configuration=$(Configuration);
                PackageLocation=$(MSBuildProjectDirectory)\Packages\WebApp2.zip;
                RunCodeAnalysis=$(RunCodeAnalysis);
                CodeAnalysisTargets=$(CodeAnalysisTargets);
                CodeAnalysisTreatWarningsAsErrors=$(CodeAnalysisTreatWarningsAsErrors);
                StyleCopTreatErrorsAsWarnings=$(StyleCopTreatErrorsAsWarnings);
                DefineConstants=$(DefineConstants);
                BuildInParallel=$(BuildInParallel);
                GenerateSerializationAssemblies=$(GenerateSerializationAssemblies);
                "
            Targets="$(WebProjectTargets)" />
        <MSBuild
            Projects="$(MSBuildProjectDirectory)\Source\WebProjects\Administrator\Administrator.csproj"
            Properties="
                Configuration=$(Configuration);
                PackageLocation=$(MSBuildProjectDirectory)\Packages\Administrator.zip;
                RunCodeAnalysis=$(RunCodeAnalysis);
                CodeAnalysisTargets=$(CodeAnalysisTargets);
                CodeAnalysisTreatWarningsAsErrors=$(CodeAnalysisTreatWarningsAsErrors);
                StyleCopTreatErrorsAsWarnings=$(StyleCopTreatErrorsAsWarnings);
                DefineConstants=$(DefineConstants);
                BuildInParallel=$(BuildInParallel);
                GenerateSerializationAssemblies=$(GenerateSerializationAssemblies);
                "
            Targets="$(WebProjectTargets)" />
        <MSBuild
            Projects="$(MSBuildProjectDirectory)\Source\OtherProjects\Service\Service.csproj"
            Properties="
                Configuration=$(Configuration);
                RunCodeAnalysis=$(RunCodeAnalysis);
                CodeAnalysisTargets=$(CodeAnalysisTargets);
                CodeAnalysisTreatWarningsAsErrors=$(CodeAnalysisTreatWarningsAsErrors);
                StyleCopTreatErrorsAsWarnings=$(StyleCopTreatErrorsAsWarnings);
                DefineConstants=$(DefineConstants);
                BuildInParallel=$(BuildInParallel);
                GenerateSerializationAssemblies=$(GenerateSerializationAssemblies);
                "
            Targets="$(OtherProjectTargets)" />
    </Target>
</Project>

知道在这种情况下如何防止代码分析在同一个程序集上运行多次吗?

【问题讨论】:

  • 您真的需要在每次构建时都运行代码分析吗?我通常在构建的二进制文件上运行它,因为它确实会减慢构建速度,而且我怀疑它需要比每天更频繁地运行。
  • 我每次开发构建时都会运行代码分析(如果代码有更改,则每两个小时运行一次),因为我们希望在需要更正代码时得到通知。如果我改变这个,我会修改我的设置,所以我有一个计划每小时运行一次代码分析,一个每两小时构建一次开发。
  • 您能否使用 /v:diag 运行构建并查找这一行:Target "RunCodeAnalysis: 它应该在接下来的几行中显示输入和输出是什么。如果您清理了构建文件夹,您可能会保留 *.lastcodeanalysissucceeded,因为它们会确定目标是否已过期。
  • 您不能将所有项目合并到一个解决方案中,然后从 msbuild 调用该解决方案吗?那么是否可以在解决方案级别运行代码分析?
  • 我同意@rene:当您运行 Clean 目标时,您会删除已构建和分析的目标的代码分析结果。将构建分为两部分:第一部分将清理所有内容,第二部分将通过代码分析运行构建。

标签: .net msbuild continuous-integration


【解决方案1】:

通常,我在“打包”我的二进制发行版之后运行代码分析命令行工具。 MSBuildCodeMetrics 是一个“胚胎”项目,用于在构建中运行指标。

如果某些用户提交的方法行数过多或圈复杂度过多,则该想法是中断构建,但项目还没有达到这种成熟度。

无论如何,如果您想通过命令行运行指标,请尝试:

http://msdn.microsoft.com/en-us/library/bb385914.aspx

当然,您需要一些魔法才能将所有程序集复制到临时目录(如您的最终包),然后根据此目录运行指标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多