从零开始构建MSBuild C#项目文件ITeye - 凯时娱乐

从零开始构建MSBuild C#项目文件ITeye

2019-01-10 12:52:59 | 作者: 昌淼 | 标签: 文件,项目,构建 | 浏览: 2181

创立程序

首要翻开MSBuild指令提示符,然后切换到你想要创立项目的文件夹,例如我的文档或许桌面。然后,输入md HelloWorld创立一个名为HelloWorld的文件夹。然后输入cd HelloWorld切换到这个文件夹。为简洁起见,下面所说的指令提示符,都是指这儿的MSBuild指令提示符。

运用你最喜欢的文本编辑器,在HelloWorld文件夹中创立一个名为helloworld.cs的代码文件,文件内容如下:

 

using System;
class HelloWorld
 static void Main()
#if DebugConfig
 Console.WriteLine("WE ARE IN THE DEBUG CONFIGURATION");
#endif
 Console.WriteLine("Hello, world!");
}

 将文件保存之后,就能够在指令提示符中运用C#编译器东西csc编译该文件了。

 

 

csc helloworld.cs

 然后就能够运转生成的helloworld.exe来查看编译生成的文件了。

 

 

helloworld.exe

 

 

应该能够在指令提示符中看到程序的输出。然后,删去生成的exe,预备下一步。

创立MSBuild项目文件

用文本编辑器创立名为Helloworld.csproj的文件,文件内容如下:

 

 Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
 ItemGroup 
 Compile Include="helloworld.cs" / 
 /ItemGroup 
 Target Name="Build" 
 Csc Sources="@(Compile)"/ 
 /Target 
 /Project 

 

 

下面来简略解释一下。

csproj项目文件是一个XML文件,根节点是Project节点,能够包括若干个ItemGroup节点和Target节点。ItemGroup节点是一个容器,用来包括若干个项元素。例如这儿就包括了一个项元素Compile,,包括了helloworld.cs文件。这儿还能够运用通配符。

 

 Compile Include="*.cs" / 

 

 

Target元素是项目构建的方针,每个文件能够有多个Target,履行不同的使命。这儿,名为Build的Target就包括了Csc使命来编译一个文件,运用Source特点来指定要编译的文件。别的还有一些使命,会在下面阐明。

这儿还有一种语法@(Compile),这儿会引证上面界说的项。在这儿便是引证上面界说的helloworld.cs文件。假如界说了多个项,Target在履行的时分会以相似foreach的方式迭代履行每一个项。

有了项目文件,就能够运用MSBuild来履行项目的生成了,/t表明履行名为Build的Target。

 

msbuild helloworld.csproj /t:Build

 

 

查看一下是否生成了helloworld.exe,然后将其删去,预备下一步。

增加构建特点

在Project开端标签之后增加一个特点组节点:

 

 PropertyGroup 
 AssemblyName MSBuildSample /AssemblyName 
 OutputPath Bin\ /OutputPath 
 /PropertyGroup 

 

 

每个项目文件能够包括若干个PropertyGroup节点,其间能够包括若干个特点节点,每一个节点界说一个特点,能够在项目文件中引证。这儿就包括了AssemblyName和OutputPath两个特点。之后就能够经过$(特点名)的语法来运用了。

在Csc节点前刺进一个节点:

 

 MakeDir Directories="$(OutputPath)" Condition="!Exists($(OutputPath))" / 

 然后再Csc节点中增加一个OutputAssembly特点:

 

 

 Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" / 

 

 

这儿增加了一个创立文件夹的使命,创立的文件夹姓名由上面的特点组界说。简直每个使命都能够增加一个Condition特点,指定什么条件下履行该使命。这儿是在输出目录不存在的情况下才履行该使命,创立目录。除此之外,还有其他许多使命,例如仿制文件、删去文件等等,详细情况能够查看MSBuild使命参阅。别的还有一个姓名叫做MSBuild Community Tasks的开源项目,包括了其他一些使命,假如有需求的能够参阅一下。

别的微软主张咱们在界说目录特点的时分,最好将目录后边的反斜杠\界说到特点中,而不是加在引证之后。例如上面的就比下面的更好:

 

 OutputPath Bin\ /OutputPath 
OutputAssembly=="$(OutputPath)$(AssemblyName).exe" / 

 

 OutputPath Bin /OutputPath 
OutputAssembly=="$(OutputPath)\$(AssemblyName).exe" / 

 现在项目文件应该相似这样:

 

 

 Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
 PropertyGroup 
 AssemblyName MSBuildSample /AssemblyName 
 OutputPath Bin\ /OutputPath 
 /PropertyGroup 
 ItemGroup 
 Compile Include="helloworld.cs" / 
 /ItemGroup 
 Target Name="Build" 
 MakeDir Directories="$(OutputPath)" Condition="!Exists($(OutputPath))" / 
 Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" / 
 /Target 
 /Project 

 再次运转一下构建指令,查看一下程序出否在输出目录中生成。

 

 

msbuild helloworld.csproj /t:Build

 

 

增加构建方针

在构建进程中能够指定多个构建方针,能够指定一个方针调用其他方针,还能够指定默许的构建方针。

在Build方针之后增加两个新方针:

 

 Target Name="Clean" 
 Delete Files="$(OutputPath)$(AssemblyName).exe" / 
 /Target 
 Target Name="Rebuild" DependsOnTargets="Clean;Build" / 

 

 

这两个构建方针很简略,Clean方针会删去生成的exe文件。Rebuild方针会运转Clean和Build两个方针。

在Project节点中增加一个新特点DefaultTarget,就能够指定一个默许方针。假如运转MSBuild指令的时分没有运用/t指定Target,就会主动履行默许的方针。

 

 Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 

 运转一下msbuild helloworld.csproj /p:AssemblyName=Greetings,测验一下。这儿经过/p参数传入指定的参数名,这会掩盖项目文件中指定的文件名。假如不指定参数名的话就会运用在项目中现已界说的参数。然后运转msbuild helloworld.csproj /t:clean /p:AssemblyName=Greetings**/p:AssemblyName=Greetings,删去现已生成的文件。

 

在名为Build的Target中增加如下特点:

Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe"

 nputs特点指定该方针依靠的输入文件,在这儿由上面的Compile项所界说。Outputs指定项目的输出文件。指定这两个特点之后,MSBuild就会在运转此方针的时分查看输入和输出文件。假如输入文件相对于输出文件都是最新的,那么MSBuild就会越过构建进程。假如有部分文件现已修正,MSBuild就会只对这部分文件运转构建方针。

概念总结

MSBuild根据csproj项目文件来进行构建。csproj文件中能够有多种节点。

ItemGroup节点是项目组,能够有多个子节点, 用来包括要处理的一个或多个文件。每个子节点都必须有Include特点指定要包括什么文件,还有一个可选的Exclude节点指定扫除什么文件。界说ItemGroup之后,就能够运用@(节点名)来引证Item了。

PropertyGroup节点是特点组,能够有多个节点,用来包括项目构建进程中运用到的特点。界说了特点之后,能够运用$(特点名)语法来访问。

Target是构建方针,是MSBuild的履行方针,每个Target下面能够包括多个使命,还能够引证其他的Target构成一个履行链。微柔和C#社区界说了许多使命,能够别离在其MSBuild使命参阅和MSBuild Community Tasks中找到。

最终,我在Github上新建了一个项目MSBuildExample,演练了一下上面的概念。这个项目增加了一个AfterBuild方针,在Release状态下构建成功之后,将生成的可履行文件重命名成自界说称号,然后和第三方库以及一个配置文件打包生成zip压缩包。有爱好的同学能够看一下。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章