10

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

完成此构建后,我需要更新所有解决方案的汇编版本。但是,由于我没有使用 nant 并且没有使用 MSBuild proj 文件,因此我不确定如何获得它。

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

谢谢,安杰

4

3 回答 3

11

在您的项目中使用共享的 AssemblyInfo 怎么样?

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

  • 每个项目都有自己的 AssemblyInfo.cs - 其中包含 AssemblyTitle、AssemblyDescription、Guid 和该程序集独有的其他属性。

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

两个链接文件:

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

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

我们的 CI 和发布过程更加复杂,但这是它的核心 - 一个控制产品版本(程序集、安装程序、一切!)的单点(文件)

于 2009-01-22T23:40:46.800 回答
6

有一项任务要做你所要求的。

您需要安装 MSBuildCommunity 任务,可在此处找到。

然后,您可以创建如下内容:

<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 文件作为构成您的解决方案的每个项目的一部分。

于 2009-01-29T23:50:53.813 回答
3

我为此使用powershell。lpath 是源代码的路径,而 buildnum 是我附加的内部版本号。这就是我实际上所做的一切。但是,它应该足以让您更改或设置任何或所有其他可用字段。我传入 lpath 并从 CC.NET 中的可用环境变量中获取内部版本号,我可以一遍又一遍地使用此脚本,只需更改我在配置文件的命令行中传入的内容。如果这实际上是您需要修改的,我还有一个可以修改 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)
}
于 2009-01-13T13:07:40.307 回答