项目版本更新器






4.82/5 (20投票s)
更新项目中 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 修订支持