【问题标题】:Tracking File-level Versioning in builds using Visual Studio and .NET?在使用 Visual Studio 和 .NET 的构建中跟踪文件级版本控制?
【发布时间】:2009-06-02 21:27:08
【问题描述】:

我想要一个工具或技术能够回答“什么版本的文件 X 用于构建 Assembly abc.dll?”这个问题。我最近搬到了一个 .NET 开发小组,似乎这个问题一直以一种或另一种形式出现,我们还没有完全掌握它。有人会说“嘿,你的最新代码在测试服务器上吗?”答案不可避免地类似于“我不知道”。

回到过去的 Unix 开发时代(我在这里约会自己),SCCS 源代码控制系统有 special keywords,例如 %I%(版本)和 %M%(模块名称),您可以将它们放入您的文件,只要文件被签出,就会被适当的 SCCS 版本信息替换。因此,您可以做的一个巧妙的技巧是在源文件中为“%I% %M%”分配一个常量字符串,编译,然后在生成的库上运行Unix "strings" command 以确定用于构建的文件的版本那个文件。

我在一个 C# 类文件中做了一个快速测试来滚动我自己,如下所示:

public const String VERSION_STRING = "*VERSION* = MyClass 1.0";

然后在我的 DLL 目录上运行这个命令行:

>for %f in (*.dll) do find "VERSION" %f

但结果是:

---------- MYASSEMBLY.DLL
VERSION_STRING

这不是我所追求的(它给了我常量的名称,但没有我试图手动嵌入到类中的版本信息)。

不管怎样,我们目前正在使用 Clearcase 进行版本控制(目前是公司标准)。 Clearcase 有一些工具可以帮助我们(例如clearaudit),但这需要一些努力来改进和重新构建我们的构建过程。我还应该提到我们正在考虑试行颠覆。因此,我猜想在任何各种版本控制系统或构建环境(MSBuild、NAnt、CruiseControl)中使用 .NET 的解决方案都是公平的游戏。

是否还有其他解决方案,尤其是以 .NET 为中心的解决方案,用于跟踪哪个文件的哪个版本进入哪个程序集?

【问题讨论】:

    标签: .net version-control assemblies versioning clearcase


    【解决方案1】:

    我们很快放弃了使用特殊关键字的想法,因为将元数据(如版本号)集成到数据(存储在 VCS 中的文件)中通常不是一个好主意(参见这个 SO 问题中的辩论:“ Embedded Version Numbers - Good or Evil?")

    我们的方法是使用此类信息构建“发行说明”。然后将这个简单的文本文件与构建 dll 一起存储。

    【讨论】:

    • 是的,我意识到对于 Clearcase,嵌入版本信息不是一个好的选择。太糟糕了,它不像 SCCS 或 RCS 那样工作,其中版本信息可以按需替换,但不存储在文件中。不过,在阅读了该链接之后,我可以看到该方法也可能存在一些问题。我想这就是为派生对象构建单独的“配置记录”的 Clearcase 方法变得非常有用的地方。 (如果你愿意的话,你甚至可以从配置记录中构建发布说明)。
    • @Ogre:确实,但在实践中,我们从未真正使用过 DO。在构建之后编写的更通用的版本列表对我们来说已经足够了。
    • 到目前为止提出的解决方案和答案中,我最喜欢这个。无论您使用的是 nant 还是 msbuild,自动化此类解决方案应该不会太难。
    【解决方案2】:

    我对 SubVersion 和 CC.NET 持续集成服务器有积极的体验。

    您已经设置了一个 NAnt 目标,该目标获取最新的(它可以在此处锁定存储库),然后构建。 build 完成后,在 SVN 中打一个版本标签。

    在构建时可以很容易地从标签的版本中推断出文件的版本。

    【讨论】:

    • Subversion 是否提供了一种方法来整合所有源文件标记的版本(a.cs、b.cs、c.cs),并以某种方式将所有这些信息附加到生成的 DLL文件? Clearcase 提供了这种能力(尽管我们还没有在这个项目中利用它),所以在我们试用或切换到不同的版本控制系统之前,我想看看我们得到了什么或失去了什么。
    • 存储库被标记为一个整体的修订号。每次签入时都会分配文件修订号。这些数字来自同一个池。因此,如果文件版本为 1、2、5、8、9 且构建标记版本为 7,则使用 rev 5 中的文件。
    • 对,我在 Subversion 和其他 VCS 上做了更多的阅读。似乎 Subversion 的该功能可以方便地确定何时进入构建(以及生成的程序集)。
    • 我们使用 MKS,就像 10 年前一样。不,我没那么老。我看过这些标签并讨厌它们。
    【解决方案3】:

    对于我的“社区”工作,我使用了一个简单的方案;我使用 SVN 修订号作为程序集的 [AssemblyVersion] / [AssemblyFileVersion] 属性中的构建版本。在运行时和通过资源管理器查询这些都非常容易,更新它们的脚本也很容易 - 前几个任务in here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-16
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 2018-02-15
      • 1970-01-01
      • 2019-04-16
      相关资源
      最近更新 更多