转换为VS2013后,自定义生成规则失败



我需要将一个遗留的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解决方案。我可能不得不手动调整新文件,以使它们像以前一样工作,正如博客中提到的那样。

相关内容

  • 没有找到相关文章

最新更新