我想存储一组在构建时自动递增的整数:
int MajorVersion = 0;
int MinorVersion = 1;
int Revision = 92;
Run Code Online (Sandbox Code Playgroud)
当我编译时,它会自动增加Revision.当我构建安装项目时,它会增加MinorVersion(我可以手动执行此操作).MajorVersion只会手动增加.
然后我可以在菜单Help/About中向用户显示版本号:
Version: 0.1.92
怎么能实现这一目标?
这个问题不仅要求如何使用自动递增版本号,还要求如何在代码中使用它,这是一个比其他更完整的答案.
我希望我的应用程序的version属性为每个构建增加,但我不确定如何在Visual Studio(2005/2008)中启用此功能.我试图将AssemblyVersion指定为1.0.*但它并没有让我得到我想要的.
我也使用了一个设置文件,并且在早期的尝试中,当程序集版本发生更改时,我的设置被重置为默认值,因为应用程序在另一个目录中查找了设置文件.
我希望能够以1.1.38的形式显示版本号,因此当用户发现问题时,我可以记录他们正在使用的版本,并告诉他们如果他们有旧版本则升级.
还将理解版本控制如何工作的简短说明.构建和修订号何时增加?
升级到csproj以使用Visual Studio 2017和Microsoft.NET.Sdk后,我的"BeforeBuild"和"AfterBuild"目标不再运行.我的文件看起来像这样:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
<!-- my targets that don't run -->
<Target Name="BeforeBuild">
<Message Text="Should run before build" Importance="High" />
</Target>
<Target Name="AfterBuild">
<Message Text="Should run after build" Importance="High" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud) 我有一个VS2008安装项目,它创建一个安装WinForms应用程序(C#)的setup.msi.
每次更新版本号时,用户首先必须卸载以前的版本才能安装新版本.否则我们得到可怕的"此产品的另一个版本已安装"消息.
这是我在构建新版本安装程序时已经在做的事情:
然而它仍然拒绝卸载以前的版本.那么,我错过了什么?或者我做错了什么?
谢谢!
只是想知道.NET构建版本化的最佳方法是什么?
我用:
我想设置版本:
理想的版本号将允许跟踪已安装的软件回到确切的源代码.
就像是:
<Major>.<Minor>.<TFS_changeset_number>
Run Code Online (Sandbox Code Playgroud)
我希望在解决方案附近的版本控制中存储一些简单文本\ XML文件的前两部分版本,因为我相信它们应该共存.开发人员将手动更新此文件(例如,遵循语义版本控制方法).每个构建都将读取此版本文件,从调用CI工具获取3d版本的部分,并使用该版本更新所有必需的文件.
实现这个的最佳方法是什么?
我过去曾使用过几种方法:
1)执行此版本的NAnt\MsBuild包装器,然后调用MsBuild获取解决方案.它可以从CI工具(Jenkins\TeamCity\etc)调用.
问题 - 当我构建解决方案两次时,与TFS门控签入的集成很难看.
2)自定义TFS构建过程模板
问题 - 它不是那么简单,并导致一些合并工作TFS升级.此外,在门控签到中还不存在变更集编号,因此我们只能使用先前的变更集ID.
3)解决方案中的单独MsBuild项目,它仅执行此版本控制任务,并配置为首先在VS解决方案的项目构建顺序中运行.
问题 - 需要在所有其他项目(包括所有未来的项目)中引用这个元项目,这些项目感觉很难看
我知道不同的MsBuild和TFS扩展包可以简化更新.这个主题不是关于哪一个是最好的.问题是方法论而不是技术问题.
我还认为,如果微软在其标准TFS构建模板中包含版本控制功能,那将是理想的选择.其他CI工具已经具有此功能(AssemblyInfo修补程序).
更新11/09/2014
我决定明确表达符合敏捷\持续交付最佳实践的版本控制原则:
1)能够再现任何历史建筑
2)由于1)并且根据CD原则,所有内容(源代码,测试,应用程序配置,环境配置,构建\包\部署脚本等)都存储在版本控制下,因此具有分配给它的版本
3)版本号与其适用的源代码紧密存储在一起
4)人们可以根据他们的业务\营销逻辑更新版本
5)该版本只有一个主副本,用于自动构建\包装过程的所有部分
6)您可以轻松地说出目标系统上当前安装了哪个版本的软件
7)已安装软件的版本必须明确标识用于构建它的源代码
8)比较版本比较低,哪些更高,以控制允许哪些升级\降级方案及其实现细节是非常简单的
更新15/09/2014
请看下面我自己的答案.
我很幸运能找到满足我所有要求的解决方案!
我们将在每个库中的Assembly.cs中找到Assembly版本.
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Run Code Online (Sandbox Code Playgroud)
我的问题是这是什么1.0.0.0意思?
谢谢
我有一种情况,我希望版本控制在构建时是动态的.
版本模式: <year>.<month>.<day>.<hhmm>
但我已经读过在编译时重新分析属性中使用的String值的位置.
有关如何完成动态版本控制的任何建议吗?
理想情况:
<Assembly: AssemblyVersion("4.0.0.0")>
<Assembly: AssemblyFileVersion(Year(Now) & "." & Month(Now()) & "." & Day(Now()) & "." & String.format("hhmm", now()))>
Run Code Online (Sandbox Code Playgroud)
我知道它不会工作,但应该得到交叉点.
如何以编程方式将给定版本的数字增加到最高版本的下一个版本?
例如,如果我有一个文件Program.exe具有以下版本号:
Program.exe 1.0.0.0
Program.exe 1.0.0.4
Program.exe 1.1.0.76
Program.exe 1.0.0.66
Run Code Online (Sandbox Code Playgroud)
在这种情况下,下一个版本号将是1.1.0.77
实现这一目标的最简单方法是什么?
在此先感谢您的帮助
我意识到程序集的构建/修订版号可以通过更改自动递增
[assembly: AssemblyVersion("1.0.0.0")]
Run Code Online (Sandbox Code Playgroud)
至
[assembly: AssemblyVersion("1.0.*")]
Run Code Online (Sandbox Code Playgroud)
在AssemblyInfo.cs文件中.
但是如何自动增加Package.appxmanifest中定义的版本号?也就是说,版本号可通过以下方式访问:
Windows.ApplicationModel.Package.Current.Id.Version
Run Code Online (Sandbox Code Playgroud)
我正在使用Visual Studio 2013.
编辑:不应该被标记为重复,我问的是包版本而不是汇编版本.
在C#3.0中,我有一个属性,假设包含该类的版本.版本号只是编译的日期和时间.现在,我有以下代码:
public DateTime Version
{
get { return DateTime.UtcNow; }
}
Run Code Online (Sandbox Code Playgroud)
显然,这是错误的,因为此属性返回当前日期和时间.那么,预编译器是否可以在编译时打印 DateTime?在这种情况下,我可以做类似于下面的事情.
public DateTime Version
{
get { return new DateTime("PRECOMPILER DATE"); }
}
Run Code Online (Sandbox Code Playgroud) c# ×8
.net ×4
versioning ×3
msbuild ×2
vb.net ×2
.net-core ×1
asp.net ×1
assemblies ×1
assemblyinfo ×1
csproj ×1
installation ×1
tfs ×1
winforms ×1
wix ×1