我需要将一个遗留的VS2008项目集成到我的VS2013解决方案中。此项目使用了一些自定义生成规则,这些规则最初是在将.vcproj转换为.vcxproj后起作用的。但是,当对包括.vcxproj在内的项目进行新签出时,将无法再打开项目文件。
我已经追踪到这个问题:
项目文件引用了一些自定义构建规则,如下所示:
<ImportGroup Label="ExtensionSettings">
<Import Project="......toolsbuildms_mc.props" />
(8 similar lines follow)
</ImportGroup>
但是,ms_mc.props文件不存在,但存在一个ms_mc.rule文件。如果我用VS2013转换VS2008解决方案(当然,如果我在VS2008中打开它,我不拥有它),就会创建ms_mc.props文件(加上.targets和.xml文件)。但是,如果我删除该文件并打开转换后的VS2013项目,则不会创建该文件。
我意识到,在旧的.vcproj中,对应的行是
<ToolFiles>
<ToolFile RelativePath="......toolsbuildms_mc.rule" />
(8 similar lines follow)
</ToolFiles>
为什么VS2008引用.rule文件,而VS2013导入.props文件而不指定.rule?更重要的是:我如何才能让它再次发挥作用?
添加了.rule和.props文件以供参考
ms_mc.rule:
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="MS MC"
Version="8,00"
>
<Rules>
<CustomBuildRule
Name="MS_MC"
DisplayName="Microsoft Message Catalogue Compiler"
CommandLine="mc [Verbose] [inputs] [RCIncludePath] [CIncludePath]"
Outputs="[$RCIncludePath]$(InputName).rc;[$RCIncludePath]$(InputName).h"
FileExtensions="*.mc"
ExecutionDescription="Compiling Message Catalogue $(InputName).mc"
>
<Properties>
<BooleanProperty
Name="Verbose"
DisplayName="Verbose"
Description="Gives verbose output. (-v)"
Switch="-v"
/>
<StringProperty
Name="RCIncludePath"
DisplayName="RC include file path"
Description="Gives the path of where to create the RC include file and the binary message resource files it includes. (-r [pathspec])"
Switch="-r [value]"
DefaultValue="."
/>
<StringProperty
Name="CIncludePath"
DisplayName="C include file path"
Description="Gives the path of where to create the include header file. (-h [pathspec])"
Switch="-h [value]"
DefaultValue="."
/>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>
ms_mc.props(转换为VS2013后):
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup
Condition="'$(MS_MCBeforeTargets)' == '' and '$(MS_MCAfterTargets)' == '' and '$(ConfigurationType)' != 'Makefile'">
<MS_MCBeforeTargets>Midl</MS_MCBeforeTargets>
<MS_MCAfterTargets>CustomBuild</MS_MCAfterTargets>
</PropertyGroup>
<PropertyGroup>
<MS_MCDependsOn
Condition="'$(ConfigurationType)' != 'Makefile'">_SelectedFiles;$(MS_MCDependsOn)</MS_MCDependsOn>
</PropertyGroup>
<ItemDefinitionGroup>
<MS_MC>
<Verbose>False</Verbose>
<RCIncludePath>.</RCIncludePath>
<CIncludePath>.</CIncludePath>
<CommandLineTemplate>mc [Verbose] [inputs] [RCIncludePath] [CIncludePath]</CommandLineTemplate>
<Outputs>%(RCIncludePath)%(Filename).rc;%(RCIncludePath)%(Filename).h</Outputs>
<ExecutionDescription>Compiling Message Catalogue %(Filename).mc</ExecutionDescription>
</MS_MC>
</ItemDefinitionGroup>
</Project>
我发现了这篇VS2010的博客文章,其中陈述了以下内容:
自定义生成规则是VS2005中引入的一项生成功能。它为用户提供了在构建过程中轻松使用插件第三方工具的能力。自定义生成规则由".rules"文件定义。
更重要的是
在VS2010中,由于迁移到MSBuild,规则文件中的信息由三个文件表示:.XML、.props和.targets文件。
这基本上意味着.XML、.props和.targets文件实际上不是由VS2008创建的;相反,它们取代了自VS2010以来的旧.rules文件格式。使用这些信息,我现在可以安全地签入这些新文件,而不会破坏VS2008解决方案。我可能不得不手动调整新文件,以使它们像以前一样工作,正如博客中提到的那样。