使用CruiseControl.net进行程序集版本控制

时间:2009-01-13 12:23:12

标签: cruisecontrol.net versioning assemblyinfo

我已经为一系列相关的项目设置了CruiseControl.net。 因此,CruiseControl中的单个项目标签具有多个SVN检出,然后一堆msbuild任务编译所有单独的sln文件。

我需要在完成此构建时更新所有解决方案的程序集版本。 但是,因为我没有使用nant而不使用MSBuild proj文件,所以我不确定如何获取它。

我想知道我是否遗漏了一些明显的东西。我只需要一个可以通过在ccnet.config文件中进行适当更改来实现的解决方案,而无需我对csproj文件进行更改。

谢谢, ANJ

3 个答案:

答案 0 :(得分:11)

如何在项目中使用共享的AssemblyInfo?

这就是我们为产品所做的事情:

  • 每个项目都有自己的AssemblyInfo.cs - 它包含AssemblyTitle,AssemblyDescription,Guid以及该程序集特有的其他属性。

  • 每个项目还有另外两个程序集信息文件,请注意这些文件是作为链接而不是直接文件添加的(VS - >添加 - >现有文件 - >添加为链接(小向下箭头)旁边加))

两个链接文件:

  1. CompanyAssemblyInfo.cs - AssemblyCompany,AssemblyCopyright,AssemblyConfiguration,CLSCompliant,SecurityPermission等。基本上我们想要的所有程序集都是标准的。

  2. ProductAssemblyInfo.cs - AssemblyProduct,AssemblyVersion,AssemblyFileVersion。这允许我们将相同的版本推送到一个文件中的所有程序集。

  3. 我们的CI和发布过程更复杂,但这是它的核心 - 控制产品版本的单点(文件)(程序集,安装程序,所有内容!)

答案 1 :(得分:6)

有一项任务就是要做你正在询问的事情。

您需要安装MSBuildCommunity任务,找到here

然后,你可以创建这样的东西:

<PropertyGroup>
<MyAssemblyVersion>$(CCNetLabel)</MyAssemblyVersion>
</PropertyGroup>

<Target Name="GenAssemblyInfo">
    <AssemblyInfo
      ContinueOnError="false"
      CodeLanguage="CS"
      OutputFile="$(MSBuildProjectDirectory)\YourAssembly\AssemblyInfo.cs"
      AssemblyTitle="blah"
      AssemblyDescription="blah blah"
      AssemblyCompany="Anj Software, Inc."
      AssemblyProduct="Anj's Awesome App"
      AssemblyCopyright="blah blah"
      CLSCompliant="false"
      AssemblyVersion="$(MyAssemblyVersion)"
      AssemblyFileVersion="$(MyAssemblyVersion)"
     />
</Target>

请注意,您可以在ccnet.config文件中设置内部版本号前缀,以便程序集编号为2.1.0.x,其中x是内部版本号。这就是我们在工作中编号的方式。

您仍然需要将默认的AssemblyInfo.cs文件作为构成解决方案的每个项目的一部分。

答案 2 :(得分:3)

我为此使用powershell。 lpath是源代码的路径,buildnum是我追加的buildnumber。这就是我实际上对此所做的一切。但是,它应该足以让您更改或设置任何或所有其他可用字段。我传入lpath并从CC.NET中获取可用环境变量的buildnumber,我可以一遍又一遍地使用这个脚本,只需更改我在配置文件中命令行传入的内容。我还有一个修改C ++代码的资源文件,如果这实际上是你需要修改的。

$files = Get-ChildItem $lpath -recurse -filter *AssemblyInfo.cs -name

Foreach ($file in $files)
{
    $file = $lpath + "\" + $file

    $fileObject=get-item $file

    $fileObject.Set_IsReadOnly($False)

    $sr = new-object System.IO.StreamReader( $file, [System.Text.Encoding]::GetEncoding("utf-8") ) 
    $content = $sr.ReadToEnd()
    $sr.Close()

    $content = [Regex]::Replace( $content, '(?<=\[assembly: AssemblyVersion\("[0-9].[0-9].[0-9].)[0-9]?[0-9]?[0-9]', $buildnum);
    $content = [Regex]::Replace( $content, '(?<=\[assembly: AssemblyFileVersion\("[0-9].[0-9].[0-9].)[0-9]?[0-9]?[0-9]', $buildnum);

    $sw = new-object System.IO.StreamWriter( $file, $false, [System.Text.Encoding]::GetEncoding("utf-8") )
    $sw.Write( $content )
    $sw.Close()

    $fileObject.Set_IsReadOnly($True)
}