目录
介绍
我正在开发一个应用程序,我的思绪飘向了版本控制的主题。我看到他们对微软缺乏意愿(或者更有可能是他们没有能力)来解决开发人员普遍关心的问题——在项目构建时自动增加版本号而感到苦恼。过了一会儿,我想出了一种似乎完全按照我想要的方式工作的方法。
该项目是一个MVC 5(.Net Framework)Web应用程序,当我进行构建时,二进制文件将放入解决方案的bin文件夹中。此文件夹也与我的应用程序一起部署,正是这种认识触发了以下想法。
简而言之,我*忽略*程序集中定义的assembly.cs(毕竟,这是我们无法自动增加版本号的根源),而是依赖于bin文件夹中二进制文件的上次写入日期时间。真的就是这么简单。
这是因为除非重新编译程序集,否则给定程序集的文件日期不会更改。因此,使用F5在调试器下运行应用(不更改任何内容)的操作不会导致日期更改,更重要的是,仅运行应用不会导致文件日期更改,因为编译器未生成新的程序集。
我知道,这是半途而废的,因为这种方法行不通的各种原因(当您是新手并从源代码管理中获取最新代码并进行构建时,版本将与生产中的版本不同),但我从来没有说过这是最好的方法做到这一点。这只是一种方法。
使用代码
代码真的非常简单,我只是将该方法放入我调用Global的静态类中......
public static string AppVersion { get; set; }
// Using a file mask allows you to specify more than one
// file/extension as well as utilize wildcards, which
// makes the method usable in desktop apps as well.
public static void FindNewestBinary(string path, string fileMask)
{
DateTime date = new DateTime(2022, 01, 01);
try
{
DirectoryInfo dir = new DirectoryInfo(path);
FileInfo file = dir.GetFiles(fileMask)
.OrderByDescending(x=>x.LastWriteTime)
.FirstOrDefault();
if (file != null)
{
date = file.LastWriteTime;
}
}
catch (Exception)
{
}
int seconds = date.Hour * 60 +
date.Minute * 60 +
date.Second;
string fileDate = date.ToString("yyyy.MM.dd.");
Global.AppVersion = string.Format("{0}{1:00000}", fileDate, seconds);
}
}
...并从global.asax.cs文件中的Application_Start()方法调用它。
Global.FindNewestBinary(Server.MapPath(@"bin"), "*.dll");
然后每当我需要版本时,我只需引用Global.AppVersion属性,如下所示:
<span>@Global.AppVersion</span>
https://www.codeproject.com/Tips/5334159/Automatic-Versioning-How-I-Do-It