不止命令行!自定义VS生成事件

前言

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

b30ebb49a6ba205c1e3424c708bf024c.png

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

生成事件的本质

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

编辑项目文件,可以看到它实际上是一个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]

可以看到执行正常:

a955ea6eef87a8196a37fd7ec2d8e2cf.png

执行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>

5c724b8ed931fb030854d4c55a13199e.png

结论

通过本文,你可以了解到,如何自定义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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用标准库中的`argparse`模块来自定义命令行参数。下面是一个简单的例子: ```python import argparse parser = argparse.ArgumentParser(description='这是一个自定义命令行参数的例子') parser.add_argument('--input', dest='input_file', required=True, help='输入文件的路径') parser.add_argument('--output', dest='output_file', required=True, help='输出文件的路径') parser.add_argument('--verbose', action='store_true', help='是否打印详细信息') args = parser.parse_args() print('输入文件:{}'.format(args.input_file)) print('输出文件:{}'.format(args.output_file)) if args.verbose: print('打印详细信息') ``` 在这个例子中,我们创建了一个`ArgumentParser`对象,并使用`add_argument()`方法来添加自定义参数。`add_argument()`方法有几个参数,其中`destination`(或`dest`)指定参数的名称,`required`指定参数是否必需,`help`指定参数的帮助信息,`action`指定参数的行为。在这个例子中,我们添加了三个参数:`--input`、`--output`和`--verbose`。`--input`和`--output`是必需的参数,而`--verbose`是一个可选参数,它的行为是存储一个布尔值,表示是否打印详细信息。 在程序运行时,我们调用`parse_args()`方法来解析命令行参数,并将解析结果存储在`args`变量中。我们可以通过`args`变量来获取命令行参数的值。在这个例子中,我们打印了`--input`和`--output`参数的值,并在`--verbose`参数被指定时打印了一条详细信息。 使用`argparse`模块可以方便地自定义命令行参数,并且可以自动生成帮助信息,提高程序的易用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值