如图,项目路径,我们使用publis.bat 批处理 进行项目打包,将编译的项目文件 压缩成zip 包放到publish 文件夹
@echo off
set cur_path=%~dp0
set fe_build_path=%cur_path%build\
set be_pub_path=%cur_path%publish\
set compress_tool=%cur_path%tools\7za.exe
echo * 当前地址 %cur_path%
echo * 后端编译项目地址 %fe_path%
echo * 前端编译项目地址 %be_path%
echo * 压缩工具地址 %compress_tool%
rem 全量打包
set build_type=1
cd /d %cur_path%
:choice_inc
echo *
echo *
echo *
echo * 1. 全量打包(完整包)
echo * 2. 增量打包(更新时间在30天前的文件会被删除)
echo *
echo *
echo *
echo
echo
choice /c:12 /m " 选择打包模式, 默认为全量" /t 3 /d 1
if %errorlevel% == 1 set build_type=1
if %errorlevel% == 2 set build_type=2
:choice_start
echo *
echo *
echo *
echo * 1. Micro Web API
echo *
echo *
echo *
echo *
choice /c:12 /m " 选择功能"
if %errorlevel% == 1 goto buildbe
if %errorlevel% == 2 goto npminstall
goto end
:npminstall
echo 演示方法
goto end
:buildbe
set project_name=Micro.WEB.API
set project_path=Micro.WEB.API
echo 运行子模块 接收两参数 项目地址 %project_path% %project_name%
cd /d %be_pub_path%
echo 删除原发布 %be_pub_path%
del /q %be_pub_path%%project_name%.zip
rd /s /q %be_pub_path%%project_name%
echo 打包 %cur_path%
cd /d %cur_path%
echo publish -p:VersionPrefix=1.0.0 -c Release -r win-x64 --no-self-contained -o %be_pub_path%%project_name%
dotnet clean --configuration Release
dotnet publish -p:VersionPrefix=1.0.0 -c Release -r win-x64 --no-self-contained -o %be_pub_path%%project_name%
echo 编译发布完成
cd /d %cur_path%
echo 复制服务安装脚本
copy /y %cur_path%tools\service_*.bat %be_pub_path%%project_name%
cd /d %be_pub_path%%project_name%
echo 删除不必要文件及配置
del /q %be_pub_path%%project_name%\app*.json
del /q %be_pub_path%%project_name%\log*.config
del /q %be_pub_path%%project_name%\*.pdb
if %build_type%==2 (
echo 增量模式
echo 删除旧文件
echo 遍历指定路径(包括子目录)下的所有文件,查找最后修改日期在当前日期之前30天的文件,并将这些文件删除 (删文件)
forfiles /p %be_pub_path%%project_name% /s /d -30 /c "cmd /c del @path /q /f"
echo 删目录
for /F "delims=" %%a in ('dir /ad /b /s "%be_pub_path%%project_name%\"^|sort /r') do (
rd "%%a">nul 2>nul &&echo 删除空目录"%%a"
)
)
echo 压缩文件
"%compress_tool%" a "%be_pub_path%%project_name%.zip" "%be_pub_path%%project_name%" -r
if %ERRORLEVEL% neq 0 (
echo 命令失败,错误代码是 %ERRORLEVEL%
exit /b %ERRORLEVEL%
pause
)
echo 命令成功完成
pause
explorer %be_pub_path%
echo 退出当前的批处理脚本
exit
:dotnetbuildauth
call :buildbe PDW.Micro.Auth.API PDW.Micro.Auth.API
explorer %be_pub_path%PDW.Micro.Auth.API
goto end
:dotnetbuildvimall
echo 开始调用子模块
call :buildbe PDW.Micro.Vimall.API PDW.Micro.Vimall.API
explorer %be_pub_path%PDW.Micro.Vimall.API
goto end
@pause
exit
:end
goto choice_start
tools文件夹里面包含这几个东西 主要是7za.exe 用来压缩文件,还有就是几个服务注册 重启的脚本,可以在线上执行。
service_install.bat
@echo off
set cur_path=%~dp0
cd /d %cur_path%
for /f %%a in ("%cd%") do set "service_name=%%~nxa"
if exist %cur_path%%service_name%.exe (
echo install %service_name%
sc create %service_name% binPath="%cur_path%%service_name%.exe" start="auto"
echo start %service_name%
sc start %service_name%
) else (
echo %service_name%.exe NOT found in %cur_path%
)
@pause
service_start.bat
@echo off
set cur_path=%~dp0
cd /d %cur_path%
for /f %%a in ("%cd%") do set "service_name=%%~nxa"
echo sc start %service_name%
sc start %service_name%
@pause
service_stop.bat
@echo off
set cur_path=%~dp0
cd /d %cur_path%
for /f %%a in ("%cd%") do set "service_name=%%~nxa"
echo sc stop %service_name%
sc stop %service_name%
@pause
大概就是如下几部:
1.获取路径、获取编译的项目地址、获取压缩的工具路径
2.选择打包方式 最好还有一些打包的前准备 比如SVN的更新 版本获取
3. 打包项目 核心就是 在项目目录下 执行 dotnet publish -p:VersionPrefix=1.0.0 -c Release -r win-x64 --no-self-contained -o %be_pub_path%%project_name% 但是之前 要删除之前发布的文件夹以及文件等等
4. 复制服务 执行脚本,有注册服务、启动服务、停止服务、卸载服务
5.删除一些配置文件 比如 .json、.config 等等 不需要每次都发布的
6.压缩 将发布的文件打包
7.展示打包好的文件目录 打包完
经过上面的bat文件执行,就可以将我们的项目打包成压缩文件了,在日常开发中时长发布的时候可以节约很多的时间。
打包好了压缩文件包之后,后续将压缩包拷贝到服务器上,然后运行我们的 publish.exe
在项目的根目录执行,就将压缩包内容压缩到对应的项目之中,然后重启服务,备份之前的项目文件,删除文件包一气合成。
publish.exe 大致的代码如下:
var curDir = Directory.GetCurrentDirectory();
string[] files = Directory.GetFiles(curDir, "*.zip");
var printHelp = () =>
{
Console.WriteLine("\n\n");
Console.WriteLine("使用方法: 双击运行, 会自动处理当前目录下的所有zip包。");
Console.WriteLine("\n\n");
};
if (files == null || files.Length == 0)
{
Console.WriteLine("当前目录未发现*.zip文件, 不需要发布");
printHelp();
Console.ReadLine();
return;
}
foreach (string file in files)
{
var fileInfo = new FileInfo(file);
var appName = Path.GetFileNameWithoutExtension(fileInfo.FullName);
Console.WriteLine($"\n\n--> 发布{appName}\n\n");
if (!File.Exists(Path.Combine(curDir, "nobackup")))
{
var backPath = Path.Combine(curDir, "../backup");
if (!Directory.Exists(backPath))
{
Directory.CreateDirectory(backPath);
}
var pubPath = Path.Combine(curDir, appName);
if (Directory.Exists(pubPath))
{
Console.WriteLine($"备份{file}");
ZipFile.CreateFromDirectory(pubPath, Path.Combine(backPath, $"{appName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.zip"), CompressionLevel.Fastest, true);
}
}
else
{
Console.WriteLine($"存在nobackup文件, 不备份{appName}");
}
// 前端项目直接解压
if (file.ToLower().Contains("app-"))
{
Console.WriteLine($"解压{fileInfo.Name}");
ZipFile.ExtractToDirectory(file, curDir, true);
} else
{
// 停止服务
Console.WriteLine($"停止服务{appName}");
var process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = false;
process.Start();
process.StandardInput.WriteLine($"sc stop {appName} & exit");
process.WaitForExit();
process.Close();
Thread.Sleep(500);
Console.WriteLine($"解压{fileInfo.Name}");
ZipFile.ExtractToDirectory(file, curDir, true);
Console.WriteLine($"启动服务{appName}");
process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = false;
process.Start();
process.StandardInput.WriteLine($"sc start {appName} & exit");
process.WaitForExit();
process.Close();
}
if (File.Exists(Path.Combine(curDir, "nodelete")))
{
Console.WriteLine($"存在nodelete, 不删除发布包{appName}, 需手工删除");
}
else
{
Console.WriteLine($"删除发布包{file}");
File.Delete(file);
}
}
Console.WriteLine("\n发布完成");
Console.ReadLine();
这一套发布解决方案,只要调式通了就可以节省很多发布打包的时间,实现一劳永逸。前端后端同步程序服务都可以使用其编译,觉得很不错。
标签:name%,cur,Windows,pub,echo,process,7.0,exe,path% From: https://www.cnblogs.com/yunsos/p/18363282