我想为所有文件运行任务,并排除那些没有更改的文件

时间:2012-12-03 15:34:57

标签: msbuild

我有两个构建目标来检查我的代码质量。

每次编译时都会运行以下构建目标。这需要花费太多时间,我希望他们只检查那些确实发生变化的文件。

换句话说,我想过滤掉ItemGroup CppCheckFiles / LinterFiles中没有变化的文件。

  <Target Name="CppCheck">
    <ItemGroup>
      <CppCheckFiles Include="*main.c" />
      <CppCheckFiles Include="Source/*/*.c" />
    </ItemGroup>
    <Message Text="$(Configuration) starting." Importance="High" />
    <Exec Command="C:\Cppcheck\cppcheck.exe %(CppCheckFiles.FullPath)  --enable=style --template=&quot;{file}({line}): error:{severity}-{id}: {message}&quot;" />
  </Target>
  <Target Name="SPLint">
    <ItemGroup>
      <LinterFiles Include="*main.c" />
      <LinterFiles Include="Source/*/*.c" />
      <LinterFiles Include="Source/*/*.h" />
    </ItemGroup>
    <Message Text="$(Configuration) starting." Importance="High" />
    <Exec Command="splintCaller %(LinterFiles.FullPath)" />
  </Target>

我知道常规构建过程会这样做,我想知道我是否必须这样做才能编写自己的任务。

2 个答案:

答案 0 :(得分:1)

嗯..这听起来很有趣。我帮不了你但是,如果cppcheck wiki或手册有一些小例子项目可以做到这一点,那就太好了。

有些人在提交钩子中使用cppcheck。我自己用GIT尝试过(我添加了一个linux shell脚本)。你可以尝试一个TortoiseSVN插件(http://sourceforge.net/apps/phpbb/cppcheck/viewtopic.php?f=3&t=443)。

答案 1 :(得分:0)

解决方案是incremental Build。 MSBuild比较时间戳以排除完整的Buildtargets(如果没有任何更改)。

以下目标为每个文件创建一个时间戳,并跳过那些未更改的文件。

如果检测到错误且未写入时间戳,则cppcheck.exe将返回-1。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="CppCheck" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
      <CppCheckFiles Include="*main.c" />
      <CppCheckFiles Include="Source/*/*.c" />
    </ItemGroup>   

  <Target Name="CppCheck"
    Inputs="@(CppCheckFiles)" 
    Outputs="CCPCheck\%(CppCheckFiles.Filename)%(CppCheckFiles.Extension).stamp">
    <Exec Command="C:\Cppcheck\cppcheck.exe %(CppCheckFiles.FullPath)  --enable=style --template=&quot;{file}({line}): error:{severity}-{id}: {message}&quot;" />
    <MakeDir Directories="CCPCheck"/>
    <Touch Files="CCPCheck\%(CppCheckFiles.Filename)%(CppCheckFiles.Extension).stamp" AlwaysCreate = "true" />
  </Target>

</Project>