2012-02-27 81 views
2

我們所有的在我們的SLN股票項目VersionInfo.cs持有該項目的版本號流汗SVN工作拷貝修訂版本號VersionInfo.cs

[assembly: AssemblyVersion("0.0.1.0")] 
[assembly: AssemblyFileVersion("0.0.1.0")] 

我想staticly定義版本號的第3個部分最後一部分我想成爲工作副本SVN修訂版。

第一步是在VS中定義一個預生成事件,觸發一個cmd腳本,是否有一種簡單的方法從cmd中獲取工作副本修訂版本?

步驟二號是插入該數字到VersionInfo.cs文件

即使世界可能更優雅的這樣做的方法,如果你在商店裏一個只要記住,這是一個開源項目,我們沒有花哨的構建服務器或類似的東西。部署過程只是把項目在發佈模式和構建:D

回答

1

hmjd:■解決方案是隻有一半在那裏,如果你每次寫入文件構建闖民宅的所有項目的Versionfile需要,即使沒有重建已更改,我將腳本更改爲只寫入該文件,如果其新版本號爲

@ECHO off 

FOR /F "tokens=1,2 delims=:M" %%A in ('svnversion ../ -c') do SET PART_1=%%A&SET PART_2=%%B 

SET file=../VersionInfo.cs 

IF NOT DEFINED PART_2 (
SET SVN_REV=%PART_1% 
) 

IF NOT DEFINED SVN_REV (
SET SVN_REV=%PART_2% 
) 

set result=0 

for /f "tokens=3" %%f in ('find /c /i ".%SVN_REV%." %file%') do set result=%%f 

IF %result% gtr 0 (
GOTO end 
) 

ECHO using System.Reflection; > %file% 
ECHO [assembly: AssemblyVersion("0.1.%SVN_REV%.0")]  >> %file% 
ECHO [assembly: AssemblyFileVersion("0.1.%SVN_REV%.0")] >> %file% 

:end 
2

是否有一種簡單的方法從cmd獲取工作副本修訂?

有一個名爲svnversion.exe的可執行文件,它在標準輸出上打印版本。如果你確定這是在你的PATH你可以稱之爲。

要插入數到VersionInfo.cs文件

你可以生成VesionInfo.cs文件全部或部分,從一個批處理文件:

@echo off 

FOR /F %%A in ('svnversion') do SET SVN_REV=%%A 

echo [assembly: AssemblyVersion("0.0.1.%SVN_REV%")]  > VersionInfo.cs 
echo [assembly: AssemblyFileVersion("0.0.1.%SVN_REV%")] >> VersionInfo.cs 

編輯:

已更新批處理文件以處理格式RR,NN:RR和格式的修訂號其中NN是一個整數,RR是修訂:

@ECHO off 

FOR /F "tokens=1,2 delims=:M" %%A in ('svnversion') do SET PART_1=%%A&SET PART_2=%%B 

IF NOT DEFINED PART_2 (
SET SVN_REV=%PART_1% 
) 

IF NOT DEFINED SVN_REV (
SET SVN_REV=%PART_2% 
) 

ECHO [assembly: AssemblyVersion("0.0.1.%SVN_REV%")]  > VersionInfo.cs 
ECHO [assembly: AssemblyFileVersion("0.0.1.%SVN_REV%")] >> VersionInfo.cs 
+0

感謝您的反饋,我下載svnversion.exe並以這種格式輸出33:37M,其中37是修訂版本,因此您的批處理腳本將創建一個無效的版本號,我正在考慮創建一個小小的C#控制檯程序,並對版本進行解析並創建文件在那裏,但也許這是矯枉過正,有更好的方法嗎? – Anders 2012-02-27 14:20:55

+0

@Anders,在用DOS提取修訂號之後更新了答案。 – hmjd 2012-02-27 14:54:09

+0

@Anders - 你有混合的工作副本。它的目的是如此嗎? – 2012-02-28 08:52:09

0

你可以嘗試使用Keyword Substitutes更換號碼作爲您提交。他們有這個作爲一個例子:

$Rev$:  Revision of last commit 
$Author$: Author of last commit 
$Date$: Date of last commit 
+0

爲了這個工作您需要每次更新VersionFile.cs以獲得新修訂版本,$ Rev $僅反映實際文件更改的時間... – Anders 2012-02-27 13:40:19

+0

啊,有效點。 – jprofitt 2012-02-27 13:50:18

+0

$ Rev $關鍵字擴展爲壞的(對於這個任務)字符串,就像這個'$ Revision:1028 $' – 2012-02-28 08:56:56

1
  • 如果是VisualStudio的,它的Windows
  • 如果是Windows,則可以使用SubWCRev在TortoiseSVN

    1. VERSIONINFO的寫模板。cs到存儲庫而不是最終文件,那裏有可改變的部分數據被替換爲(適當的)SubWCRev關鍵字
    2. 在每個構建過程運行的SubWCRev中,最後一個文件包含來自模板和WC數據的實際數據(完整構建器可以/開始/簡單,如svn export + subwcrev wc-path VersionInfo.cs.tpl VersionInfo.cs
1

下載MSBuild Community Task並安裝它。

打開你的.csproj,並在年底將以下代碼粘貼(前關閉</project>標籤)

(不改變<Import>標籤):

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> 

<Import>標籤後粘貼以下:

<Target Name="BeforeBuild"> 
     <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(ProgramFiles)\TortoiseSVN\bin"> 
      <Output TaskParameter="Revision" PropertyName="Revision" /> 
     </SvnVersion> 
     <FileUpdate Files="Properties\AssemblyInfo.cs" Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)" ReplacementText="$1.$2.$3.$(Revision)" /> 
    </Target> 

看屬性刀具路徑裏面的SvnVersion標籤,在這裏你必須標識你的機器的位置是svnversion.exe二進制文件。

假設您已經安裝了TortoiseSVN的軟件,它的路徑是:C:\ProgramFiles\TortoiseSVN\bin\ 你也可以使用的VisualSVN二進制文件(在這種情況下,二進制文件位於C:\ProgramFiles\VisualSVN\bin\

經過這樣的修改在你的。 csproj,在每個構建項目中,MSBuild將首先調用svnversion.exe(帶有參數,即當前解決方案目錄),並且svnversion將返回該存儲庫的修訂版本號。在FileUpdate標記中,MSBuild將查找正則表達式模式,然後用主要,次要和構建(分別爲$ 1,$ 2和$ 3)的當前值進行替換,並使用變量修訂值更新版本