VS 基于git工程編譯版本自動添加版本號

目錄

概要

實現方案


概要

最近在用visual Studio 開發MFC項目時,需要在release版本編譯后的exe文件自動追加版本信息。

由于我們用的git工程管理,即需要基于最新的git 提交來打版本。

比如: MFCApplication_V1.0.2_9.exe

由于git 提交信息是hash 記錄,不便于看出不同版本時間先后順序。這里不使用commit 記錄。

換個思路,可用最新的commit? count 計數來區分版本。但這個是個純數字。

如果用tag,可以寫成任意樣式,是個不錯的思路。所以決定采用tag自加方式。

但是如果每筆commit 都打tag,感覺有點濫用tag了。故采用在正式出release版本編譯時才讓tag自加。

實現方案

獲取下一個要打的tag 信息。

下面是一個根據當前tag 生成下一tag的腳本:get_next_tag.bat

REM 配置后可支持中文
chcp 65001
@echo off
::開啟后以便讓變量即時生效
setlocal enabledelayedexpansionset OUTPUT_FILE=build_tag_info.txt:: --------------------------------
:: 獲取當前提交的 tag(如果有)
:: 場景:
:: 1.從未打過tag; 
:: 2. 當前提交不帶tag;
:: 3. 當前提交就帶tag 含反復編譯情況。
:: :: --------------------------------
for /f "delims=" %%i in ('git tag --points-at HEAD') do (set COMMIT_TAG=%%i
)if "!COMMIT_TAG!"=="" (echo "head has no tag"
) else (echo "Current has tag, not need to increase"set NEXT_TAG=%COMMIT_TAG%REM @pausegoto save_info
):: 獲取最后一個 tag, 命令用'""' 包含,防止不能識別=
for /f "delims=" %%i in ('"git describe --tags --abbrev=0"') do set LAST_TAG=%%i:: 去掉前綴V(如果有)
echo LAST_TAG=!LAST_TAG!
if "!LAST_TAG!"==""  (set MAJOR=1set MINOR=0set PATCH=0
) else (set TAG_CLEAN=%LAST_TAG:V=%echo "cur tag: !TAG_CLEAN! .need new tag:  ":: 拆分為主版本.次版本.補丁for /f "tokens=1,2,3 delims=." %%a in ("!TAG_CLEAN!") do (set MAJOR=%%aset MINOR=%%bset PATCH=%%c)echo "before PATCH=!PATCH!":: 如果 PATCH 為空,則設為 0if "!MAJOR!"=="" set MAJOR=1if "!MINOR!"=="" set MINOR=0if "!PATCH!"=="" set PATCH=0echo "PATCH=!PATCH!":: 補丁號 +1set /a PATCH+=1
)echo MAJOR=!MAJOR!
echo MINOR=!MINOR!
echo PATCH=!PATCH!:: 組合新的 tag
set NEW_TAG=V!MAJOR!.!MINOR!.!PATCH!:: 打印輸出
echo LAST_TAG=%LAST_TAG%
set NEXT_TAG=!NEW_TAG!:: 提交tag 
git tag !NEXT_TAG!
git push origin --tags:: 輸出調試信息
:save_info
echo NEXT_TAG=!NEXT_TAG!
REM echo BUILD_TIME=%BUILD_TIME%:: 保存到文件, ">"左邊不要加空格,避免生成文件含空格
echo !NEXT_TAG!> "%OUTPUT_FILE%":: get git count
for /f "delims=" %%i in ('git rev-list --count HEAD') do set GIT_COUNT=%%i
echo GIT_COUNT: !GIT_COUNT!
echo !GIT_COUNT!>> "%OUTPUT_FILE%"endlocal

copy_files.bat

編譯后,自動追加tag信息,并把要拷貝的文件拷貝到output目錄下。

REM 配置后可支持中文
chcp 65001
@echo off
setlocal enabledelayedexpansionset "TargetPath=%~1"
set "ProjectDir=%~2"
set "TargetName=%~3"
set "TargetExt=%~4"
echo "TargetPath=%TargetPath%"
echo "ProjectDir=%ProjectDir%"
echo "TargetName=%TargetName%"
echo "TargetExt=%TargetExt%"
set GIT_RECORD_FILE=%ProjectDir%build_tag_info.txtset /p BUILD_TAG=<"%GIT_RECORD_FILE%"
echo BUILD_TAG=%BUILD_TAG%::讀取第二行count計數
for /f "usebackq delims=" %%A in ("%GIT_RECORD_FILE%") do (set /a LINE_NUM+=1if !LINE_NUM! EQU 2 (set "SECOND_LINE=%%A"goto :findCount)
):findCount
SET GIT_COUNT=!SECOND_LINE!
echo "SECOND_LINE: !SECOND_LINE!"
echo "GIT_COUNT=!SECOND_LINE!"set "NEW_NAME=%TargetName%_!BUILD_TAG!_!SECOND_LINE!%TargetExt%"::copy 前先刪除之前的目標文件,此時不能刪除!TargetPath!代表的文件
set TARGET_ABS_PATH=!TargetPath!\..\!NEW_NAME!
echo ".............................Renaming to !TARGET_ABS_PATH!"
for %%f in (!TargetPath!\..\!TargetName!*.exe) do (REM 檢查文件名是否不等于 !TargetName!.exeif /i not "%%f"=="!TargetPath!\..\!TargetName!.exe" (echo will delete %%fdel "%%f")
)REM 保存當前路徑到環境變量
set PREV_PATH=%CD%
cd ..
if exist  .\output\!TargetName!*.exe      (del /S /Q output\!TargetName!*.exe)        else (md output\ )echo "...................start copy"
echo TargetPath=!TargetPath!
echo "NEW_NAME=!NEW_NAME!"
::需要重命名,不要使用xcopy
copy !TargetPath!                output\!NEW_NAME!  /Y::copy other files to Debug\Release 便于調試
xcopy Config.ini                 !TargetPath!\..  /D /Y::copy other files to output
xcopy Config.ini                 output\  /D /Y
xcopy README.md                output\  /D /Ycd /D %PREV_PATH%del  !GIT_RECORD_FILE!endlocal

最后在項目屬性中——生成事件——生成后事件,為Release版本配置:

call "$(ProjectDir)get_next_tag.bat"
call "$(ProjectDir)copy_files.bat"  "$(TargetPath)" $(ProjectDir) "$(TargetName)" $(TargetExt)

大家可根據自己實際情況自行修改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901491.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901491.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901491.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nginx入門,部署靜態資源,反向代理,負載均衡使用

Nginx在linux上部署靜態資源 概念介紹 Nginx可以作為靜態web服務器來部署靜態資源。這里所說的靜態資源是指在服務端真實存在&#xff0c;并且能夠直接展示的一些文件&#xff0c;比如常見的html頁面、css文件、js文件、圖片、視頻等資源。 相對于Tomcat&#xff0c;Nginx處理…

【字節跳動AI論文】Seaweed-7B:視頻生成基礎模型的高成本效益培訓

摘要&#xff1a;本技術報告介紹了一種經濟有效的視頻生成基礎模型訓練策略。 我們提出了一種中等規模的研究模型&#xff0c;大約有70億個參數&#xff08;7B&#xff09;&#xff0c;稱為Seaweed-7B&#xff0c;使用665,000個H100 GPU小時從頭開始訓練。 盡管使用適度的計算資…

Java單例模式:實現全局唯一對象的藝術

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 一、什么是單例模式&#xff1f; 單例模式&#xff08;Singleton Pattern&#xff09;是一種創建型設計模式&#xff0c;確保一個類只有一個實例&#xff0c…

Oracle 復制表結構(含索引、主鍵)操作指南

Oracle 復制表結構&#xff08;含索引、主鍵&#xff09;操作指南 1. 復制基礎表結構 -- 創建空表結構&#xff08;不復制數據&#xff09; CREATE TABLE new_table AS SELECT * FROM old_table WHERE 10;2. 復制主鍵約束 -- 查詢原表主鍵信息 SELECT constraint_name, co…

React 更新state中的對象

更新 state 中的對象 state 中可以保存任意類型的 JavaScript 值&#xff0c;包括對象。但是&#xff0c;你不應該直接修改存放在 React state 中的對象。相反&#xff0c;當你想要更新一個對象時&#xff0c;你需要創建一個新的對象&#xff08;或者將其拷貝一份&#xff09;…

基于 GoFrame 框架的電子郵件發送實踐:優勢、特色與經驗分享

1. 引言 如果你是一位有1-2年Go開發經驗的后端開發者&#xff0c;可能已經熟悉了Go語言在性能和并發上的天然優勢&#xff0c;也曾在項目中遇到過郵件發送的需求——無論是用戶注冊時的激活郵件、系統異常時的通知&#xff0c;還是營銷活動中的批量促銷郵件&#xff0c;郵件功…

AndroidStudio編譯報錯 Duplicate class kotlin

具體的編譯報錯信息如下&#xff1a; Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21) D…

后端面試問題收集以及答案精簡版

思路 不要問什么答什么 要學會擴充 比如問你go map的原理 map 是什么 數據結構&#xff0c;字典&#xff0c;k/v 結構map的應用場景有哪些 快速查找、計數器、配置管理、去重、緩存實現map有哪些限制 無序性、非線程安全的讀寫map的key的訪問 v: mp[key] v,ok : mp[key] for…

MicroPython 開發ESP32應用教程 之 I2S、INMP441音頻錄制、MAX98357A音頻播放、SD卡讀寫

本課程我們講解Micropython for ESP32 的i2s及其應用&#xff0c;比如INMP441音頻錄制、MAX98357A音頻播放等&#xff0c;還有SD卡的讀寫。 一、硬件準備 1、支持micropython的ESP32S3開發板 2、INMP441數字全向麥克風模塊 3、MAX98357A音頻播放模塊 4、SD卡模塊 5、面包板及…

UE5 物理模擬 與 觸發檢測

文章目錄 碰撞條件開啟模擬關閉模擬 多層級的MeshUE的BUG 觸發觸發條件 碰撞 條件 1必須有網格體組件 2網格體組件必須有網格&#xff0c;沒有網格雖然可以開啟物理模擬&#xff0c;但是不會有任何效果 注意開啟的模擬的網格體組件會計算自己和所有子網格的mesh范圍 3只有網格…

微信小程序 - swiper輪播圖

官方文檔&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html <swiper indicator-color"ivory" indicator-active-color"#d43c33" indicator-dots autoplay><swiper-item><image src"/images/banner…

深入探究C#官方MCP:開啟AI集成新時代

一、引言 在當今數字化時代&#xff0c;.NET 開發領域不斷演進&#xff0c;而 C# 官方 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文協議&#xff09;的出現&#xff0c;無疑為開發者們帶來了全新的機遇與挑戰。隨著人工智能技術的迅猛發展&#xff0c;將 AI…

二分查找法

使用二分查找法的前提&#xff1a;&#xff08;1&#xff09;數組為有序數組. &#xff08;2&#xff09;數組中無重復元素. 二分的兩種寫法&#xff1a; 方法一&#xff1a;[left&#xff0c;right] class Solution { public:int search(vector<int>& nums, int …

HarmonyOS:頁面滾動時標題懸浮、背景漸變

一、需求場景 進入到app首頁或者分頁列表首頁時&#xff0c;隨著頁面滾動&#xff0c;分類tab要求固定懸浮在頂部。進入到app首頁、者分頁列表首頁、商品詳情頁時&#xff0c;頁面滾動時&#xff0c;頂部導航欄&#xff08;菜單、標題&#xff09;背景漸變。 二、相關技術知識點…

鯤鵬+昇騰部署集群管理軟件GPUStack,兩臺服務器搭建雙節點集群【實戰詳細踩坑篇】

前期說明 配置&#xff1a;2臺鯤鵬32C2 2Atlas300I duo&#xff0c;之前看網上文檔&#xff0c;目前GPUstack只支持910B芯片&#xff0c;想嘗試一下能不能310P也部署試試&#xff0c;畢竟華為的集群軟件要收費。 系統&#xff1a;openEuler22.03-LTS 驅動&#xff1a;24.1.rc…

React中 點擊事件寫法 的注意(this、箭頭函數)

目錄 ?1、錯誤寫法?&#xff1a;onClick{this.acceptAlls()} ?2、正確寫法?&#xff1a;onClick{this.acceptAlls}&#xff08;不帶括號&#xff09; 總結 方案1&#xff1a;構造函數綁定 方案2&#xff1a;箭頭函數包裝方法&#xff08;更簡潔&#xff09; 方案3&am…

【路由交換方向IE認證】BGP選路原則之Weight屬性

文章目錄 一、路由器BGP路由的處理過程控制平面和轉發平面選路工具 二、BGP的選路順序選路的前提選路順序 三、Wight屬性選路原則規則9與規則11的潛移默化使用Weight值進行選路直接更改Weight值進行選路配合使用route-map進行選路 四、BGP鄰居建立配置 一、路由器BGP路由的處理…

Missashe考研日記-day20

Missashe考研日記-day20 1 高數 學習時間&#xff1a;2h30min學習內容&#xff1a; 今天當然是刷題啦&#xff0c;做不等式的證明板塊的真題&#xff0c;證明題懂的都懂&#xff0c;難起來是真的一點思路都沒有&#xff0c;這個板塊還沒做完&#xff0c;做完再總結題型。 2…

了解JVM

一.JVM概述 1.JVM的作用 ?把字節碼編譯為機器碼去執行,負責把字節碼裝載到虛擬機中 ?現在的 JVM 不僅可以執行 java 字節碼文件,還可以執行其他語言編譯后的字節碼文件,是一個跨語言平臺 2.JVM的組成部分 類加載器&#xff08;ClassLoader&#xff09;運行時數據區&#x…

LeetCode LCR157 套餐內商品的排列順序

生成字符串的全部排列&#xff08;去重&#xff09;&#xff1a;從問題到解決方案的完整解析 問題背景 在編程和算法設計中&#xff0c;生成字符串的所有排列是一個經典問題。它不僅出現在算法競賽中&#xff0c;也在實際開發中有著廣泛的應用&#xff0c;比如生成所有可能的…