65.9K
CodeProject 正在变化。 阅读更多。
Home

项目版本更新器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (20投票s)

2011年4月19日

CPOL

5分钟阅读

viewsIcon

54873

downloadIcon

1662

更新项目中 AssemblyInfo 文件中的 AssemblyVersion 和 FileVersion 属性。

引言

对 Visual Studio 的版本控制功能不满意?试试这个工具。

Using the Code

此代码所做的无非是读取项目的 AssemblyInfo 文件,并根据您选择的方法更新版本信息。它基本上设计为作为外部工具运行,或从生成事件中运行。

在下面的所有示例中,引号非常重要。

参数

  • -p = 项目名称
  • -f = 项目文件夹
  • -s = 版本方案

从命令行

updatever -p="MyProject.vbproj" -f="C:\Documents and Settings\userid\My Documents\
Visual Studio 2008\Projects\ProjectFolder\MyProject" -s="schemaname"

从 Visual Studio 作为外部工具

  • 启动 Visual Studio IDE
  • 转到“工具”
  • 选择“外部工具…”
  • 单击 Add
  • 标题 = 更新版本
  • 命令 = C:\SomeFolder\UpdateVer.exe
  • 参数 = -p="$(ProjectFileName)" -f="$(ProjectDir)" -s="schemaname"
  • 勾选“使用输出窗口”
  • 点击“确定”

作为生成前事件

  • 启动 Visual Studio IDE
  • 转到项目属性
  • 点击“编译”(VB) 或 “生成事件”(C#)
  • 点击“生成事件”(VB)
  • 在“生成前事件命令行”框中输入
    if not $(ConfigurationName) == DEBUG (
    "C:\SomeFolder\UpdateVer.exe" -p="$(ProjectFileName)" 
    -f="$(ProjectDir)"" -s="schemaname" 
    )

方法

方法执行实际的版本修订。下面给出了所提供方法的说明

  • ignore - 忽略该值并返回当前版本号
  • increment - 递增当前版本号
  • incrementeachday - 仅当日期大于存储在 AssemblyInfo 文件注释中的上一个版本更新时才递增
  • incrementreseteachday - 将继续递增版本号,但如果日期大于上一个版本更新,则将该值重置为 0
  • random - 选择一个随机版本号
  • dayvalue - 自 1900 年 1 月 1 日以来的天数
  • dayvaluefrom - 自方法级别元素中指定的参数值以来的天数
  • secondvalue - 自 1900 年 1 月 1 日以来的秒数
  • secondvaluefrom - 自方法级别元素中指定的参数值以来的秒数
  • fixed - 设置为方法级别元素中指定的参数值
  • year - 当前日期的年份
  • month - 当前日期的月份
  • day - 当前日期的日期
  • fromsubversion - 从 subversion 的修订中更新值

将方法组合起来用于每个版本部分,这使得它非常灵活。例如,您可以拥有以下方案

<schema name="fixed_increment_build_each_day">
    <detail name="assembly/file">
        <level name="major" parameter="2" method="fixed"/>
        <level name="minor" parameter="3" method="fixed"/>
        <level name="build" method="incrementeachday"/>
        <level name="revision" method="incrementreseteachday"/>
    </detail>
</schema>

这将为主版本和次版本设置固定编号,每天将递增生成号,并且每次编译都会递增修订号,但每天重置为 0。因此,您的版本可能是 2.3.15.5,一天编译 5 次,使版本变为 2.3.15.10,但第二天第一次编译时,版本将是 2.3.16.0,因为生成号(每天)递增且修订号重置。如果您想跟踪编译的日期,可以将生成方法更改为“dayvalue”,您将始终知道编译的日期。此方案还保持程序集版本和文件版本同步,前提是它们最初相同。

版本号方法硬编码在 UpdateMethods.vb 文件中。我提供了源代码,所以如果您想使用其他方法,请编写代码并重新编译。您还需要在 ProjectData 类中的 ProcessMethod 方法中添加对新创建方法的调用。

请在此分享任何新的方法源代码供他人使用,它们将被包含在未来的版本中。我将不时用新方法和/或方案更新代码。

模式

提供了几个预定义的方案。您可以创建更多...只需将它们添加到 VersionSchemas.xml 文件中。

您可以通过在方案的两个不同的详细信息部分中指定“assembly”和“file”作为名称,来指定程序集和文件版本使用不同的方法。如果您想对程序集和文件版本使用相同的方法,请将名称指定为“assembly/file”。要保持程序集和文件版本同步,请确保在调用之前版本是相同的。

更新

04/20/2011

您现在可以在项目文件中指定方案。将以下元素放置在根项目元素中的某个位置

  <projectextensions>
    <compile name="UpdateVersion">
<[CDATA[
<schema name="fixed_increment_build_each_day">
    <detail name="assembly/file">
        <level name="major" parameter="2" method="fixed"/>
        <level name="minor" parameter="3" method="fixed"/>
        <level name="build" method="incrementeachday"/>
        <level name="revision" method="incrementreseteachday"/>
    </detail>
</schema>
]]>
    </compile>
  </projectextensions>

这使得您可以将版本更新方法保留在项目本身中,而不是保留在 VersionSchemas.xml 文件中。这也能确保当该项目被多个安装了该应用程序的开发人员共享时,会使用相同的方案。

04/27/2011

添加了新方法(FromSubversion)(由 Steve Pinckney 建议)以支持 subversion。

感谢 CollabNet 上的 SharpSVN 项目提供的 subversion 二进制文件。

11/11/2011

如果您在创建新项目时未将版本号从默认的 1.0.* 更改为 1.0.0.0,则会发生错误。另外,我注意到 Visual Studio 2010 在创建某些 AssemblyInfo 文件时,将 AssemblyFileVersion 条目称为 AssemblyFileVersionAttribute。如果您在运行应用程序时收到错误,请检查这一点,看看是否是这种情况。只需将其更改为 AssemblyFileVersion 即可正常工作。

异常行为

当作为外部工具操作现有项目时,如果 AssemblyInfo 文件未在 IDE 中显示,则会抛出异常。如果您在编辑器中显示文件并以外部工具的形式运行应用程序,则不会抛出异常,并且 AssemblyInfo 文件将正确更新。我本以为会是相反的情况。显然,IDE 在不编辑文件时会独占打开该文件,但在编辑时会移除锁定。总之,如果您将其用作工具,请记住这一点。

关注点

代码没有什么特别有趣的地方。只是觉得以防万一其他人想用,就提供一下。

历史

  • 原始:2011 年 4 月 19 日
  • 更新:2011 年 4 月 20 日 - 添加了将方案放入项目文件的功能
  • 更新:2011 年 4 月 27 日 - Subversion 修订支持
© . All rights reserved.