使用 Visual Studio 时可以自动增加文件构建版本吗?
-
21-08-2019 - |
题
我只是想知道我怎样才能 自动地 使用 Visual Studio (2005) 增加我的文件的构建(和版本?)。
如果我查找说的属性 C:\Windows\notepad.exe
, ,“版本”选项卡显示“文件版本:5.1.2600.2180”。我也想在我的 dll 版本中获得这些很酷的数字,而不是 1.0.0.0 版本,让我们面对它有点乏味。
我尝试了一些东西,但它似乎不是开箱即用的功能,或者也许我只是找错了地方(像往常一样)。
我主要从事网络项目......
我看了两者:
- http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
- http://www.codeproject.com/KB/dotnet/build_versioning.aspx
我简直不敢相信付出如此多的努力来做某事是标准做法。
编辑:据我所知,它在 VS2005 中不起作用(http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx)
解决方案
在 Visual Studio 2008 中,可以执行以下操作。
找到AssemblyInfo.cs文件并找到以下两行:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
您可以尝试将其更改为:
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]
但这不会给你想要的结果,你最终会得到一个产品版本 1.0.* 和文件版本 1.0.0.0. 。不是你想要的!
但是,如果删除其中的第二行并且只有:
[assembly: AssemblyVersion("1.0.*")]
然后编译器会将文件版本设置为等于产品版本,您将获得自动增量同步的产品和文件版本的所需结果。例如。 1.0.3266.92689
其他提示
打开AssemblyInfo.cs文件并更改
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
到
[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]
您可以在 IDE 中通过转到项目 -> 属性 -> 程序集信息来执行此操作
然而,这只允许您自动增加程序集版本,并为您提供
程序集文件版本:该字段中不允许使用通配符(“*”)
如果您尝试在文件版本字段中放置 *,则会出现消息框。
因此,只需打开 assemblyinfo.cs 并手动执行即可。
在每个版本中更改版本号的另一个选项是使用 版本 的任务 MSBuild.社区.任务. 。只需下载他们的安装程序,安装它,然后调整以下代码并将其粘贴到 <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
在你的 .csproj
文件:
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
<Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
<Output TaskParameter="Major" PropertyName="Major" />
<Output TaskParameter="Minor" PropertyName="Minor" />
<Output TaskParameter="Build" PropertyName="Build" />
<Output TaskParameter="Revision" PropertyName="Revision" />
</Version>
<AssemblyInfo CodeLanguage="CS"
OutputFile="Properties\VersionInfo.cs"
AssemblyVersion="$(Major).$(Minor)"
AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>
笔记: 将 StartDate 属性调整为您的区域设置。 它目前不使用不变区域性。
对于 2010 年 1 月 14 日的第三次构建,这将创建一个 VersionInfo.cs
包含以下内容:
[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]
然后必须将该文件添加到项目中(通过 添加现有项目),以及 AssemblyVersion
和 AssemblyFileVersion
必须从中删除行 AssemblyInfo.cs
.
更改版本组件的不同算法描述于 $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chm
和 版本属性.
我想出了一个类似于 Christians 的解决方案,但不依赖于社区 MSBuild 任务,这对我来说不是一个选择,因为我不想为我们所有的开发人员安装这些任务。
我正在生成代码并编译为程序集,并希望自动递增版本号。但是,我无法使用 VS 6.0.* AssemblyVersion 技巧,因为它每天自动递增内部版本号,并破坏与使用较旧内部版本号的程序集的兼容性。相反,我想要一个硬编码的 AssemblyVersion,但有一个自动递增的 AssemblyFileVersion。我通过在 AssemblyInfo.cs 中指定 AssemblyVersion 并在 MSBuild 中生成 VersionInfo.cs 来完成此操作,如下所示,
<PropertyGroup>
<Year>$([System.DateTime]::Now.ToString("yy"))</Year>
<Month>$([System.DateTime]::Now.ToString("MM"))</Month>
<Date>$([System.DateTime]::Now.ToString("dd"))</Date>
<Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
<AssemblyFileVersionAttribute>[assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
</PropertyGroup>
<Target Name="BeforeBuild">
<WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
</WriteLinesToFile>
</Target>
这将生成一个 VersionInfo.cs 文件,其中包含 AssemblyFileVersion 的 Assembly 属性,其中版本遵循带有构建日期的 YY.MM.DD.TTTT 架构。您必须将此文件包含在您的项目中并使用它进行构建。
安装 构建版本增量 加入。它为您提供了比 * 选项更多的控制。
要获取版本号,请尝试
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Reflection.AssemblyName assemblyName = assembly.GetName();
Version version = assemblyName.Version;
要设置版本号,请创建/编辑 AssemblyInfo.cs
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]
另请注意,第三个数字是自 2000 年 2 月 1 日以来的天数,第四个数字是当天总秒数的一半。所以如果你在午夜编译它应该为零。
如其他帖子中所述,在 AssemblyInfo 或项目属性下的版本号中设置 * 并不适用于所有版本的 Visual Studio / .NET。
Afaik 它在 VS 2005 中不起作用(但在 VS 2003 和 VS 2008 中)。对于 VS 2005,您可以使用以下命令: 编译时自动递增 Visual Studio 2005 版本构建和修订号.
但请注意,对于强名称程序集,不建议自动更改版本号。原因是每次重建引用的程序集时都必须更新对此类程序集的所有引用,因为强名称程序集引用始终是对特定程序集版本的引用。仅当接口发生更改时,Microsoft 本身才会更改 .NET Framework 程序集的版本号。(注意:我仍在 MSDN 中搜索我读到的链接。)
将递增 (DateTime) 信息获取到 AssemblyFileVersion 属性中,其优点是不会破坏任何依赖关系。
基于 Boog 的解决方案(对我不起作用,可能是因为 VS2008?),您可以使用预构建事件的组合来生成文件,添加该文件(包括其版本属性),然后使用一种方法来读出再次这些值。那是..
预建活动:
echo [assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs
将生成的 VersionInfo.cs 文件(Properties 子文件夹)包含到您的项目中
获取日期的代码(年到秒):
var version = assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);
不是很舒服..另外,我不知道它是否会创建大量的强制重建(因为文件总是会发生变化)。
例如,如果您每隔几分钟/几小时更新 VersionInfo.cs 文件(通过使用临时文件,然后在检测到足够大的更改时复制/覆盖真实的 VersionInfo.cs),则可以使其变得更智能。我曾经这样做过一次,相当成功。
将版本号设置为“1.0.*”,它将自动填充最后两个数字以及日期(从某个点开始的天数)和时间(从午夜开始的半秒)
它位于您的项目属性下 发布
蛋糕 支持AssemblyInfo 文件修补。有了蛋糕在手,你就有无限的方法来实现自动版本递增。
像 C# 编译器一样递增版本的简单示例:
Setup(() =>
{
// Executed BEFORE the first task.
var datetimeNow = DateTime.Now;
var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
var assemblyInfo = new AssemblyInfoSettings
{
Version = "3.0.0.0",
FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
};
CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});
这里:
- 版本 - 是汇编版本。最佳实践是锁定主要版本号并保留剩余的零(例如“1.0.0.0”)。
- FileVersion - 是程序集文件版本。
请注意,您不仅可以修补版本,还可以修补 还有所有其他必要的信息.
去项目|属性,然后汇编信息,然后汇编版本,然后将 *放在最后一个或第二次的框中(您无法自动提出主要组件或次要组件)。
使用 MSBuild 社区任务中的 AssemblyInfo 任务 (http://msbuildtasks.tigris.org/) 项目,并将其集成到您的 .csproj/.vbproj 文件中。
它有许多选项,包括将版本号与日期和时间联系起来的选项。
受到推崇的。
截至目前,对于我的申请,
string ver = Application.ProductVersion;
回报 ver = 1.0.3251.27860
值 3251 是自 2000 年 1 月 1 日以来的天数。我用它在应用程序的启动屏幕上放置版本创建日期。在与用户打交道时,我可以询问创建日期,这比一些长数字更容易沟通。
(我是一个支持一家小公司的单人部门。这种方法可能不适合你。)
更改 AssemblyInfo 在 VS2012 中有效。奇怪的是,Visual Studio 中对此没有更多支持,您可能会认为这是构建/发布过程的基本部分。
如何获取版本 {major}.{year}.1{date}.1{time}
这是一种实验性的,但我喜欢它。灵感来自 Jeff Atwood @CodingHorror (关联).
结果版本号变为 1.2016.10709.11641
(意思是2016-07-09 16:41),这允许
- 穷人的零填充(愚蠢的领先
1
) - 接近人类可读 当地的 嵌入版本号的日期时间
- 让主要版本单独进行真正重大的突破性更改。
将新项目添加到您的项目中,选择常规 -> 文本模板,将其命名为 CustomVersionNumber
并(如果适用)注释掉 AssemblyVersion
和 AssemblyFileVersion
在 Properties/AssemblyInfo.cs
.
然后,当保存该文件或构建项目时,这将重新生成一个 .cs
文件位于创建的子项目下 .tt
文件。
<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//
using System.Reflection;
<#
var date = DateTime.Now;
int major = 1;
int minor = date.Year;
int build = 10000 + int.Parse(date.ToString("MMdd"));
int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>
[assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
也许,对于此任务,您可以使用如下代码:
private bool IncreaseFileVersionBuild()
{
if (System.Diagnostics.Debugger.IsAttached)
{
try
{
var fi = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.GetDirectories("Properties")[0].GetFiles("AssemblyInfo.cs")[0];
var ve = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
string ol = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + ve.FileBuildPart.ToString() + "." + ve.FilePrivatePart.ToString();
string ne = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + (ve.FileBuildPart + 1).ToString() + "." + ve.FilePrivatePart.ToString();
System.IO.File.WriteAllText(fi.FullName, System.IO.File.ReadAllText(fi.FullName).Replace("[assembly: AssemblyFileVersion(\"" + ol + "\")]", "[assembly: AssemblyFileVersion(\"" + ne + "\")]"));
return true;
}
catch
{
return false;
}
}
return false;
}
并从表单加载中调用它。
使用此代码,您可以更新 AssemblyInfo.cs 中文件信息的任何部分(但必须使用“标准”目录结构)。
程序集信息工具. 。自由的。开源。
我正在使用这种方法 https://stackoverflow.com/a/827209/3975786 将 T4 模板放置在“解决方案项目”中,并在每个项目中将其与“添加为链接”一起使用。
也许现在回答已经太晚了,但希望这能解决某人的繁忙问题。
自动 使用 PowerShell 脚本更改所有项目的程序集版本的方法。 本文 将解决您的许多问题。
每次我进行构建时,它都会自动递增最低有效数字。
我不知道如何更新其他人,但你至少应该已经看到了......
我创建了一个应用程序来自动增加文件版本。
- 下载 应用
将以下行添加到预构建事件命令行
C: emp\IncrementFileVersion.exe $(SolutionDir)\Properties\AssemblyInfo.cs
构建项目
为了简单起见,应用程序仅在出现错误时抛出消息,要确认其正常工作,您需要检查“程序集信息”中的文件版本
笔记 :您必须在 Visual Studio 中重新加载解决方案,以便“程序集信息”按钮填充字段,但您的输出文件将具有更新的版本。
如需建议和请求,请发送电子邮件至 telson_alva@yahoo.com
在 Visual Studio 2019 中
这对我来说还不够添加
[assembly: AssemblyVersion("1.0.*")]
构建时它会抛出这个错误
指定的版本字符串不符合要求的格式
解决方案
我设置后格式终于被接受了 Deterministic
到 False
在 project.csproj
<Deterministic>false</Deterministic>
编辑:
由于某种原因设置 Deterministic
到 False
搞乱了我的配置文件加载并将其保存在不同的位置。
解决方法:
我设置了一个构建后事件来增加修订号:
构建后事件批处理脚本
这将调用名为的 powershell 脚本 autoincrement_version.ps1
传递路径作为参数 AssemblyInfo.cs
if $(ConfigurationName) == Release (
PowerShell -ExecutionPolicy RemoteSigned $(ProjectDir)autoincrement_version.ps1 '$(ProjectDir)My Project\AssemblyInfo.cs'
)
Powershell脚本
它使用正则表达式自动递增修订号
param( [string]$file );
$regex_revision = '(?<=Version\("(?:\d+\.)+)(\d+)(?="\))'
$found = (Get-Content $file) | Select-String -Pattern $regex_revision
$revision = $found.matches[0].value
$new_revision = [int]$revision + 1
(Get-Content $file) -replace $regex_revision, $new_revision | Set-Content $file -Encoding UTF8