Bootstrap

MSBuild的入门完整教程(包学包会)

MSBuild的完整入门教程(实现不了来打我TAT)

看完能够了解MSBuild是什么;我们能用MSBuild做什么;MSBuild的简易使用

1、什么是MSBuild

MSBuild 是 Microsoft 和 Visual Studio 的生成平台。MSBuild为项目文件提供了一个 XML 架构,用
于控制生成平台处理和生成软件的方式。 Visual Studio 会使用 MSBuild,但 MSBuild 不依赖于 Visual Studio。 通过在项目或解决方案文件中调用 msbuild.exe,可以在未安装 Visual Studio 的环境中安排和生成产品。

2、遇到“MSBuild不是内部或外部命令,也不是可运行的程序或批处理文件”怎么办

MSBuild不是可运行
1、操作系统比较老,在系统环境变量中的path变量中添加一条路径:
;C:\Windows\Microsoft.NET\Framework\v4.0.30319;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
他们分别对应32位和64位的环境.

2、如果是win10及以上操作系统,直接新建path:
C:\Windows\Microsoft.NET\Framework\v4.0.30319
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
在这里插入图片描述
在这里插入图片描述
完成上述步骤后,在命令栏(Win+R,然后输入cmd)里面输入 gcc -v,如果此时你的环境是正确的,则可以得到如下图所示
在这里插入图片描述

3、MSBuild的简易使用

可以先看下下面这篇文章,描述了MSBuild编译的xml里面字段的含义

MSBuild的简单介绍与使用

进入实战环节:

创建一个xml,内容如下:
如果DefaultTargets里如果只有build,那么output的Target是不会被编译的

<?xml version="1.0" encoding="utf-8"?>
<!--根元素,表示一个项目-->
<!--DefaultTargets用于定默认执行的目标-->
<Project DefaultTargets="build;output" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!--属性都要包含在PropertyGroup元素内部-->
  <PropertyGroup>
    <!--声明一个"word"属性,其值为"hello world"-->
    <word>hello world</word>
  </PropertyGroup>
  <!--目标-->
  <Target Name="build">
    <!--MSBuild提供的一个内置任务,用于生成记录信息用$(属性名)来引用属性的值-->
    <Message Text="my first MSBuild $(word)"></Message>
  </Target>
  <Target Name="output">
    <Message Text="target output"></Message>
  </Target>
</Project>

在这里插入图片描述

我们再来看看另一种方式:

我们在DefaultTargets里只写了build,但是实际上它会编译两个Target!因为我们在build中 写了DependsOnTargets=“output”, 即build依赖于output目标,因此会先编译output,然后编译build

<?xml version="1.0" encoding="utf-8"?>
<!--根元素,表示一个项目-->
<!--DefaultTargets用于定默认执行的目标-->
<Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!--属性都要包含在PropertyGroup元素内部-->
  <PropertyGroup>
    <!--声明一个"word"属性,其值为"hello world"-->
    <word>hello world</word>
  </PropertyGroup>
  <!--目标-->
  <Target Name="build" DependsOnTargets="output">
    <!--MSBuild提供的一个内置任务,用于生成记录信息用$(属性名)来引用属性的值-->
    <Message Text="my first MSBuild $(word)"></Message>
  </Target>
  <Target Name="output">
    <!--MSBuild提供的一个内置任务,用于生成记录信息用$(属性名)来引用属性的值-->
    <Message Text="target output"></Message>
  </Target>
</Project>

在这里插入图片描述

4、使用MSBuild编译C#文件

// FirstCS.cs
using System.Threading;
namespace MyUtils
{
    public class FirstCS
    {
        static void Main()
        {
            System.Console.WriteLine("简单的引用C#程序");
            SecondCS.SecondPrint();
            Thread.Sleep(1000);
        }
    }
}

// SecondCS.cs
using System.Threading;
namespace MyUtils
{
    static class SecondCS
    {
        public static void SecondPrint()
        {
            System.Console.WriteLine("第二个程序!!!");
            Thread.Sleep(1000);
        }
    }
}

// ThirdCS.cs
using System.Threading;
namespace MyUtils
{
    static class ThirdCS
    {
        public static void ThirdPrint()
        {
            System.Console.WriteLine("第三个程序!!!");
            Thread.Sleep(1000);
        }
    }
}

创建如上三个cs文件


<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!--项都要包含在ItemGroup元素内部-->
  <ItemGroup>
    <!--声明一个"CSFile"的项,Include表示引入"FirstCS.cs"文件-->
    <CSFile Include="FirstCS.cs">
      <!--Version表示项的元数据(附加信息)-->
      <Version>2.0.0.0</Version>
    </CSFile>
    <!--也可用";"一次引入多个文件-->
    <CSFile Include="SecondCS.cs;ThirdCS.cs"/>
  </ItemGroup>
  <Target Name="build">
    <!--@引用项的值,默认以";"分割开-->
    <!--输出"FirstCS.cs;SecondCS.cs;ThirdCS.cs"-->
    <Message Text="@(CSFile,'    ')"></Message>
    <!--%引用项的元数据,输出"1.0.0.0"-->
    <Message Text="%(CSFile.Version)"></Message>
  </Target>
</Project>

使用1,我们引入了上述三个cs文件,并将其文件名进行输出,结果如下
在这里插入图片描述


使用2,使用MSBuild创建可运行文件

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <!--指定要编译的文件-->
    <CSFile Include="FirstCS.cs;SecondCS.cs"/>
  </ItemGroup>
  <Target Name="build">
    <!--使用Csc任务,对应csc编译器-->
    <!--Sources属性表示要编译的文件集合-->
    <!--TargetType表示编译目标类型,对应csc编译器的/target参数-->
    <Csc Sources="@(CSFile)" TargetType="exe">
      <!--OutputAssembly为csc的输出参数-->
      <!--PropertyName表示把TaskParameter属性所指定的输出参数的值存储到outputExeName这个属性中-->
      <!--Output还有一个ItemName属性,表示存储到一个项中-->
      <Output TaskParameter="OutputAssembly" PropertyName="outputExeFileName"/>
    </Csc>
    <!--Message任务就可以使用csc所导出的属性outputExeFileName了-->
    <!--输出FirstCS.exe-->
    <Message Text="$(outputExeFileName)"/>
    <!--Exec任务可以运行带有指定程序(可加参数)或命令-->
    <!--运行刚从FirstCS.cs源文件编译好的程序-->
    <!--运行结果为"MSBuild组织编译"-->
    <Exec Command="$(outputExeFileName)"></Exec>
  </Target>
</Project>

运行结果如下,并且会在文件夹中生成一个.exe文件,如图二
在这里插入图片描述
在这里插入图片描述
执行FirstCS.exe结果如下,可见MSBuild将我们的.cs编译成了可执行文件,并且不需要安装Visual Studio,如开篇时候提到的
在这里插入图片描述

参考文章
演练:使用 MSBuild,包括如何安装
MSBuild
MSBuild目录

;