MSBuild元素' ItemGroup'在VS2013上的命名空间中生成* .vcxproj文件

时间:2016-06-06 17:46:56

标签: xml visual-studio-2013 xsd msbuild intellisense


我正在使用MSBuild推进新手学习曲线。我正在研究一些自定义构建vxproj文件,而Intellisense正在报告看起来像是" false"错误。我得到了"元素' ItemGroup'在名称空间' schema'有无效的子元素。这link表明问题出在MSDEV检查器上。

制作一个简单的"例如,我使用VS2013来创建一个"虚拟" MFCLibrary1 vxcproj文件并编辑它以查看有效项目是否出现此问题。确实如此。它在ItemGroup中找到一个无效的子元素,其中Readme.txt是一个Include项。 (它在屏幕截图中,但可能很难看到)。我还用粗体突出显示了代码块。这类似于我在查看其他项目时所获得的错误,或者将似乎有效的项目添加到工作项目中。由于我还在学习架构,因此很难确定我是否违反了架构。

Screenshot of error

VS2013生成的代码如下。这是使用Project Wizard生成的,然后只是作为文件打开,作为我看到的问题的一个例子。这个有效的项目文件正在抛出智能感知警告 我想要做的是想方法通知Intellisense正确的Schema,以便我可以进行错误检查,因为我做了简单的修改来定制一个工作项目。作为一个新手,我想要所有的工具/帮助让系统帮助我学习如何正确地进行自定义。忽略智能感知开始意味着我也可以使用任何其他编辑器。

解决方案似乎是使用XML编辑器,可以强制提供所有架构。我还没亮?xsd?足以知道是否有办法在下面的项目中添加令牌,以便我可以使用VS2013智能地编辑文件并使用Intellisense支持。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{F68857AB-780A-4373-BDD7-2CFCFE30270E}</ProjectGuid>
    <RootNamespace>MFCLibrary1</RootNamespace>
    <Keyword>MFCDLLProj</Keyword>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
    <UseOfMfc>Dynamic</UseOfMfc>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
    <UseOfMfc>Dynamic</UseOfMfc>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <ModuleDefinitionFile>.\MFCLibrary1.def</ModuleDefinitionFile>
    </Link>
    <Midl>
      <MkTypLibCompatible>false</MkTypLibCompatible>
      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </Midl>
    <ResourceCompile>
      <Culture>0x0409</Culture>
      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ResourceCompile>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
      <ModuleDefinitionFile>.\MFCLibrary1.def</ModuleDefinitionFile>
    </Link>
    <Midl>
      <MkTypLibCompatible>false</MkTypLibCompatible>
      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </Midl>
    <ResourceCompile>
      <Culture>0x0409</Culture>
      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ResourceCompile>
  </ItemDefinitionGroup>
  **<ItemGroup>
    <Text Include="ReadMe.txt" />
  </ItemGroup>**
  <ItemGroup>
    <ClCompile Include="MFCLibrary1.cpp" />
    <ClCompile Include="stdafx.cpp">
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
    </ClCompile>
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="MFCLibrary1.h" />
    <ClInclude Include="Resource.h" />
    <ClInclude Include="stdafx.h" />
    <ClInclude Include="targetver.h" />
  </ItemGroup>
  <ItemGroup>
    <None Include="MFCLibrary1.def" />
    <None Include="res\MFCLibrary1.rc2" />
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="MFCLibrary1.rc" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>

1 个答案:

答案 0 :(得分:0)

想方设法通知Intellisense正确的架构

事情是,由于可以随意添加的自定义任务,属性和项目,没有“正确”的架构。所以解决这个问题的一种方法,即使作为初学者,也是我们许多人所做的:忽略所有警告,只看错误,因为后者实际上会导致项目加载失败,而前者通常不会。

话虽这么说,用于验证msbuild xml文件的xsd文件在

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Xml\Schemas\1033\

,文件是

MSBuild\Microsoft.Build.Commontypes.xsd以及MsBuild\Microsoft.Build.Core.xsdMicrosoft.Build.xsd

所以,如果真的希望花时间在这上面,那就去疯狂并添加你不想在最后一个文件中看到警告的所有属性的名称,它甚至提到

<!-- ========= ADD CUSTOM ITEMS, PROPERTIES, AND TASKS BELOW ======= -->

举一些例子。有关更多示例,请滚动到该Commontypes.xsd的第995行,其中列出了一堆已知属性。你添加的任何东西都不会再收到警告了。我对xsd文件没有任何经验,所以也许可以使用某种通配符代替。但是在任何情况下你都会搞乱VS安装,而且你可能会在没有这些修改的情况下工作。