前言

在VS中打开项目属性,选择“生成事件”选项卡。在“生成前事件命令行”或“生成后事件命令行”文本框中可以输入任何命令提示符或.bat文件中有效的命令:

但是,有没有可能执行更丰富的命令呢?

生成事件的本质

上面设置的“生成事件”保存在哪?

编辑项目文件,可以看到它实际上是一个MsBuild目标,执行Exec任务:

<Target Name="PreBuild" BeforeTargets="PreBuildEvent"><Exec Command="del d:\$(TargetFileName)" />
</Target><Target Name="PostBuild" AfterTargets="PostBuildEvent"><Exec Command="copy $(OutDir)\$(TargetFileName)   d:\$(TargetFileName)" />
</Target>

生成前事件是在PreBuildEvent目标前运行,生成后事件是在PostBuildEvent目标后运行。

执行多任务

既然是MsBuild目标,那就不光可以执行Exec任务了。

我们可以同时执行多个MsBuild内置任务,比如将bin\Debug\net5.0目录中的所有文件复制到d:\tmp:

<Target Name="PostBuild" BeforeTargets="PostBuildEvent"><Message Text="生成后事件开始" /><RemoveDir Directories="d:\tmp" /><CreateItem Include="$(TargetDir)*.*"><Output TaskParameter="Include" ItemName="CopyFiles" /></CreateItem><Copy SourceFiles="@(CopyFiles)"DestinationFolder="d:\tmp"/><Message Text="生成后事件结束" />
</Target>
  • Message 记录一条消息

  • RemoveDir 删除指定的目录及其所有文件和子目录

  • CreateItem 使用输入项目填充项目集合,这里用来生成文件列表

  • Copy 将文件复制到指定位置

更多任务详情请查看MSBuild 任务参考[1]

可以看到执行正常:

执行C#代码

如果现成的任务不能满足要求,我们还可以编写C#代码实现任务。

当然不是编写exe,而是使用内联任务[2]

比如,输出一条错误日志:

<UsingTask
TaskName="HelloWorld"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
<ParameterGroup />
<Task><Using Namespace="System"/><Using Namespace="System.IO"/><Code Type="Fragment" Language="cs">
<![CDATA[Log.LogError("Hello, My IO!");
]]></Code>
</Task>
</UsingTask><Target Name="PreBuild" BeforeTargets="PreBuildEvent"><HelloWorld />
</Target>

结论

通过本文,你可以了解到,如何自定义VS生成事件。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

参考资料

[1]

MSBuild 任务参考: https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-task-reference?view=vs-2019

[2]

内联任务: https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-inline-tasks?view=vs-2019

不止命令行!自定义VS生成事件相关推荐

  1. 不止命令行-自定义VS生成事件

    前言 在VS中打开项目属性,选择"生成事件"选项卡.在"生成前事件命令行"或"生成后事件命令行"文本框中可以输入任何命令提示符或.bat文件 ...

  2. android+命令行编译,打包生成apk文件,Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包...

    默认为debug mode,使用的签名文件在: $HOME/.android/debug.keystore 比如 C:\Users\chengcj1.android\debug.keystore 1. ...

  3. Jmeter命令行执行并生成HTML报告

    前提:准备好jmeter脚本,找到jmeter配置文件查看生成的日志格式是否为csv,如果不是请改为csv 注意:使用命令执行jmeter脚本必须使用jmeter 3.0及以上版本 1.使用命令行执行 ...

  4. linux中如何自定义命令行,linux终端颜色和命令行自定义

    1.命令行格式 用户名@主机名:当前路径$ 设置 echo "PS1='${debian_chroot:+($debian_chroot)}\[\033[01;04;32m\]\u\[\03 ...

  5. MSBuild 命令行编译Delphi

    为了构建项目,IDE现在使用MSBuild而不是以前的内部生成系统.IDE中的build.compile和make命令调用Microsoft的新生成引擎:MSBuild,它提供了全面的依赖性检查.MS ...

  6. 在VS.NET 的项目中使用生成事件

    简介 在使用VS.NET,在build一个项目时,可以为项目设定生成事件,包括'生成前'事件(预先生成事件)和'生成后'事件(后期生成事件). 在这2个事件中,我们可以 - 使用[预先生成事件命令行] ...

  7. 【Rust】argh:基于 derive 宏且对二进制体积进行优化的命令行解析工具

    Derive-based argument parsing optimized for code size and conformance to the Fuchsia commandline too ...

  8. mysql命令行安装报错_centos命令行安装mysql随机密码查看方法(遇到问题及其解决办法)...

    mysql初次命令行安装登录时报错: 未输入密码:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwo ...

  9. 命令行工具开发:如何快速实现命令行提示?

    简介:对于稍微复杂一些的命令行工具,命令行的提示功能必不可少.那么对于不同语言的开发者,有没有一种简单快捷的实现方式呢?本文分享一种快速实现的方法,使用YAML文件定义命令行工具的使用规范,再通过工具 ...

最新文章

  1. 谷歌邮箱上不了的情况下怎么登录谷歌邮箱
  2. 查询liunx上磁盘占用情况
  3. ifcfg系列命令配置网络属性
  4. python中文解释-python注释和2版本的中文乱码
  5. Mozilla发布2015年度报告:搜索合作成营收大头
  6. JZOJ 5390. 【NOIP2017提高A组模拟9.26】逗气
  7. OpenCV学习笔记(十七):图像修补:inpaint()
  8. jeecg框架日常开发问题解决方法
  9. wimbuilder2教程_Wimbuilder WIN10XPE制作所需的工程文件
  10. 截图截取各种右键菜单的方法
  11. AI分析猪叫声中的情绪,“贾维斯”“大白”会不会照进现实?
  12. 200 行代码解读国产数据库阿里 OceanBase 的速度源头!| CSDN 博文精选
  13. DataList和Repeater分页
  14. mysql long varchar2_案例:Oracle数据库long查询结果转换为varchar2类型方法的操作步骤...
  15. Thinkpad 笔记本VMware Workstation 安装虚拟机出现“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”解决方法
  16. c# Conditional用法详解
  17. 百度新营销:不只是关键词了
  18. 每天10道Crypto Day3
  19. 快手正与NBA洽谈战略合作,涉及内容版权和商业化
  20. 表白生日祝福和3D表白相册

热门文章

  1. RedHat 5.4下构建postfix全功能电子邮(七)-extmail extman平台-(下集)
  2. dwr 写的小程序,配置
  3. vue xunidom_vue的虚拟dom(Virtual DOM )
  4. 帆软报表(finereport)图表钻取详细类别 当前页对话框展示
  5. HZNU 2019 Summer training 8
  6. SQL Server 2000详细安装过程及配置
  7. UESTC 电子科大专题训练 DP-N
  8. cf769D(枚举位或运算)
  9. 个人作业-Week2
  10. 【转】js老生常谈之this,constructor ,prototype