MSBuild //Visual Studio生成系统

MSBuild是Visual Studio的生成系统,主要负责解释XML格式的项目文件并执行构建任务。项目文件中的关键元素包括Project(项目范围,包含DefaultTargets和Targets)、Property(用于存储可访问的属性信息)、Item(提供输入资源信息)、Target(表示原子任务,由实现ITask接口的.NET类执行)和Import(用于导入可重用项目文件)。MSBuild还使用特殊字符如%、$、@以及条件表达式来控制构建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下部分引用自https://www.cnblogs.com/shanyou/p/3452938.html

MSBuild是Visual Studio的生成系统,可以简单的理解为Visual Studio的编译器,它能解释构造文件,执行构造动作,生成工程文件

MSBuild所解释的项目文件已XML架构定义,依靠XML文件来指示生成引擎生成哪些内容以及如何生成这些内容。

简单列一下MSBuild XML架构元素https://msdn.microsoft.com/zh-cn/library/5dy88c2e(v=vs.120).aspx元素

Elementchild ElementsAttributes
Choose Element(MSBuild)

Otherwise

When

--
Import Element(MSBuild)--

Condition

Project

ImportGroup Element(MSBuild)ImportCondition
Item Element(MSBuild)ItemMetaData

Condition

Exclude

Include

Remove

ItemDefinitionGroup Element(MSBuild)ItemCondition
ItemGroup Element(MSBuild)ItemCondition
ItemMetadata Element(MSBuild)ItemCondition
OnError--

Condition

ExecuteTargets

OtherWise Element(MSBuild)

Choose

ItemGroup

PropertyGroup

--
Output Element(MSBuild)--

Condition

ItemName

PropertyName

TaskParameter

Parameter Element(MSBuild)--

Output

ParameterType

Required

ParameterGroup Element(MSBuild)

Parameter--
Project Element(MSBuild)

Choose

Import

ItemGroup

PorjectExtensions

PropertyGroup

Target

UsingTask

DefaultTargets

InitialTargets

ToolsVersion

TreatAsLocalProperty

xmlns

ProjectExtensions Element(MSBuild)----
Property Element(MSBuild)--

Condition

PropertyGroup Element(MSBuild)PropertyCondition
Target Element(MSBuild)

OnError

Task

AfterTargets

BeforeTargets

Condition

DependsOnTargets

Inputs

KeepDuplicateOutputs

Name

Outputs

Returns

Task Element(MSBuild)Output

Condition

ContinueOnError

Parameter

TaskBody Element(MSBuild)DataEvaluate
UsingTask Element(MSBuild)

ParameterGroup

TaksBody

AssemblyFile

AssemblyName

Condition

TaskFactory

TaskName

When Element(MSBuild)

Choose

ItemGroup

PropertyGroup

Condition
  • Project元素

这是每一个项目文件的最外层元素,它表示了一个项目的范围,不可或缺。

注意它的子元素Targets和属性DefaultTargets,有些人把它的DefaultTargets看成目标,把Targets看成任务,我觉得这样子理解很到位。

  • Property元素

在项目中一些经常访问的信息,以name/value的形式存放之后,可以以$(PropertyName)的形式访问。name即元素名,value即元素值

可以用$()引用自定义的属性,也可以引用系统的环境变量,以及MSBuild保留属性

属性除了可以在项目文件中声明是赋值外,在MSBuild命令行也允许设置属性的值

MSBuild condition.xml /p:Platform=x64//以这种方式修改的属性值会覆盖xml里面的属性值
  • Item元素

在整个项目文件中你需要提供一些可被引用的输入性资源信息,比如源代码文件、引用的程序集名称、需要嵌入的图标资源等。我们可以引用自定义的一些元数据(以键/值对的形式存储),还可以调用一些隐式存在的元数据,即不用声明即可使用,可以看看https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-4.0/ms164313(v=vs.100)

  • Target元素

Target表示一个需要完成的虚拟的任务单元。每个Project可以包括一个或多个Target,从而完成一系列定制的任务。

http://www.cnblogs.com/linianhui/archive/2012/09/01/2666104.html

这里面谈到了它的任务是原子操作(简单理解,某个操作不会被其它任务打断),但是xml格式的项目文件没有这个处理能力,所以这些任务都是映射到.NET类的,这些类处理操作中的逻辑。具体来说都是实现ITask接口的类,这位笔者用的C#,我想这当然可以采用c++,但是我没有去证实,时间太紧了。

  • Import元素

用来导入可重用的项目文件,这位笔者把它看成是占位元素,是很有道理的,就是实际在执行的时候,会被立即替换,注意和Item元素的区分,他们的作用是不同的

 

%:引用元数据//%(元数据名)

$:引用属性//$(属性名)

@:引用项(item)

':条件或其它表达式

;:列表分隔符

?:文件名通配符

*:文件名通配符

以及XML的保留字符:<、>、&、"、'

MSBuild条件:condition属性以及一些bool表达式

<!--如果Configuration为空(''),则其值为Debug-->
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>

 

有了对以上一些顶级元素的初步了解,我们来看一个实际的.vcxprohttps://blog.csdn.net/huhaoxuan2010/article/details/76797588

<?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="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{2B4C8F7A-A827-41E5-B80A-8EE6C0D3AF03}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <RootNamespace>test</RootNamespace>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </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 Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
    <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>
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
    <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)'=='Debug|x64'">
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LinkIncremental>false</LinkIncremental>
    <IncludePath>E:\osvr-build-ok\boost_1_62_0;$(IncludePath)</IncludePath>
    <LibraryPath>E:\osvr-build-ok\boost_1_62_0\lib64-msvc-12.0;$(LibraryPath)</LibraryPath>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <LinkIncremental>false</LinkIncremental>
    <IncludePath>E:\osvr-build-ok\boost_1_62_0;$(IncludePath)</IncludePath>
    <LibraryPath>E:\osvr-build-ok\boost_1_62_0\lib64-msvc-12.0;$(LibraryPath)</LibraryPath>
  </PropertyGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <SDLCheck>true</SDLCheck>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <ClCompile>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <WarningLevel>Level3</WarningLevel>
      <Optimization>Disabled</Optimization>
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <SDLCheck>true</SDLCheck>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </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;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <SDLCheck>true</SDLCheck>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <SDLCheck>true</SDLCheck>
    </ClCompile>
    <Link>
      <SubSystem>Console</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <Text Include="ReadMe.txt" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="stdafx.h" />
    <ClInclude Include="targetver.h" />
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="stdafx.cpp">
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
    </ClCompile>
    <ClCompile Include="test.cpp" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值