首页 > 系统相关 >记net 7.0 使用Windows 批处理 和exe 程序的快速打包 更新

记net 7.0 使用Windows 批处理 和exe 程序的快速打包 更新

时间:2024-08-16 17:51:18浏览次数:11  
标签:name% cur Windows pub echo process 7.0 exe path%

  如图,项目路径,我们使用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

相关文章

  • 获取Windows个性化中自带的聚焦锁屏
    想要保存登录屏幕(锁屏界面)的背景图片,可以通过以下脚本一键获取:@echooffsetlocalenabledelayedexpansion::WindowsSpotlight锁屏图片资源地址set"sourcePath=%localappdata%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets"::......
  • 20240326 windows搭建k8s环境
    windows搭建k8s环境安装docker-desktop在界面中找到/设置/Resources/Advanced/Diskimagelocation,选择一个非C盘的目录利用minikube安装已经安装玩docker-desktop或者virtualbox参考文档minikube官方文档https://www.cnblogs.com/yumingkuan/p/16750618.htmlhttps://......
  • 20240110 windows安装make工具
    从https://sourceforge.net/projects/mingw/下载文件并安装安装后打开MinGW,依次选择如下3个红框的包,右键“Markforinstallation”勾选需要安装的包后,执行“installation/ApplyChanges”将c:\MinGW\bin\ming32-make.exe重命名为c:\MinGW\bin\make.exe将MinGW的......
  • 同一台电脑127.0.0.1监听了80端口,我还可以用本机127.0.0.1的80端口做为源端口访问本机
    同一台电脑127.0.0.1监听了80端口,我还可以用本机127.0.0.1的80端口做为源端口访问本机127.0.0.1的监听的目的端口80端口吗 2024-08-1616:00:05在同一台电脑上,不能使用127.0.0.1的80端口作为源端口来访问127.0.0.1的80端口。原因如下:源端口和目标端口的不同:......
  • Windows过滤平台(WFP)
    1.Windows动程序与Windows过滤平台(WFP)深度解析在Windows操作系统的核心架构中,驱动程序和网络过滤机制扮演着至关重要的角色。本文将深入探讨Windows驱动程序,特别是与网络相关的驱动程序,以及Windows过滤平台(WindowsFilteringPlatform,WFP)的工作原理、应用场景和开发......
  • windows ndis 详解
    1.WindowsNDIS详细讲解网络驱动程序接口规范(NetworkDriverInterfaceSpecification,NDIS)是MicrosoftWindows操作系统中的一个关键组件,它为网络硬件和协议之间提供了一个标准化的接口。本文将深入探讨NDIS的概念、结构、功能以及在现代网络通信中的重要性。1.NDIS简介......
  • 大文件怎么快速传?ToDesk全面支持安卓、ios、windows、mac
    远程办公要传大文件怎么办?小社长来教你一招快速完成文件传输......
  • 【C语言实现花屏效果并打包程序为exe可执行文件】
    说明:该程序为临摹改良(......
  • [Windows批处理]比对Git两个分支之间的差异,把有改动的文件复制到指定目录
    保存为git-diff-copy.bat@echooffREM[Windows批处理]比对Git两个分支之间的差异,把有改动的文件复制到指定目录setlocalenabledelayedexpansionREM1:设置被复制的git项目文件夹(尾部要加"\")setcopy_from=..\vue-vben-admin\REM2:设置复制的目标文件夹setcopy_to=%~dp0......
  • 解决Windows突然自动重启卡logo
    一般重启后或者卡logo我们需要查看日志进入后查看日志点击筛选当前日志输入eventlog找到重启的时间错误ID,记住这个事件ID我们再次点击筛选当前日志页面选择清除,点击确定然后我们找到关键的ID和时间这个时间点上面和下面查看一下错误的引起原因很显然这个......