自動化 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.pswp.cn/bicheng/81498.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81498.shtml
英文地址,請注明出處:http://en.pswp.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…