星期五, 10月 21, 2011

寫支 console application 來更新 svn 的版本號

簡介

之前有過一篇文章"用 Subversion 來自動更新網站版本和更新時間",用來更新網站的版本和更新時間,不過這個方法不算是很好的方法,有兩點原因,一、個是當我要更新版本號的時候,要去修改 web.config的內容,這點對於版本控管的概念來說是不對的,因為修改原因不是因為 web.config 修改而是你需要版本更新而去改,二、是這部份需要靠記憶來記住這件事,如果忘記就不會更新內容,所以花了一點時間想了一個我覺得更好的方法,在這裡來分享個各位

說明

想法大概是這樣,Bibby 在佈署網站的時候,都會習慣把網站用 Publish 的方式先丟到一個資料夾裡面,然後再去對那資料夾做一些佈署前該做的事,例如測試資料夾要砍掉,Html的layout砍掉等等,所以目標就是寫一隻 console application 來對那個資料夾做事,用程式來代替手工完成佈署前需要做的部份,不過這次範例先 foucs 在更新 svn 的版本號這個動作

步驟

1.在佈署的網站的 web.config 加入下列的設定檔,加入是為了讓 console 來讀取

<appSettings>
<add key="svnPath" value="D:\Projects\URNTW" />
<add key="svnRevision" value="1" />
<add key="svnDate" value="2011/09/07 03:15:45" />
</appSettings>


2.要安裝 TortoiseSVN ,要用到 TortoiseSVN 的 SubWCRev.exe

3.新增一個 console application 來處理這件事

namespace TempConsole
{
class Program
{
static void Main(string[] args)
{
//塞入要處理的path
Helper.BaseFolderPath = args[0];

//更新版svn本資訊
Console.WriteLine("---------更新版svn本資訊-----------");
SvnUtility su = new SvnUtility();
su.ToUpdateSVNVersionAndDate();
Console.WriteLine("---------完成-----------");

Console.Read();
}
}

class Helper
{
static string _BaseFolderPath;
public static string BaseFolderPath
{
get
{
if (string.IsNullOrEmpty(_BaseFolderPath))
throw new Exception("BaseFolderPath不許為空值");
return _BaseFolderPath;
}
set
{
_BaseFolderPath = value;
}
}
}

class SvnUtility
{
/// <summary>
/// 更新版svn本資訊
/// </summary>
/// <param name="folderPath"></param>
public void ToUpdateSVNVersionAndDate()
{
var wu = new WebConfigUtility();

string sourceFolderPath = wu.GetWebConfigSettingValue("svnPath");
string svnFile = string.Format(@"{0}\{1}.txt"
, Helper.BaseFolderPath, Guid.NewGuid().ToString("N"));
using (var stream = File.Create(svnFile))
using (StreamWriter sw = new StreamWriter(stream))
{
//參考http://bluecat.csie.net/2010/07/13/5105/
sw.WriteLine("$WCREV$");
sw.WriteLine("$WCDATE$");
}

string consoleArgs = string.Format(@"{0} {1} {1}", sourceFolderPath, svnFile);
CallConsoleWordApp(@"SubWCRev.exe", consoleArgs, () =>
{
var svnInfo = File.ReadAllLines(svnFile);
File.Delete(svnFile);

wu.SetWebConfigSettingValue("svnRevision", svnInfo[0]);
wu.SetWebConfigSettingValue("svnDate", svnInfo[1]);
Console.WriteLine(string.Concat("處理", string.Concat(Helper.BaseFolderPath, @"\Web.config")));
});
}

/// <summary>
/// 呼叫 產生 Word 的程式
/// </summary>
/// <param name="appPath">被呼叫的程式路徑</param>
/// <param name="parameter">參數,c:/test.exe aa bb cc</param>
void CallConsoleWordApp(string appPath, string parameter, Action fun)
{
const int wait = 3000;

//BMK 呼叫 產生Word 的程式
var startInfo = new ProcessStartInfo(appPath, parameter)
{
WindowStyle = ProcessWindowStyle.Hidden
};

var process = new Process
{
StartInfo = startInfo
};
process.Start();
process.WaitForExit(wait);//程式等三秒沒執行就跳出
bool IsGet = true;
while (IsGet)
{
if (process.HasExited)
{
fun.Invoke();
IsGet = false;
}
}

}
}

class WebConfigUtility
{
readonly string configFile;
public WebConfigUtility()
{
this.configFile = string.Concat(Helper.BaseFolderPath, @"\Web.config");
}

public void SetWebConfigSettingValue(string key, string value)
{
var root = XElement.Load(configFile);
var settings = root.Element("appSettings").Elements("add");

try
{
settings.First(a => a.Attribute("key").Value == key)
.Attribute("value").Value = value;
root.Save(configFile);
}
catch
{
throw new Exception("沒有這個item");
}
}

public string GetWebConfigSettingValue(string key)
{
var root = XElement.Load(configFile);
var settings = root.Element("appSettings").Elements("add");

try
{
return settings.First(a => a.Attribute("key").Value == key)
.Attribute("value").Value;
}
catch
{
throw new Exception("沒有這個item");
}
}
}
}

4.下載 Open++ 這軟體來呼叫 console application

先大概簡介一下,這個程式是用來修改滑鼠右鍵 menu 的,Bibby會用這隻程式是因為有三個原因,一、很直覺,有簡潔易懂的界面可以用,二、可以分組,這功能很重要幫助分類,三、免費又免安裝,基於這三點,不用怎麼可以,Bibby知道也可以去編輯 regedit 檔案來達成這個效果,不過基於懶又不想研究太深入的關係,就拿人家寫好的軟體來用就對了!接下來就是簡單的使用流程,看圖說故事摟..

開起解壓縮後的資料夾,執行程式

clip_image001

新增按鈕,選擇 Command

clip_image002

1.新增Command的名稱
2.這個Command的位置
3.執行程式會帶入的參數名稱,這很重要,因為我們就是要對這個資料夾來處理
4.這個Command的內容只出現單一資料夾的狀態下

clip_image003

1.增加按鈕
2.增加分割線,這是為了要分組用的

image

1.新增好內容後,要來安裝這個程式,這樣滑鼠右鍵才會出現,如果有一天您不想要這個程式,只要用uninstall這個內容就可以了

clip_image005

1.在資料夾上點滑鼠右鍵,就可以看到 TempConsole 這個我們剛剛新增的 Command 了

clip_image006

結果

我們就可以在web.config裡面看到修改了

clip_image007

總結

這個作法比之前的作法好很多,在進階一點,我們可以把佈署前想要做的事情都放在這支 console application 來處理,例如:刪除一些不要的檔案,加密一些設定檔,壓縮整個要佈署的資料夾等等,這些內容實作都不難,寫好了就可以用很久很久,身為程式設計師的我們,就是要想些有的沒有的來讓世界變得更好,如果大家對於此作法有任何的意見,留言一起討論吧!

參考
http://bluecat.csie.net/2010/07/13/5105/
http://dengdun.webs.com/

1 則留言:

Michael Leung 提到...

Your blog is so great.
I am a C# developer too!