自定义MSBuild目标添加SVN版本至预处理器定义失败求助
问题原因及修复方案
核心错误
你在Target内部用<ItemGroup>嵌套<ItemDefinitionGroup>的方式修改预处理器定义是无效的——<ItemDefinitionGroup>是项目级别的声明元素,不能在Target任务内部使用,这种写法不会将新的预处理器定义应用到编译流程中。
另外,svn info的输出可能包含换行符,直接用$(SvnRevisionNum)会导致预处理器定义带多余空白,也可能引发编译问题。
修正后的get-svn-info.targets
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="GetSvnRevision" BeforeTargets="ClCompile"> <!-- 执行SVN命令并获取修订号,去除首尾空白 --> <Exec Command="svn info --show-item revision" ConsoleToMSBuild="true"> <Output TaskParameter="ConsoleOutput" PropertyName="SvnRevisionRaw" /> </Exec> <PropertyGroup> <SvnRevisionNum>$(SvnRevisionRaw.Trim())</SvnRevisionNum> </PropertyGroup> <!-- 直接更新ClCompile的预处理器定义 --> <ItemGroup> <ClCompile> <PreprocessorDefinitions>%(PreprocessorDefinitions);MY_VERSION=$(SvnRevisionNum)</PreprocessorDefinitions> </ClCompile> </ItemGroup> <Message Text="已设置预处理器定义:MY_VERSION=$(SvnRevisionNum)" Importance="high" /> </Target> </Project>
额外注意事项
- 导入位置:确保项目文件中,该目标文件的导入语句放在
Microsoft.Cpp.targets导入之后,示例:
这样能保证自定义目标覆盖默认编译配置。<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="get-svn-info.targets" /> - SVN路径:如果系统环境变量未包含SVN执行路径,需将
svn替换为完整路径(如"C:\Program Files\TortoiseSVN\bin\svn.exe")。 - 验证配置:可在VS项目属性→C/C++→预处理器→预处理器定义中,查看是否包含
MY_VERSION=xxx,或在构建日志中搜索PreprocessorDefinitions确认值是否正确。
内容的提问来源于stack exchange,提问作者qwerty176
相关产品推荐
相关产品推荐

