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\

 

参考:

VS生成后事件及相关bat命令解析

  

 

posted @ 2017-05-25 00:01  小金乌会发光-Z&M  阅读(140)  评论(0编辑  收藏  举报