当前位置: 首页 > news >正文

使用 MSBuild 响应文件 (rsp) 来指定 dotnet build 命令行编译时的大量参数

在为开源项目 easiwin/MSTestEnhancer 进行持续集成编译时,需要在编译命令中传入较多的参数。这对于新接手此项目的人来说,成本还是高了一点儿。本文将介绍 MSBuild 响应文件 (MSBuild Response Files, *.rsp) 来优化命令行编译体验。


我们在 msbuild 命令中加入 /? 参数可以看到它对响应文件的解释:

> dotnet build /?

# 省略了一部分输出,只保留响应文件相关的两个。
@<file>             从文本文件插入命令行设置。若要指定
                    多个响应文件,请分别指定每个响应
                    文件。

                    自动从以下位置使用任何名为 "msbuild.rsp" 的
                    响应文件:
                    (1) msbuild.exe 的目录
                    (2) 生成的第一个项目或解决方案的目录
/noautoresponse     不自动包括任何 MSBuild.rsp 文件。(缩写:
                    /noautorsp)

当然,使用 dotnet msbuild 或者直接使用 msbuild.exe 都是一样的具备此功能。

那么响应文件到底是什么呢?我们在 dotnet build 命令后传入的参数就可以是响应文件的内容。

  • 响应文件以 .rsp 扩展名结尾,放在任何地方就行,只需要在 dotnet build 命令中用 @ 指定即可。
  • 也可以用预定的文件名 Directory.Build.rsp,放在 sln 同级目录或者父级目录中。

比如,在这个项目中,我直接在解决方案同级目录中新建了 Directory.Build.rsp 文件,并写入这些内容:

/p:Configuration=Release
/maxcpucount
/p:Version=1.6.0-beta
/p:AssemblyVersion=1.6.0.0

这样,当执行命令 dotnet builddotnet msbuild 时,将执行这些事情:

  • 使用 Release 配置进行编译
  • 当前计算机有多少 CPU 核,就使用多少个进程进行并行编译
  • NuGet 包打包版本设置为 1.6.0-beta(这将覆盖 csproj 中设置的 Version 属性)
  • 程序集版本设置为 1.6.0。0(这将覆盖 csproj 中设置的 AssemblyVersion 属性)

当然,还可以写更多的事情,但命令依旧简单——对新开发者是非常友好的。


参考资料

  • MSBuild Response Files - Visual Studio - Microsoft Docs
  • Default or specify msbuild properties in an external file - Stack Overflow
  • How to use MSBuild.rsp or otherwise specify default Visual Studio MSBuild.exe command line switches - Super User

相关文章:

  • VS 编译太慢了吗?新建解决方案配置关闭一部分项目的编译
  • 流畅设计 Fluent Design System 中的光照效果 RevealBrush,WPF 也能模拟实现啦!
  • 语义版本号(Semantic Versioning)
  • 使用 GitVersion 在编译或持续构建时自动使用语义版本号(Semantic Versioning)
  • UWP 流畅设计中的光照效果(容易的 RevealBorderBrush 和不那么容易的 RevealBackgroundBrush)
  • 使用 Emit 生成 IL 代码
  • 如何快速编写和调试 Emit 生成 IL 的代码
  • 自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference
  • 冷算法:自动生成代码标识符(类名、方法名、变量名)
  • WPF/UWP 的 Grid 布局竟然有 Bug,还不止一个!了解 Grid 中那些未定义的布局规则
  • Git 更安全的强制推送,--force-with-lease
  • 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)
  • 理解 C# 项目 csproj 文件格式的本质和编译流程
  • 如何创建一个基于命令行工具的跨平台的 NuGet 工具包
  • 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Apache Zeppelin在Apache Trafodion上的可视化
  • bootstrap创建登录注册页面
  • Docker 笔记(2):Dockerfile
  • es6要点
  • Java超时控制的实现
  • Python 反序列化安全问题(二)
  • yii2权限控制rbac之rule详细讲解
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 每天10道Java面试题,跟我走,offer有!
  • 排序算法之--选择排序
  • 前端工程化(Gulp、Webpack)-webpack
  • 区块链技术特点之去中心化特性
  • 在electron中实现跨域请求,无需更改服务器端设置
  • Hibernate主键生成策略及选择
  • raise 与 raise ... from 的区别
  • 正则表达式-基础知识Review
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (力扣题库)跳跃游戏II(c++)
  • (十六)Flask之蓝图
  • (算法二)滑动窗口
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)scrum常见工具列表
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net CF下精确的计时器
  • .NET MVC 验证码
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • /bin/bash^M: bad interpreter: No such file or directory
  • /run/containerd/containerd.sock connect: connection refused
  • @Import注解详解
  • @在php中起什么作用?
  • [20150321]索引空块的问题.txt
  • [20171102]视图v$session中process字段含义
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [android] 切换界面的通用处理