不止命令行!自定义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生成事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Source Generator 单元测
- 下一篇: Gitflow branch与Docke