自动化 NuGet 包打包与上传:完整批处理脚本详解(含 SVN 支持)

在大型项目中,我们常常需要定期打包多个 .csproj 项目为 NuGet 包,并上传到私有 NuGet 服务。这篇文章分享一份实战脚本,支持以下自动化流程:

  • 自动读取、更新 .csproj 文件中的 VersionPackageOutputPath 等节点;

  • 自动构建并打包为 .nupkg

  • 自动上传至私有 NuGet 源;

  • 支持 SVN 更新与提交;

  • 支持中文路径,日志分离记录成功与失败信息。

✅ 功能概览

功能点

说明

自动更新版本号

根据日期自动生成版本号,并支持手动输入

修改 .csproj

自动注入 VersionDescriptionPackageOutputPath 等必要节点

打包 NuGet

使用 dotnet pack 命令完成打包

上传 NuGet

自动上传所有打包成功的 .nupkg 包至私有源

SVN 支持

自动执行 SVN 更新并提交修改

日志清晰分离

success_log.txterror_log.txtsvn_commit_list.txt 等日志文件帮助排查问题


📦 脚本内容

以下是完整的批处理脚本代码,推荐将其保存为 auto_push_nuget.bat

@echo off
REM 切换到 UTF-8 编码,支持中文路径
chcp 65001 >nul
setlocal EnableDelayedExpansion
echo ===== Auto push nuget started =====REM ---------------- 配置区 ----------------
set "NUGET_SOURCE=你的私有nuget服务器"
set "API_KEY=私有nuget服务器的key,没有填空"
set "SUCCESS_LOG=success_log.txt"
set "ERROR_LOG=error_log.txt"
set "SVN_COMMIT_LIST=svn_commit_list.txt"
set "TEMP_LOG=temp_ps_output.txt"
set "SVN_UPDATE_TEMP=svn_update_temp.txt"
set SUCCESS_COUNT=0
set FAIL_COUNT=0
REM -----------------------------------------

⚙️ 脚本前置说明:

  • 脚本自动将当前控制台设置为 UTF-8,确保支持中文路径和日志输出;

  • 所有日志均分离输出到文件中,避免控制台信息混乱。

🎯 项目路径配置

修改以下部分,添加你要打包的 .csproj 路径(相对路径):

注意:索引数与COUNT一致

:: 定义项目路径数组
set "PROJECT_PATHS[0]=Xxx.BI.WebSite.Core\Xxx.BI.WebSite.Core.csproj"
set "PROJECT_PATHS[1]=Xxx.BI.WebSite.RazorWeb\Xxx.BI.WebSite.RazorWeb.csproj"
set "PROJECT_COUNT=2"

根据你的项目实际路径修改 PROJECT_PATHS,添加你希望打包的工程列表。

⚠️ 注意:这里的路径请填写 相对于脚本所在目录的路径,不要写绝对路径。如下图

版本号格式为:
6{YY}.{MM}.{DD}.{X},其中 X 是递增的补丁号。

例如:624.05.14.2

for /f "tokens=1-3 delims=/" %%a in ('powershell -command "Get-Date -Format 'yyyy/MM/dd'"') do (set YYYY=%%aset MM=%%bset DD=%%c
)
set YY=!YYYY:~2,2!
set /a M=1!MM! - 100
set /a D=1!DD! - 100
set VERSION_PREFIX=6!YY!.!M!.!D!

🔧 修改 .csproj 文件

使用 PowerShell 对 XML 进行修改,确保插入以下节点:

  • <Version>:自动计算或用户输入;

  • <Description>:设置描述;

  • <PackageOutputPath>:统一输出至 ..\..\..\nupkgs

  • <GeneratePackageOnBuild>:确保打包时包含所有内容。

$pg = $xml.Project.PropertyGroup | Where-Object { $_.Condition -eq $null -or $_.Condition -eq '' } | Select-Object -First 1;
if (-not $pg) { $pg = $xml.CreateElement('PropertyGroup'); $xml.Project.AppendChild($pg) | Out-Null };
# 后续注入节点逻辑...

🏗️ 构建与打包

dotnet build "!CSProjPath!" -c Release
dotnet pack "!CSProjPath!" -c Release --output "%~dp0nupkgs"

脚本会在 nupkgs 文件夹生成对应 .nupkg 文件。

☁️ 自动上传 NuGet 包

所有成功打包的路径会记录到 success_log.txt,随后逐个推送:

如果没有API-KEY,请删除 --api-key "%API_KEY%"

dotnet nuget push "!NUPKG_PATH!" --source "%NUGET_SOURCE%" --api-key "%API_KEY%"

🧾 SVN 自动化支持

  • 支持脚本运行前执行 svn update

  • 成功处理的项目会记录在 svn_commit_list.txt

  • 最后统一执行 svn commit 自动提交版本号更新:

svn commit "项目路径" -m "Auto update Version to 624.05.14.1"

🧠 SVN 提交

每次成功修改 .csproj 后,记录在列表文件 svn_commit_list.txt 中,最终一并执行 SVN 提交:

svn commit "项目路径" -m "Auto update Version to 6xx.xx.xx.x"

📜 附录:完整批处理脚本源码

@echo off
REM 切换到 UTF-8 编码,支持中文路径
chcp 65001 >nul
setlocal EnableDelayedExpansion
echo ===== Auto push nuget started =====
REM ---------------- 配置区 ----------------
set "NUGET_SOURCE=你的私有nuget服务器"
set "API_KEY=私有nuget服务器key"
set "SUCCESS_LOG=success_log.txt"
set "ERROR_LOG=error_log.txt"
set "SVN_COMMIT_LIST=svn_commit_list.txt"
set "TEMP_LOG=temp_ps_output.txt"
set "SVN_UPDATE_TEMP=svn_update_temp.txt"::成功/失败条数
set SUCCESS_COUNT=0
set FAIL_COUNT=0
REM 注意:建议检查服务器是否支持 HTTPS,例如 https://www.baidu.com:8888
REM -----------------------------------------:: 清空日志和 SVN 提交列表
if exist "%SUCCESS_LOG%" del "%SUCCESS_LOG%"
if exist "%ERROR_LOG%" del "%ERROR_LOG%"
if exist "%SVN_COMMIT_LIST%" del "%SVN_COMMIT_LIST%"
if exist "%TEMP_LOG%" del "%TEMP_LOG%"
if exist "%SVN_UPDATE_TEMP%" del "%SVN_UPDATE_TEMP%":: 清理 SVN_DIR,确保无换行符或多余字符
set "SVN_DIR=%~dp0"
:: 去掉末尾反斜杠
if "!SVN_DIR:~-1!"=="\" set "SVN_DIR=!SVN_DIR:~0,-1!"
:: 规范化路径
for %%P in ("!SVN_DIR!") do set "SVN_DIR=%%~fP"
echo [Debug] SVN directory: !SVN_DIR! >> "%SUCCESS_LOG%":: 执行 SVN 更新
echo [Info] Updating SVN working copy for directory: !SVN_DIR! >> "%SUCCESS_LOG%"
echo [Info] Updating SVN working copy...
svn update "!SVN_DIR!" > "%SVN_UPDATE_TEMP%" 2>&1
if errorlevel 1 (echo [Error] Failed to update SVN working copy. >> "%ERROR_LOG%"echo [Error] Failed to update SVN working copy. Error details:type "%SVN_UPDATE_TEMP%"echo [Error] Script will exit. >> "%ERROR_LOG%"echo [Error] Script will exit.del "%SVN_UPDATE_TEMP%"exit /b 1
) else (echo [Success] SVN working copy updated successfully. >> "%SUCCESS_LOG%"echo [Success] SVN working copy updated successfully.del "%SVN_UPDATE_TEMP%"
):: 获取当前日期作为版本前缀(6 + 年后两位 + 月 + 日)
for /f "tokens=1-3 delims=/" %%a in ('powershell -command "Get-Date -Format 'yyyy/MM/dd'"') do (set YYYY=%%aset MM=%%bset DD=%%c
)
set YY=!YYYY:~2,2!
set /a M=1!MM! - 100
set /a D=1!DD! - 100
set VERSION_PREFIX=6!YY!.!M!.!D!
echo [Debug] VERSION_PREFIX: !VERSION_PREFIX! >> "%SUCCESS_LOG%":: 定义项目路径数组
::注意:PROJECT_PATHS[X]=实际条数(X),COUNT=实际条数
:: 这里的路径规则,请录入相对路径,就是你的BAT所在文件夹以后的路径
set "PROJECT_PATHS[0]=Xxx.BI.WebSite.Core\Xxx.BI.WebSite.Core.csproj"
set "PROJECT_PATHS[1]=Xxx.BI.WebSite.RazorWeb\Xxx.BI.WebSite.RazorWeb.csproj"
set "PROJECT_COUNT=2":: 循环处理数组中的相对路径
for /l %%i in (0,1,%PROJECT_COUNT%-1) do (set "RELATIVE_PATH=!PROJECT_PATHS[%%i]!"if not "!RELATIVE_PATH!"=="" (echo [Info] Reading relative path: !RELATIVE_PATH! >> "%SUCCESS_LOG%"call :ProcessProject "!RELATIVE_PATH!")
)REM 统一 NuGet 包上传
echo.
echo ===== Pushing NuGet packages =====
echo ===== Pushing NuGet packages ===== >> "%SUCCESS_LOG%"
echo ===== Pushing NuGet packages ===== >> "%ERROR_LOG%"
set "FOUND_NUPKG=0"
if exist "%SUCCESS_LOG%" (for /f "tokens=1,* delims=:" %%a in ('findstr /B "\[Success\] Pack succeeded:" "%SUCCESS_LOG%"') do (set "NUPKG_PATH=%%b"REM 去除首尾空格并规范化路径for /f "tokens=*" %%c in ("!NUPKG_PATH!") do (set "NUPKG_PATH=%%~fc")if "!NUPKG_PATH!"=="" (echo [Warning] Skipping empty NUPKG_PATH >> "%ERROR_LOG%"echo [Warning] Skipping empty NUPKG_PATH) else (echo [Debug] Checking NuGet package: !NUPKG_PATH! >> "%SUCCESS_LOG%"if exist "!NUPKG_PATH!" (set "FOUND_NUPKG=1"echo Pushing: !NUPKG_PATH!echo Pushing: !NUPKG_PATH! >> "%SUCCESS_LOG%"dotnet nuget push "!NUPKG_PATH!" --source "%NUGET_SOURCE%" --api-key "%API_KEY%" >> "%SUCCESS_LOG%" 2>> "%ERROR_LOG%"if errorlevel 1 (set /a FAIL_COUNT+=1echo [Error] Push failed: !NUPKG_PATH! >> "%ERROR_LOG%"echo [Error] Push failed: !NUPKG_PATH!) else (				set /a SUCCESS_COUNT+=1echo [Success] Push succeeded: !NUPKG_PATH! >> "%SUCCESS_LOG%"echo [Success] Push succeeded: !NUPKG_PATH! )) else (set /a FAIL_COUNT+=1echo [Error] NuGet package not found during push: !NUPKG_PATH! >> "%ERROR_LOG%"echo [Error] NuGet package not found during push: !NUPKG_PATH!)))
)
if "!FOUND_NUPKG!"=="0" (echo [Warning] No successful NuGet packages found to push >> "%ERROR_LOG%"echo [Warning] No successful NuGet packages found to push
)REM 统一 SVN 提交
if exist "%SVN_COMMIT_LIST%" (echo.echo ===== Committing to SVN =====echo ===== Committing to SVN ===== >> "%SUCCESS_LOG%"echo ===== Committing to SVN ===== >> "%ERROR_LOG%"for /f "tokens=1,2 delims=;" %%a in (%SVN_COMMIT_LIST%) do (echo Committing: %%aecho Committing: %%a >> "%SUCCESS_LOG%"svn commit "%%a" -m "Auto update Version to %%b" >> "%SUCCESS_LOG%" 2>&1if errorlevel 1 (echo [Error] SVN commit failed: %%a >> "%ERROR_LOG%"echo [Error] SVN commit failed: %%a >> "%SUCCESS_LOG%"echo [Error] SVN commit failed: %%a) else (echo [Success] SVN commit succeeded: %%a >> "%SUCCESS_LOG%"echo [Success] SVN commit successed: %%a))del "%SVN_COMMIT_LIST%"
)echo. >> "%SUCCESS_LOG%"
echo ===== All tasks completed ===== >> "%SUCCESS_LOG%"
echo. >> "%ERROR_LOG%"
echo ===== All tasks completed ===== >> "%ERROR_LOG%"
echo.
echo ===== All tasks completed =====
echo Success log: %SUCCESS_LOG%
echo Error log: %ERROR_LOG%
echo Nuget push successed : %SUCCESS_COUNT%
echo Nuget push error: %FAIL_COUNT%
del "%ERROR_LOG%"
del "%SUCCESS_LOG%"
if exist "%SVN_UPDATE_TEMP%" del "%SVN_UPDATE_TEMP%"
pauseecho ===== Auto push nuget ended =====
endlocal
exit /b 0:ProcessProject
set "RELATIVE_PATH=%~1"
echo [Info] Processing relative path: %RELATIVE_PATH% >> "%SUCCESS_LOG%"REM 移除相对路径的前导 \(如果存在)
set "CLEAN_PATH=%RELATIVE_PATH%"
if "!CLEAN_PATH:~0,1!"=="\" set "CLEAN_PATH=!CLEAN_PATH:~1!"
echo [Debug] CLEAN_PATH: !CLEAN_PATH! >> "%SUCCESS_LOG%"REM 使用 pushd 切换到脚本目录
pushd "%~dp0"
echo [Debug] Current directory after pushd: %CD% >> "%SUCCESS_LOG%"REM 拼接完整路径
set "CSProjPath=%CD%\!CLEAN_PATH!"
REM 规范化路径
for %%P in ("!CSProjPath!") do set "CSProjPath=%%~fP"
echo [Info] Full .csproj path: !CSProjPath! >> "%SUCCESS_LOG%"REM 验证 .csproj 文件存在
if not exist "!CSProjPath!" (echo [Warning] File not found: !CSProjPath! >> "%ERROR_LOG%"echo [Warning] File not found: !CSProjPath!popdexit /b 0
)REM 恢复原始目录
popd
echo [Debug] Directory restored: %CD% >> "%SUCCESS_LOG%"echo.
echo ===== Processing: !CSProjPath! =====
echo ===== Processing: !CSProjPath! ===== >> "%SUCCESS_LOG%"REM —— 清空上次遗留的变量 ——
set "OLD_VERSION="
set "LAST_PART="REM —— 1) 读取 csproj 中已有的 Version —— 
powershell -NoProfile -Command ^"try { [xml]$x = Get-Content -Path '!CSProjPath!' -Encoding UTF8 -ErrorAction Stop; $version = $x.Project.PropertyGroup | Where-Object { $_.Version -and ($_.Condition -eq $null -or $_.Condition -eq '') } | Select-Object -ExpandProperty Version -First 1; if ($version) { $version.Trim() } else { '' } } catch { Write-Output 'ERROR: ' + $_.Exception.Message; exit 1 }" > "%TEMP_LOG%"
if errorlevel 1 (echo [Error] Failed to read Version from !CSProjPath! >> "%ERROR_LOG%"echo [Error] Failed to read Version from !CSProjPath!type "%TEMP_LOG%" >> "%ERROR_LOG%"popdexit /b 1
)
for /f "delims=" %%v in (%TEMP_LOG%) do (set "OLD_VERSION=%%v"
)
echo [Debug] OLD_VERSION: !OLD_VERSION! >> "%SUCCESS_LOG%"
del "%TEMP_LOG%"REM —— 2) 基于 OLD_VERSION 计算新的 LAST_PART ——
set "LAST_PART=1"
if defined OLD_VERSION (REM 检查 OLD_VERSION 是否包含错误if not "!OLD_VERSION!"=="!OLD_VERSION:ERROR:=!" (echo [Warning] Invalid OLD_VERSION: !OLD_VERSION! >> "%ERROR_LOG%"echo [Warning] Invalid OLD_VERSION: !OLD_VERSION!set "OLD_VERSION=") else (REM 清理 OLD_VERSION 中的空格set "OLD_VERSION=!OLD_VERSION: =!"echo [Debug] Cleaned OLD_VERSION: !OLD_VERSION! >> "%SUCCESS_LOG%"for /f "tokens=1-4 delims=." %%a in ("!OLD_VERSION!") do (set "OLD_PREFIX=%%a.%%b.%%c"echo [Debug] OLD_PREFIX: !OLD_PREFIX!, VERSION_PREFIX: !VERSION_PREFIX! >> "%SUCCESS_LOG%"if "!OLD_PREFIX!"=="!VERSION_PREFIX!" (set /a LAST_PART=%%d + 1echo [Debug] LAST_PART: !LAST_PART! >> "%SUCCESS_LOG%")))
)echo [Info] version number generation in progress...
echo [Info] recommend version: !VERSION_PREFIX!.!LAST_PART! ,Enter use this version or input new version:
set /p USER_VER=if defined USER_VER (set "CUSTOM_VERSION=!USER_VER!"
)if defined CUSTOM_VERSION (set "NEW_VERSION=!CUSTOM_VERSION!"
) else (set "NEW_VERSION=!VERSION_PREFIX!.!LAST_PART!"
)echo [Info] NEW_VERSION = !NEW_VERSION! >> "%SUCCESS_LOG%"
echo [Info] NEW_VERSION = !NEW_VERSION!
echo [Info] version number generation completed...REM —— 3) 使用 PowerShell 注入并**覆盖**所有必要节点 —— 
echo [Info] modify the csproj file...
set NEW_VERSION=!NEW_VERSION!
powershell -NoProfile -Command ^"$path = '!CSProjPath!';" ^"try { [xml]$xml = Get-Content -Path $path -Encoding UTF8 -Raw -ErrorAction Stop; $pg = $xml.Project.PropertyGroup | Where-Object { $_.Condition -eq $null -or $_.Condition -eq '' } | Select-Object -First 1; if (-not $pg) { $pg = $xml.CreateElement('PropertyGroup'); $xml.Project.AppendChild($pg) | Out-Null }; $vn = $pg.SelectSingleNode('Version'); if (-not $vn) { $vn = $xml.CreateElement('Version'); $pg.AppendChild($vn) | Out-Null }; $vn.InnerText = $env:NEW_VERSION; $desc = $pg.SelectSingleNode('Description'); if (-not $desc) { $desc = $xml.CreateElement('Description'); $pg.AppendChild($desc) | Out-Null }; $desc.InnerText = 'Automatically generate nuget packages'; $gpb = $pg.SelectSingleNode('GeneratePackageOnBuild'); if (-not $gpb) { $gpb = $xml.CreateElement('GeneratePackageOnBuild'); $gpb.InnerText = 'true'; $pg.AppendChild($gpb) | Out-Null }; $pop = $pg.SelectSingleNode('PackageOutputPath'); if (-not $pop) { $pop = $xml.CreateElement('PackageOutputPath'); $pg.AppendChild($pop) | Out-Null }; $pop.InnerText = '..\\..\\..\\nupkgs'; $sw = New-Object System.IO.StreamWriter($path, $false, (New-Object System.Text.UTF8Encoding $true)); $xml.Save($sw); $sw.Close(); Write-Output 'PS_INJECTION_SUCCESS'; } catch { Write-Output 'ERROR: ' + $_.Exception.Message; exit 1 }" > "%TEMP_LOG%"findstr "PS_INJECTION_SUCCESS" "%TEMP_LOG%" >nul
if errorlevel 1 (echo [Error] XML injection failed: !CSProjPath! >> "%ERROR_LOG%"echo [Error] XML injection failed: !CSProjPath!type "%TEMP_LOG%" >> "%ERROR_LOG%"exit /b 1
) else (echo [Success] modify successed
)
echo [Info] modify the csproj file...REM —— 验证 Version 节点 —— 
powershell -NoProfile -Command ^"try { [xml]$x = Get-Content -Path '!CSProjPath!' -Encoding UTF8 -ErrorAction Stop; $version = $x.Project.PropertyGroup | Where-Object { $_.Version -and ($_.Condition -eq $null -or $_.Condition -eq '') } | Select-Object -ExpandProperty Version -First 1; if ($version) { $version.Trim() } else { '' } } catch { Write-Output 'ERROR: ' + $_.Exception.Message; exit 1 }" > "%TEMP_LOG%"
if errorlevel 1 (echo [Error] Failed to verify Version in !CSProjPath! >> "%ERROR_LOG%"echo [Error] Failed to verify Version in !CSProjPath!type "%TEMP_LOG%" >> "%ERROR_LOG%"exit /b 1
)
for /f "delims=" %%v in (%TEMP_LOG%) do (set "VERIFIED_VERSION=%%v"
)
echo [Debug] Version after injection: !VERIFIED_VERSION! >> "%SUCCESS_LOG%"
if not "!VERIFIED_VERSION!"=="!NEW_VERSION!" (echo [Error] Version node not updated to !NEW_VERSION!, found !VERIFIED_VERSION! >> "%ERROR_LOG%"echo [Error] Version node not updated to !NEW_VERSION!, found !VERIFIED_VERSION!exit /b 1
)REM —— 4) 构建 —— 
echo [Info] building csproj...
dotnet build "!CSProjPath!" -c Release >> "%SUCCESS_LOG%" 2>> "%ERROR_LOG%"
if errorlevel 1 (echo [Error] Build failed: !CSProjPath! >> "%ERROR_LOG%"echo [Error] Build failed: !CSProjPath!exit /b 1
) else (echo [Success] build successed
)
echo [Info] end of csproj construction...REM —— 5) 打包 —— 
echo [Info] package in csproj...
if not exist "%~dp0nupkgs" mkdir "%~dp0nupkgs"
dotnet pack "!CSProjPath!" -c Release --output "%~dp0nupkgs" -p:Description="Automatically generate nuget packages" >> "%SUCCESS_LOG%" 2>> "%ERROR_LOG%"
if errorlevel 1 (echo [Error] Pack failed: !CSProjPath! >> "%ERROR_LOG%"echo [Error] Pack failed: !CSProjPath!exit /b 1
) else (echo [Success] pack successed
)
REM 记录成功打包的 .nupkg 文件
for %%P in ("%~dp0nupkgs\%~n1.!NEW_VERSION!.nupkg") do (if exist "%%P" (echo [Success] Pack succeeded: %%P >> "%SUCCESS_LOG%"echo [Success] Pack succeeded: %%P) else (echo [Error] Pack file not found: %%P >> "%ERROR_LOG%"echo [Error] Pack file not found: %%Pexit /b 1)
)
echo [Info] end of packaging csproj...REM —— 6) 记录 SVN 提交 —— 
echo !CSProjPath!;!NEW_VERSION!>> "%SVN_COMMIT_LIST%"del "%TEMP_LOG%"
exit /b 0

✅ 建议将脚本保存为 auto_push_nuget.bat,每次发布时双击运行即可。

📁 目录结构推荐

/你的解决方案根目录
│
├─ auto_push_nuget.bat
├─ nupkgs/
├─ success_log.txt
├─ error_log.txt
├─ svn_commit_list.txt

📌 注意事项

  • 建议手动验证 .csproj 路径是否正确;

  • 确保 svn 命令行工具已正确安装;

  • dotnet SDK 和私有 NuGet 源地址需提前配置;

  • 每次运行脚本前,请使用最新版源码(SVN update);

  • 批处理脚本推荐使用 Windows PowerShell 5+ 和 Windows Terminal。


🎉 效果展示

成功输出如下所示:

[Success] build successed
[Success] pack successed
Pushing: Xxx.BI.WebSite.Core.624.05.14.1.nupkg
[Success] Push succeeded: Xxx.BI.WebSite.Core.624.05.14.1.nupkg
Committing: Xxx.BI.WebSite.Core.csproj
[Success] SVN commit succeeded: Xxx.BI.WebSite.Core.csproj

🧩 最后

本脚本适合用于 CI/CD 之外的 本地开发辅助打包上传工具。你可以结合 gitJenkinsTeamCity 等系统,将其进一步整合为流水线任务。

如果你有类似自动化构建打包需求,欢迎参考本脚本并结合你项目的实际路径进行修改和优化。


如需该脚本的 .bat 文件,可留言或私信获取完整代码包。

如果你觉得这篇文章对你有帮助,欢迎 👍 点赞 / ⭐ 收藏 / 📝 留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷leetcodehot100返航版--双指针5/16

for (int i 0, j 0; i < n; i ) { while (j < i && check(i, j)) j ; // 具体问题的逻辑 } 常见问题分类&#xff1a; (1) 对于一个序列&#xff0c;用两个指针维护一段区间 (2) 对于两个序列&#xff0c;维护某种次序&#xff0c;比如归并排序中…

手撕四种常用设计模式(工厂,策略,代理,单例)

工厂模式 一、工厂模式的总体好处 解耦&#xff1a;客户端与具体实现类解耦&#xff0c;符合“开闭原则”。统一创建&#xff1a;对象创建交由工厂处理&#xff0c;便于集中控制。增强可维护性&#xff1a;新增对象种类时不需要大改动调用代码。便于扩展&#xff1a;易于管理…

阿里通义万相 Wan2.1-VACE:开启视频创作新境界

2025 年 5 月 14 日&#xff0c;阿里巴巴为视频创作领域带来了重磅惊喜 —— 开源通义万相 Wan2.1-VACE。这一模型堪称视频生成与编辑领域的集大成者&#xff0c;凭借其全面且强大的功能&#xff0c;为广大创作者、开发者以及企业用户开辟了全新的视频创作天地。它打破了以往视…

自定义类、元组、字典和结构体对比——AutoCAD C# 开发中建立不同对象之间的联系

以下是对它们的详细分析和对比&#xff1a; 1. 自定义类&#xff08;Class&#xff09; 优势 封装性强&#xff1a;可以定义字段、属性、方法和事件&#xff0c;实现复杂的行为和逻辑。继承与多态&#xff1a;支持继承体系&#xff0c;可通过接口或抽象类实现多态。引用类型…

MVC架构模式

mvc架构是一种常见的开发模式,以下是三个核心部分 Model&#xff08;模型&#xff09;&#xff1a;负责应用程序的数据和业务逻辑。它与数据库交互&#xff0c;处理数据的存储、检索和更新&#xff0c;是应用程序的核心业务所在。View&#xff08;视图&#xff09;&#xff1a…

Python实例题:Python百行制作登陆系统

目录 Python实例题 题目 python-login-systemPython 百行登录系统脚本 代码解释 用户数据库&#xff1a; 注册功能&#xff1a; 登录功能&#xff1a; 主程序&#xff1a; 运行思路 注意事项 Python实例题 题目 Python百行制作登陆系统 python-login-systemPython…

uniapp使用全局组件,

在 Uniapp 中&#xff0c;如果你的组件是应用层组件&#xff08;例如全局悬浮按钮、全局通知栏等&#xff09;&#xff0c;并且希望它自动出现在所有页面而无需在每个页面模板中手动添加组件标签&#xff0c;可以通过以下两种方案实现&#xff1a; 方案一&#xff1a;通过 app.…

(8)python开发经验

文章目录 1 下载python2 pip安装依赖无法访问3 系统支持4 下载python文档5 设置虚拟环境6 编译安装python 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 下载python 下载地址尽量不要下载最新版…

【原创】基于视觉大模型gemma-3-4b实现短视频自动识别内容并生成解说文案

&#x1f4e6; 一、整体功能定位 这是一个用于从原始视频自动生成短视频解说内容的自动化工具&#xff0c;包含&#xff1a; 视频抽帧&#xff08;可基于画面变化提取关键帧&#xff09; 多模态图像识别&#xff08;每帧图片理解&#xff09; 文案生成&#xff08;大模型生成…

每日算法刷题计划Day5 5.13:leetcode数组3道题,用时1h

11. 26. 删除有序数组中的重复项(简单&#xff0c;双指针) 26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 思想: 1.我的思想: 双指针遍历集合储存已有元素 2.官方思想&#xff1a; 题目条件有序数组删除重复元素&#xff0c;所以重复元素都是连续存在…

Transformer 架构在目标检测中的应用:YOLO 系列模型解析

目录 Transformer 架构在目标检测中的应用&#xff1a;YOLO 系列模型解析 一、YOLO 模型概述 二、YOLO 模型的核心架构 &#xff08;一&#xff09;主干网络 &#xff08;二&#xff09;颈部结构 &#xff08;三&#xff09;头部结构 三、YOLO 模型的工作原理 &#xf…

一个完整的项目示例:taro开发微信小程序

前一周完成了一个项目&#xff0c;体测成绩转换的工具&#xff0c;没做记录&#xff0c;。这次计划开发一个地图应用小程序&#xff0c;记录一下。方便给使用的人。 一、申请微信小程序&#xff0c;填写相应的信息&#xff0c;取得开发者ID。这个要给腾讯地图使用的。 二、申…

动态规划-LCR 166.珠宝的最大价值-力扣(LeetCode)

一、题目解析 frame二维矩阵中每个值代表珠宝的价值&#xff0c;现在从左上角开始拿珠宝&#xff0c;只能向右或向下拿珠宝&#xff0c;到达右下角时停止拿珠宝&#xff0c;要求拿的珠宝价值最大。 二、算法解析 1.状态表示 我们想要知道的是到达[i,j]为位置时的最大价值&am…

安装nerdctl和buildkitd脚本命令

#!/bin/bash set -euo pipefail # 检查是否以root权限运行 if [ "$(id -u)" -ne 0 ]; then echo "错误&#xff1a;请使用root权限或sudo运行本脚本" >&2 exit 1 fi # 检测openEuler系统&#xff08;兼容大小写&#xff09; detect_distrib…

实现视频分片上传 OSS

访问 OSS 有两种方式&#xff0c;本文用到的是使用临时访问凭证上传到 OSS&#xff0c;不同语言版本的代码参考&#xff1a; 使用STS临时访问凭证访问OSS_对象存储(OSS)-阿里云帮助中心 1.安装并使用 首先我们要安装 OSS&#xff1a; npm install ali-oss --save 接着我们…

动态规划(3)学习方法论:构建思维模型

引言 动态规划是算法领域中一个强大而优雅的解题方法,但对于许多学习者来说,它也是最难以掌握的算法范式之一。与贪心算法或分治法等直观的算法相比,动态规划往往需要更抽象的思维和更系统的学习方法。在前两篇文章中,我们介绍了动态规划的基础概念、原理以及问题建模与状…

elementplus el-tree 二次封装支持配置删除后展示展开或折叠编辑复选框懒加载功能

本文介绍了基于 ElementPlus 的 el-tree 组件进行二次封装的 TreeView 组件&#xff0c;使用 Vue3 和 JavaScript 实现。TreeView 组件通过 props 接收树形数据、配置项等&#xff0c;支持懒加载、节点展开/收起、节点点击、删除、编辑等操作。组件内部通过 ref 管理树实例&…

2025年渗透测试面试题总结-安恒[实习]安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 安恒[实习]安全工程师 一面 1. 自我介绍 2. 前两段实习做了些什么 3. 中等难度的算法题 4. Java的C…

网络编程中的直接内存与零拷贝

本篇文章会介绍 JDK 与 Linux 网络编程中的直接内存与零拷贝的相关知识&#xff0c;最后还会介绍一下 Linux 系统与 JDK 对网络通信的实现。 1、直接内存 所有的网络通信和应用程序中&#xff08;任何语言&#xff09;&#xff0c;每个 TCP Socket 的内核中都有一个发送缓冲区…

TransmittableThreadLocal使用场景

&#x1f680; 为什么要用 TransmittableThreadLocal&#xff1f;一文读懂线程上下文传递问题 在 Java Web 开发中&#xff0c;我们经常用 ThreadLocal 来保存每个请求的用户信息&#xff0c;例如 userId。但当我们使用线程池或异步方法&#xff08;如 Async&#xff09;时&am…