不止命令行!自定义VS生成事件
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不止命令行!自定义VS生成事件相关的知识,希望对你有一定的参考价值。
前言
在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生成事件的主要内容,如果未能解决你的问题,请参考以下文章