4

我有一個解決方案,包括了多個項目,包括:更新.NET項目引用(在配置文件中)

Foo.Bar.Client
Foo.Common

Foo.Bar.Client取決於組件Foo.Common。而且,Foo.Common沒有自己的配置文件;它的設置存儲在使用它的客戶端應用程序的配置文件中,在本例中爲Foo.Bar.Client
因此,Foo.Bar.Client配置文件包含

<configSections> 
    <section name="BletchConfiguration" 
      type="Foo.Common.Bletch, Version=1.1.0.0, ..."/> 
    .... 
    </configSections> 

我一直在負責調整我們的版本編號,使「修訂」部分對應於最新的更改集(在我們的情況下,最新版本號,因爲我們正在使用Subversion),例如從「1.1.0.0」到「1.1.0.12345」。

所以我實現了一個「shared」assembly-version-info模塊,如here所述。而且我修改了我們的NAnt構建腳本以獲取版本號並更新共享的assembly-info文件。

但是,我沒有指望版本號被嵌入到配置文件中。是否有一種(相對)無痛的方式來自動更新配置文件中的版本號?

顯然,我可以將「普通」程序集分解爲單獨的解決方案。
我也可以使用IoC配置通用組件,這將消除對特定於組件的配置節的需求。
然而,這些方法都涉及一些風險和時間......我相信這兩種方法如果可能(至少現在)寧願避免。

回答

2

快速回答 - 除非您在應用程序中支持多個同時版本的Foo.Common.dll,否則我會忽略配置部分中的版本號。

<configSections> 
    <section name="BletchConfiguration" 
     type="Foo.Common.Bletch, Foo.Common"/> 
    .... 
</configSections> 

這不是特殊的配置文件結構的「部分」區域 - 這是一種內在的東西。NET - 和一個用約定全部結束。

[編輯]

我無法找到具體涉及這部分是可選的任何文檔。 MSDN文檔只是指出結構http://msdn.microsoft.com/en-us/library/ms228245.aspx 然而,從內存和一個小實驗......(這是相當靈活的 - 方括號表示可選)

如果你的DLL是在GAC - 你需要的版本... FullTypeAndNamespace, AssemblyNameWithoutExtension, Version, Culture, PublicKeyToken [,PlatformType]

如果你的DLL是在bin目錄 FullTypeAndNamespace, AssemblyNameWithoutExtension [,Version, Culture, PublicKeyToken] [,PlatformType]

因此,前兩個部分是強制性的,因爲應用程序需要知道看什麼組件,該類型已指定。

您可以以任意順序擁有可選組件(因爲它們被構造爲鍵=值對,順序無關緊要)。只需指定要約束的元素,省略其餘元素。

因此,在我給出的示例中,CLR將加載與名稱匹配的第一個DLL,幷包含所需的類型。

+0

您將無法指點我一些文件,你會嗎?我一直在思考(和搜索)這些方面,但是我還沒有找到任何東西來表明'type'的哪些部分可以省略,什麼時候可以省略。 – David

+0

我已經更新了我的答案以解決您的問題。 – Adam

1

我不會經常旋轉我的AssemblyVersion。你應該爲每個版本製作AssemblyFileVersion(所以你可以將它們區分開來),但是對於每個版本來說,AssetsVersion是相當有問題的。

What are differences between AssemblyVersion, AssemblyFileVersion and AssemblyInformationalVersion?

編輯:我確實有更新的AssemblyVersion,我運行一個PowerShell腳本,發現需要修改的文件,檢查出來,並讓改變。我在驗證文件的子集後手動提交更改。

這裏是更新實際的AssemblyVersion腳本:

get-childitem . -rec -include AssemblyInfo.cs | select-string "assembly: AssemblyVersion(" -simplematch -list | % { & p4 sync $_.path; & p4 edit $_.path; (get-content $_.Path) |% { $_ -replace "assembly: AssemblyVersion\(`"\d\.\d\.\d\.\d", "assembly: AssemblyVersion(`"2.0.0.0" } | set-content $_.Path -Encoding UTF8 } 

這裏是一個更新的項目參考從1.5.0.0 2.0.0.0到:

get-childitem . -rec -include *.csproj | select-string "<Reference Include=`"Acme.SomeProduct," -simplematch -list | % { & p4 sync $_.path; & p4 edit $_.path; (get-content $_.Path) |% { $_ -replace "<Reference Include=`"Acme\.SomeProduct, Version=1\.5\.0\.0,", "<Reference Include=`"Acme.SomeProduct, Version=2.0.0.0," } | set-content $_.Path -Encoding UTF8 } 
+0

我也同意這一點。我們修改每個版本的文件版本,並且只在發佈時更改組件標識。但是 - 不管你多久改變一次 - 如果你的配置中有版本號 - 它可能會在某個時刻出現你。 Suzanne Cooke建議您在開始開發之前更改程序集版本(http://blogs.msdn.com/b/suzcook/archive/2003/05/29/when-to-change-file-assembly -versions.aspx),而不是僅在發佈之前 - 出於很好的理由 - 更改程序集標識會影響應用程序的行爲。 – Adam

+0

這很有道理。不幸的是,某些'.config'引用正在被傳遞到一個(較舊的)企業庫塊,該庫需要一個由四部分組成的組件版本號,即major.minor.build.revision。 – David

+0

@Russell - 感謝您的回覆......我很難挑選「接受」答案。我敬畏你的PowerShell-fu。 – David