`

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

    博客分类:
  • C#
阅读更多

准备条件

  • 一个好用的文本编辑器,例如Atom或者Sublime Text。
  • MSBuild命令行工具。如果已经安装了Visual Studio的话,应该可以在开始菜单中找到类似Visual Studio 2015的MSBuild命令提示符 这样的项目。

创建程序

首先打开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压缩包。有兴趣的同学可以看一下。

分享到:
评论

相关推荐

    Kook.Net-C#资源

    Kook.Net-C#资源是一个专注于提供与KOOK即时通讯平台交互的C#语言的软件开发工具包(SDK),它为开发者提供了一系列预先...通过这些资源,开发者可以更加专注于业务逻辑的实现,而不必从零开始处理底层的API交互细节。

    figuring-out-team-city:一个简单项目的仓​​库

    "找出团队城市"可能是项目的目标,意味着它可能涵盖了从零开始搭建TeamCity服务器,配置项目,到触发构建和执行测试的全过程。简单项目的仓库意味着,尽管这是一个基础示例,但足够展示TeamCity的核心功能和工作流程...

    WinCC嵌入式Excel报表系统:实现高效自动化报表生成与数据分析

    内容概要:本文详细介绍了WinCC嵌入式Excel报表系统的功能和优势。该系统利用VBS脚本和Excel模板相结合的方式,能够直接从WinCC变量归档库读取数据并生成高质量的报表。文中展示了多种实用的技术细节,如数据质量校验、不同数据处理模式(实时值、平均值、累计值)、模板机制、报表控件集成以及条件格式的应用。此外,还提供了具体的代码示例来解释如何实现这些功能。 适用人群:适用于从事工业控制系统开发、维护的技术人员,尤其是那些需要频繁处理报表任务的人群。 使用场景及目标:主要应用于需要快速生成各类生产数据报表的场合,如日报表、月报表等。通过该系统可以极大提高工作效率,减少人工干预,确保数据准确性,并且降低了学习成本和技术门槛。 其他说明:该系统不仅支持多版本兼容,而且移植性强,能够在不同的WinCC环境中轻松部署。同时,它还允许用户通过简单的Excel模板修改来自定义报表格式,满足多样化的业务需求。

    【信息安全领域】实战项目:渗透测试与漏洞利用技术详解及权限提升方案设计介绍了信息安全领域的一个

    内容概要:本文档《信息安全领域实战项目.docx》详细介绍了网络安全渗透测试的具体步骤和实战案例。文档从信息收集开始,逐步深入到漏洞验证、漏洞攻击和权限提升等环节。首先,通过使用工具如FOFA进行资产收集,识别出目标服务器开放的多个端口,并进一步通过后台扫描工具发现潜在的敏感文件。接着,针对发现的Grafana任意文件读取漏洞(CVE-2021-43798)和ActiveMQ任意文件上传漏洞(CVE-2016-3088),分别进行了详细的漏洞验证与攻击演示,包括具体的payload构造、利用方式及攻击效果展示。最后,探讨了CVE-2021-4034 Linux polkit提权漏洞的应用场景及其利用方法。此外,文档还涵盖了政务智慧信息系统安全建设项目的背景、目标、建设内容以及相关的人才需求分析。 适合人群:具备一定网络安全基础,尤其是对渗透测试感兴趣的初学者或中级技术人员。 使用场景及目标:①帮助读者理解并掌握从信息收集到漏洞利用的完整渗透测试流程;②提供实际操作案例,使读者能够学习如何识别和利用常见的Web应用漏洞;③培养读者在面对真实世界的安全问题时,能够运用所学知识进行有效的分析和解决。 阅读建议:由于文档内容涉及较多的技术细节和实战操作,建议读者在阅读过程中结合实际环境进行练习,并参考官方文档或其他权威资料加深理解。同时,注意合法合规地使用所学技能,确保所有活动都在授权范围内进行。

    电动汽车动力系统仿真的关键技术:双向DCDC变换器与电机控制策略

    内容概要:本文详细介绍了电动汽车动力系统的仿真技术,涵盖双向DCDC变换器的能量反馈机制和支持异步电机与永磁同步电机的仿真。文中展示了多个关键控制策略,如电流环控制、最大转矩电流比(MTPA)控制、弱磁控制以及基于事件触发的协调控制。通过MATLAB、Python和C等多种编程语言的具体代码实例,解释了如何实现高效的能量管理和电机控制。此外,文章还讨论了仿真过程中遇到的实际问题及其解决方案,如电压过冲、电流振荡和系统耦合等问题。 适合人群:从事电动汽车研究与开发的技术人员、高校相关专业师生、对电动汽车动力系统感兴趣的工程师。 使用场景及目标:适用于电动汽车动力系统的设计与优化,帮助工程师理解和掌握双向DCDC变换器的工作原理及电机控制策略,提高能量利用效率,确保系统稳定性。 其他说明:文章不仅提供了详细的理论和技术背景,还分享了许多实践经验,有助于读者更好地将理论应用于实际项目中。

    石油工程中基于深度学习的FracPredictor裂缝建模与压裂模拟技术解析

    内容概要:本文详细介绍了FracPredictor这一基于深度学习的裂缝预测工具及其应用。首先探讨了数据处理部分,如利用滑窗处理时序+空间特征混合体的方法,以及如何将岩石力学数据转换为适合神经网络的格式。接着深入剖析了模型架构,包括时空双流网络、注意力机制用于跨模态融合、HybridResBlock自定义层等创新设计。此外,文章还分享了训练技巧,如渐进式学习率衰减、CosineAnnealingWarmRestarts调度器的应用。对于可视化方面,则推荐使用PyVista进行三维渲染,以直观展示裂缝扩展过程。文中还提到了一些实用的小技巧,如数据预处理中的自动标准化、配置文件参数调整、以及针对特定地质条件的优化措施。最后,通过多个实际案例展示了FracPredictor在提高预测准确性、降低计算成本方面的优势。 适合人群:从事石油工程、地质勘探领域的研究人员和技术人员,尤其是对裂缝建模与压裂模拟感兴趣的从业者。 使用场景及目标:适用于需要高效、精准地进行裂缝预测和压裂模拟的工程项目。主要目标是帮助用户掌握FracPredictor的工作原理,学会从数据准备到结果可视化的完整流程,从而优化压裂方案,减少工程风险。 其他说明:文章不仅提供了详细的代码示例,还附带了丰富的实战经验和注意事项,有助于读者更好地理解和应用这项新技术。

    multiSIM视频教程-电路创建和基本功能测试.zip

    multisim

    基于ssm的房产中介信息管理系统(源码+数据库)135

    基于ssm的房产中介信息管理系统:前端 html、jquery、layui,后端 maven、springmvc、spring、mybatis;角色分为管理员、员工;集成卖家信息,买家信息,房屋管理等功能于一体的系统。 ## 功能介绍 - 用户管理:用户信息的增删改查,按用户名搜素 - 通知公告:公告信息的增删改查,关键词搜索 - 卖家信息:卖家信息的增删改查,关键词搜索 - 买家信息:买家信息的增删改查,关键词搜索 - 房屋管理:房屋信息的增删改查,按小区名称搜索,房屋图片上传 - 房屋搜索:房屋列表查询,查询满足条件的房屋信息 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    基于ssm的学生资助管理系统(源码+数据库)147

    基于ssm的学生资助管理系统:前端 jsp、jquery,后端 springmvc、spring、mybatis;角色分为:管理员、学生;集成OA流程管理、贫困生认定、奖学金管理等功能于一体的系统。 ## 功能介绍 - 系统管理:权限管理,菜单管理,在线管理,日志管理,系统用户管理 - OA流程管理:工作流程(模型管理,流程管理,运行中流程,历史的流程),任务管理,消息管理 - 贫困生认定管理:贫困生认定申请,申请材料审核,上报院校审批 - 国家助学金管理:国家助学金申请,申请材料审核,上报院校审批 - 勤工俭学管理:学生基本信息,勤工岗位信息,学生勤工信息 - 公告管理:公告信息的增删改查 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    芬朗A12U电脑调音软件是专为音响爱好者和专业人士设计的一款强大工具,喜欢的话,直接下载吧

    芬朗A12U电脑调音软件是专为音响爱好者和专业人士设计的一款强大工具,喜欢的话,直接下载吧

    基于ssm的学生成绩管理系统(源码+数据库)206

    基于ssm的学生成绩管理系统:前端 jsp、jquery、bootstrap,后端 maven、springmvc、spring、mybatis;角色分为管理员、学生;集成用户管理,成绩管理,公告管理等功能于一体的系统。 ## 功能介绍 - 基本功能:登录,注册,退出,密码修改 - 用户管理:用户信息的增删改查,用户也可以由学生自行注册,管理员可以修改和删除用户信息,学生只能操作自己的信息 - 成绩管理:管理员对成绩信息的增删改查,学生只能查询 - 公告管理:管理员对公告信息的增删改查,学生只能查看 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    深度学习基于PyTorch的快速轻量级通道注意力机制(FFCM):EfficientNet模型改进与应用

    内容概要:本文介绍了一种快速轻量级的通道注意力机制(FFCM),并通过修改MBConv模块将其应用于EfficientNet模型中。FFCM由局部通道交互和全局通道交互两部分组成。局部通道交互通过深度可分离卷积实现,全局通道交互则采用全局平均池化和两个卷积层来减少通道维度并恢复。为了将FFCM集成到MBConv模块中,定义了`add_ffcm_to_mbconv`函数,该函数在MBConv模块的前向传播过程中插入FFCM模块。最后,通过`create_model`函数创建了一个带有FFCM的EfficientNet模型,并修改了分类头以适应不同的类别数量。代码还展示了如何加载预训练权重以及模型的测试输出。; 适合人群:对深度学习有一定了解,特别是熟悉卷积神经网络和注意力机制的研究人员或工程师。; 使用场景及目标:①理解快速轻量级通道注意力机制(FFCM)的设计思路及其在卷积神经网络中的应用;②掌握如何修改现有的卷

    社交媒体-短视频发布-用户互动-测试平台-1744736861.zip

    社交媒体_短视频发布_用户互动_测试平台_1744736861.zip

    油气田开发中CO2驱水的二阶PDE两相流模拟及COMSOL应用

    内容概要:本文详细介绍了使用COMSOL进行CO2驱水的二阶偏微分方程(PDE)两相流模拟的方法和技术细节。主要内容涵盖核心控制方程(如达西定律和质量守恒方程)、相对渗透率模型的选择(如Corey模型和Brooks-Corey模型)、边界条件的设置、求解器配置以及后处理技巧。文中强调了超负压驱替现象的模拟及其重要性,并提供了多个具体的操作实例和优化建议,确保模型的稳定性和准确性。 适合人群:从事油气田开发、碳捕集与利用封存(CCUS)研究的专业技术人员,以及对多物理场耦合仿真感兴趣的科研人员。 使用场景及目标:适用于油气田开发过程中CO2驱水模拟的研究项目,旨在提高采收率并评估碳封存效果。主要目标是通过精确的数学模型和高效的数值方法,模拟CO2和水在孔隙介质中的动态交互过程,从而优化注入策略和预测驱替效果。 其他说明:文中提供的MATLAB代码片段和COMSOL操作指南有助于读者快速上手实践。同时,文章还讨论了常见的数值问题及其解决方案,如数值震荡、模型发散等,帮助读者规避常见错误并提高模拟的成功率。

    基于COMSOL的地应力平衡与隧道开挖及衬砌支护仿真技术详解

    内容概要:本文详细介绍了使用COMSOL进行隧道开挖及衬砌支护仿真的全过程,涵盖地应力平衡、开挖模拟、衬砌支护等关键技术环节。首先强调了地应力平衡的重要性,包括重力补偿、初始应力场设置等。接着阐述了开挖模拟的具体方法,如材料切换、几何非线性选项的应用。然后讲解了衬砌支护的实施细节,涉及壳接口创建、接触条件设置等。最后讨论了分步求解策略以及常见问题的解决方案,如应力奇点处理、网格优化等。 适合人群:从事岩土工程仿真、隧道工程施工及相关领域的工程师和技术人员。 使用场景及目标:适用于需要进行隧道开挖及支护仿真的工程项目,旨在帮助用户掌握COMSOL软件在此类应用中的具体操作方法,提高仿真精度和效率。 其他说明:文中提供了大量实用技巧和注意事项,如参数设置、代码片段等,有助于读者更好地理解和应用相关技术。同时提醒读者关注实际项目的具体情况,灵活调整参数以获得最优结果。

    C++与OpenCV实现高效工业检测模板匹配框架:支持多形态ROI与并行加速

    内容概要:本文详细介绍了作者使用C++和OpenCV构建的一个高效的模板匹配框架,适用于工业检测场景。该框架支持创建带有旋转角度的矩形ROI、圆形ROI以及环形ROI,并提供了手绘屏蔽功能来提高模板制作的灵活性。为了加快匹配速度,采用了多尺度金字塔加速、并行计算和亚像素级定位优化等技术手段。此外,文中还分享了一些实际应用案例和技术难点解决方案,如硬币分类计数、PCB板元件计数等。 适合人群:有一定C++和OpenCV基础,从事机器视觉或工业自动化相关领域的工程师。 使用场景及目标:①用于工业生产线上的物体检测与分类;②提高模板匹配的速度和准确性;③解决复杂背景下目标识别的问题。 其他说明:文中不仅展示了具体的代码实现,还讨论了许多实践经验,包括性能优化技巧、常见错误及其规避方法等。对于希望深入了解模板匹配算法并在实际项目中应用的人来说非常有价值。

    分享一个快速执行脚本的工具OneClicker 最新版

    工作的时候,有很多琐碎的事情需要重复的做 比如打开某个文件,打开某个网站,打开某个软件 这个时候可以写个自动脚本,把机械琐碎的事情交给脚本处理 但是脚本一多,不好管理,而且要选择哪个脚本也是个麻烦的事情 所以写了OneClicker,快捷键呼出脚本的管理界面,脚本也绑定快捷键 在任何一个地方,只要按两三个按键,就可以执行某个脚本,处理掉琐碎事情 使用的流程 配置 1、function文件夹加上批处理脚本 2、运行软件OneClicker.exe 3、配置脚本的快捷键 使用 1、按Ctrl + K,弹出界面 2、再按脚本的快捷键,注意输入法是要英文的 例子:打开百度:先按Ctrl + K,再按B 关闭 1、点解界面右上角的关闭按钮,不会退出软件,只是最小化到托盘 2、想要退出软件,可以在任务栏或者托盘右键关闭

    基于MATLAB的心音信号自适应滤波降噪:LMS、NLMS、变步长LMS及RLS算法的应用

    内容概要:本文详细介绍了基于MATLAB实现的多种自适应滤波算法用于心音信号降噪的方法和技术。首先阐述了LMS(最小均方)算法的基本原理及其简单实现,接着讨论了归一化LMS(NLMS)、变步长LMS两种改进版本的特点和优势,并提供了相应的Matlab代码示例。最后深入探讨了RLS(递归最小二乘法)算法,在理论层面解释了其为何能在降噪效果上超越前两者,并附上了完整的代码实现。文中还给出了具体的实验数据对比,展示了各算法在不同条件下的性能差异。 适用人群:从事生物医学信号处理的研究人员、工程师以及对自适应滤波感兴趣的高校师生。 使用场景及目标:适用于需要对心音信号进行高质量降噪处理的实际应用场景,如临床诊断辅助设备的研发;同时也可以作为教学材料帮助学生理解自适应滤波的工作机制。 其他说明:文中不仅提供了详细的算法解析,还包括了许多实用的经验分享和技术细节提示,有助于读者更好地掌握并应用于实践中。此外,作者还强调了一些常见的误区和注意事项,提醒使用者避免不必要的错误。

    基于ssm+jsp的虚拟商品管理系统(源码+数据库)241

    基于ssm+jsp的虚拟商品管理系统:前端 jsp、jquery,后端 maven、springmvc、spring、mybatis;角色分为管理员、用户;集成促销商品、商品购买、购物车、订单查询等功能于一体的系统。 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

Global site tag (gtag.js) - Google Analytics