我有两个构建目标来检查我的代码质量。
每次编译时都会运行以下构建目标。这需要花费太多时间,我希望他们只检查那些确实发生变化的文件。
换句话说,我想过滤掉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="{file}({line}): error:{severity}-{id}: {message}"" />
</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>
我知道常规构建过程会这样做,我想知道我是否必须这样做才能编写自己的任务。
答案 0 :(得分:1)
有些人在提交钩子中使用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="{file}({line}): error:{severity}-{id}: {message}"" />
<MakeDir Directories="CCPCheck"/>
<Touch Files="CCPCheck\%(CppCheckFiles.Filename)%(CppCheckFiles.Extension).stamp" AlwaysCreate = "true" />
</Target>
</Project>