更新.NET项目引用(在配置文件中)

时间:2011-11-21 18:59:05

标签: .net continuous-integration versioning configuration-files

我有一个由许多项目组成的解决方案,包括:

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>

我的任务是调整我们的版本编号,以便“修订版”部分对应于最新的更改集(在我们的例子中是HEAD版本号,因为我们正在使用Subversion),例如从“1.1.0.0”到“1.1.0.12345”。

所以我实现了一个“共享”的assembly-version-info模块,如here所述。我修改了我们的NAnt构建脚本以获取版本号并更新共享的assembly-info文件。

但是,我没有指望嵌入在配置文件中的版本号。是否有(相对)无痛的方式来自动更新配置文件中的版本号?

显然,我可以将“普通”组件拆分为单独的解决方案 我还可以使用IoC配置通用组件,这将消除对特定于组件的配置部分的需求 然而,这些方法中的任何一种都涉及一些风险和时间......我认为,如果可能的话,我认为这两种权力都是可以避免的(至少就目前而言)。

2 个答案:

答案 0 :(得分:2)

快速回答 - 除非您在应用程序中支持多个Foo.Common.dll的同时版本,否则我只会从配置部分中省略版本号。

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

这对于配置文件结构的“section”区域并不特殊 - 这是一个固有的.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,并包含所需的类型。

答案 1 :(得分:1)

我不会经常修改我的AssemblyVersion。您应该为每个构建重新构建AssemblyFileVersion(因此您可以将它们区分开来),但是每次构建时都需要重新构建AssemblyVersion。

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 }