Note6: Visual Studio生成事件解析及batch指令编程
背景
Visual Studio项目开发过程中,开发人员会开发出DLL,EXE可执行文件等。可执行程序在复制到服务器之前,需要把相关的DLL、PDB,可执行文件,批处理文件和配置文件组织在一起打包。但是程序可能仅生成一个DLL和PDB,而其他的文件需要引用公共库的DLL,从而需要手动复制的工作,基于持续集成CI的理念,最好是在一处维持公共库,在需要升级时,仅更换公共库中的DLL和PDB等文件,将升级过程自动化。生成后事件就是在这样的需求之下提出的。
生成事件
当一个解决方案中有多个项目时,需要拷贝一些文件(比如DLL)到指定的目录下,或者遇到com组件还需要提前注册dll,那便可以使用Visual Studio的生成事件。 通过自定义生成事件,可以在生成开始之前或完成之后自动运行命令。
打开项目(以VS2022为例),右击项目,打开属性—>生成事件,如图所示:
- 直接填入命令
可以在命令行中直接填入copy,xcopy等DOS文件复制命令。比如在生成后事件命令行输入如下内容:
xcopy "$(TargetDir)*" "$(SolutionDir)\ThirdParty\XXXPlatform\" /s/e/y/c/h IF $(ConfigurationName)==Debug ( xcopy "$(TargetDir)XXX.Extensions.*.dll" "$(SolutionDir)\Distribute\Debug\" /s/e/y/c/h ) ELSE ( xcopy "$(TargetDir)XXX.Extensions.Component*.dll" "$(SolutionDir)\Distribute\Release\" /s/e/y/c/h )
- 使用批处理文件
如果需要的生成事件涉及比较复杂的删除目录,删除文件,拷贝目录,拷贝子目录,等操作,可能需要撰写比较多的命令,为了简化,可以把这些拷贝,删除动作组织成一个bat文件:
$(SolutionDir)CopyBuildFile.bat
而文件内容由之前的copy类似的命令组成,示例如下:
::清除旧文件 del /S /Q "%~dp0"Bin\*.dll del /S /Q "%~dp0"Bin\*.dll rd /S /Q "%~dp0"Bin\hplugin rd /S /Q "%~dp0"Bin\hplugin ::公共DLL xcopy /Y "%~dp0"..\dll\HLOG.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\hpr.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\Identify.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\libeay32.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\RegexInterface.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\EncryptInterface.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\hplug.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\RemoteDeviceSocket.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\CrashAPI.* "%~dp0"Release\ xcopy /Y "%~dp0"..\dll\HLOG.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\hpr.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\Identify.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\libeay32.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\RegexInterface.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\EncryptInterface.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\hplug.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\RemoteDeviceSocket.dll "%~dp0"Bin\ xcopy /Y "%~dp0"..\dll\CrashAPI.dll "%~dp0"Bin\ ::开源协议 ::主程序 xcopy /Y "%~dp0"Release\DeviceInterfaceAgent.exe "%~dp0"Bin\ ::脚本 xcopy /Y "%~dp0"Release\*.bat "%~dp0"Bin\ ::插件 rd /S /Q "%~dp0"Release\hplugin rd /S /Q "%~dp0"Release\hplugin md "%~dp0"Release\hplugin md "%~dp0"Bin\hplugin xcopy /Y /S "%~dp0"..\Devices\* "%~dp0"Release\hplugin\ /EXCLUDE:%~dp0\HpluginExclude.txt xcopy /Y /S "%~dp0"Release\hplugin\* "%~dp0"Bin\hplugin\ /EXCLUDE:%~dp0\PdbExclude.txt ::保存PDB rd /S /Q "%~dp0"PDB rd /S /Q "%~dp0"PDB md "%~dp0"PDB xcopy /Y /S "%~dp0"Release\*.pdb "%~dp0"PDB\
参考:
朱颜辞镜花辞树,敏捷开发靠得住!