2016-04-22 26 views
2

我的目標是在Visual Studio Team Services中爲測試和生產環境創建構建定義。我需要在我的代碼中更新2個變量,這些變量決定哪個數據庫以及環境使用哪個blob存儲。到目前爲止,我已經在Resource變量中處理了這個值,並從庫的代碼My.Resources.DB中提取了該值,對於Azure輔助角色,該值爲Microsoft.Azure.CloudConfigurationManager.GetSetting("DatabaseConnectionString")。但是,每次發佈版本時更改4個變量都會令人疲勞。是否可以將構建過程中的變量傳遞給Visual Basic代碼?

我看到很多接近我想要的帖子,但他們是面向C#。由於超出我的影響的原因,這個項目是用VB.NET編寫的。看來我有2個選項。首先,我可以用一些定義的屬性調用MSBuild進程,將它們傳遞給.metaproj構建文件,但我不知道如何讓它們用於VB代碼。這是可取的,但在這一點上,我開始懷疑這是可能的。

我已經能夠設置一些預處理器常量,在#if#else語句中被識別。

#If DEBUG = True Then 
     BarStaticItemVersion.Caption = String.Format("Version: {0}", "1.18.0.xxx") 
#Else 
     BarStaticItemVersion.Caption = String.Format("Version: {0}", "1.18.0.133") 
#End If 

msbuild CalbertNG.sln.metaproj /t:Rebuild /p:DefineConstants="DEBUG=False"

這似乎是工作,但我需要重建更改該常量的值。我需要嗎?應該建立足夠的?這是正常的,還是表明我沒有設置正確的東西?

我已經看到其他一些文章討論預處理源文件與其他一些建設者,如螞蟻,但似乎是矯枉過正。感覺就像我在這裏。但是我想縮小並從一張乾淨的紙上問你是否有兩個變量需要在每個環境中改變,你使用的是VB.NET,並且你希望將這些變量值合併到一個自動化的VS中團隊服務在代碼簽入時構建過程,最好的方法是什麼? (我想在VSTS面板中定義變量,但這只是將它們傳遞給我的構建器,所以我必須知道如何解析對MSBuild的調用以使它們有用)。

我可以控制2靜態字符串,現在,通過編譯器指令,但我真的很想引用MSBuild進程中顯示給用戶的Build.BuildNumber,如果可以這樣做,我可以將變量提供給數據庫和blob容器通過相同的機制,並跳過預處理器。

+0

我們爲每個環境的項目添加配置,並設置轉換以設置連接字符串和其他設置。也看看使用SlowCheetah。 – JerryM

+0

您應該使用web.config或app.config來存儲環境特定的變量,如連接字符串。 –

+0

我很欣賞使用app.config的建議,但後來我遇到了類似的問題:如何通過msbuild.exe在THAT文件中設置值? –

回答

0

您已經找到了將數據從MsBuild參數直接傳遞到代碼中的方式。另一種方法是使用Condition Attribute in your project files to make certain property groups optional,它允許你甚至有條件地包含特定的文件。你可以control conditions by passing in /p:ConditionalProperty=value on the MsBuild command。這至少可以確保人們使用一組有意義的值。

問題是,當MsBuild以增量模式運行時,它很可能不會處理您的更改(如您已經注意到的),原因是輸入文件自上次構建後保持不變,並且都是比上次生成的輸出文件還要舊。

要繞過此行爲,您通常會創建單獨的解決方案配置並覆蓋所有項目的輸出位置,使其對該配置唯一。結合爲特定配置設置編譯器常量,可以確保在構建該配置/平臺組合時,增量構建按預期工作。

我的確想回應一些JerryM和Daniel Mann的評論。在實際開始編譯階段之前,有些項目會更好地存儲在其他位置或已更新。

可能的解決方案:在配置文件和使用配置轉型

當談論專門的版本控制時,有許多方法可以在編譯之前設置AssemblyVersion和AssemblyFileVersion,通常它涉及在編譯之前覆蓋AssemblyInfo.cs文件。然後,您的代碼可以使用反射在運行時讀取值。您可以使用AssemblyInformationalversion來指定類似於您在上面的示例中所做的操作,其中包含.xxx或其他文本,還可以確保顯示的版本始終反映讀取文件屬性時獲得的信息通過Windows資源管理器

+0

我在2年前開始這個項目時嘗試了SlowCheetah。我只是用最新的VS再試了一遍,我仍然遇到了同樣的問題:VS中沒有看到創建的文件。它們在文件系統上創建,但VS文件瀏覽器忽略它們。這使得他們處於次優狀態。 –

+0

我真的很喜歡使用ReplaceTokens VSTS任務的想法。這似乎是一個乾淨的方法。不過,我只是安裝它,並將其添加到我的構建定義中,但我無法確定如何定義標記和替換字符串。這似乎沒有用戶界面,只是前綴和後綴。 –

+0

我可以定義變量,但是你在哪裏定義了要替換的變量?我可以通過msbuild.exe來餵食嗎? –

相關問題