我花了几个小时的时间试图找到一种在.NETCoreApp 1.1(Visual Studio 2017)中自动增加版本的方法 .
我知道AssemblyInfo.cs是在文件夹中动态创建的: obj/Debug/netcoreapp1.1/
它不接受旧方法: [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.*")]
如果我将项目设置为包我可以在那里设置版本,但这似乎用于构建AssemblyInfo.cs文件 .
我的问题是,有没有人想出如何控制.NET Core(或.NETStandard)项目中的版本 .
13 回答
我一直在使用csproj配置格式为VS2017中的Net Core应用程序寻找版本增量器 .
我找到了一个名为dotnet bump的项目,该项目适用于project.json格式,但很难找到.csproj格式的解决方案 . 作者dotnet bump实际上提出了.csproj格式的解决方案,它被称为MSBump .
在GitHub上有一个项目:
https://github.com/BalassaMarton/MSBump
在那里你可以看到Nuget上的代码及其可用的代码 . 只需在Nuget上搜索MSBump .
如果你're using Visual Studio Team Services/TFS or some other CI build process to has versioning built-in, you can utilize msbuild' s
Condition
属性,例如:这将告诉.NET Core编译器使用
BUILD_BUILDNUMBER
环境变量中的任何内容(如果存在),或者如果您在本地计算机上进行构建,则回退到0.0.1-local
.Add <Deterministic>False</Deterministic> 在.csproj的
<PropertyGroup>
部分内使AssemblyVersion *工作的解决方法在“Confusing error message for wildcard in [AssemblyVersion] on .Net Core #22660”中描述
.Net核心开发人员认为http://blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html和Compilers should be deterministic: same inputs generate same outputs #372中描述的确定性构建有益的原因
但是,如果您正在使用TeamCity,TFS或其他CI / CD工具,最好保持版本号受控制并增加它们并将其作为参数传递给构建(如在其他答案中所建议的那样),例如,
包裹编号for NuGet packages
我提出了与旧的 AssemblyVersion 属性几乎相同的解决方案与星号() - AssemblyVersion(“1.0 . ”)
AssemblyVersion和AssemblyFileVersion的值在MSBuild项目 .csproj 文件中(不在AssemblyInfo.cs中)作为属性 FileVersion (生成AssemblyFileVersionAttribute)和 AssemblyVersion (生成AssemblyVersionAttribute) . 在MSBuild过程中,我们使用自定义MSBuild任务生成版本号,然后使用来自task的新值覆盖这些 FileVersion 和 AssemblyVersion 属性的值 .
首先我们创建自定义MSBuild任务 GetCurrentBuildVersion :
任务类从 Microsoft.Build.Utilities.Core NuGet包继承 Microsoft.Build.Utilities.Task 类 . 它在输入上使用BaseVersion属性(可选)并在Version输出属性中返回生成的版本 . 获取版本号的逻辑与.NET自动版本控制相同(内部版本号是自2000年1月1日起的天数,而修订版是午夜后的半秒) .
要构建此MSBuild任务,我们在此类中使用 .NET Standard 1.3 class library 项目类型 .
.csproj文件可能如下所示:
这个任务项目也可以在我的GitHub中找到 holajan/DC.Build.Tasks
现在我们设置MSBuild来使用此任务并设置 FileVersion 和 AssemblyVersion 属性 . 在.csproj文件中,它看起来像这样:
Importtant things here:
提到 UsingTask 从 DC.Build.Tasks.dll 导入GetCurrentBuildVersion任务 . 它假定此dll文件位于.csproj文件的父目录中 .
我们的 BeforeBuildActionsProject1 调用任务的目标必须具有每个项目的唯一名称,以防我们在解决方案中有更多项目调用GetCurrentBuildVersion任务 .
此解决方案的优点是它不仅可以从构建服务器上构建,还可以在dotnet构建或Visual Studio的手动构建中工作 .
现在,这些值在
.csproj
文件中设置:如果您进入项目设置的“包”选项卡,则这些值与您看到的值相同 . 虽然我认为您不能使用
*
来自动增加版本,但您可以做的是引入一个后处理步骤来替换您的版本(例如,作为持续集成的一部分) .dotnet build /p:AssemblyVersion=1.2.3.4
我回答说:“有没有人想出如何控制.NET Core(或.NETStandard)项目中的版本 . ”我发现这个问题试图在CI构建的上下文中解决这个问题 . 我想将程序集版本设置为CI内部版本号 .
我做了一个简单的CLI工具来设置.csproj .NET Core版本字符串here . 您可以将它与GitVersion等工具结合使用,以便在CI构建期间实现自动版本冲突,如果之后的话 .
您可以使用MSBuild属性函数根据当前日期设置版本后缀:
这将输出一个名为PackageName.1.0.0-pre20180807-1711.nupkg的包 .
有关MSBuild属性函数的更多详细信息:https://docs.microsoft.com/en-us/visualstudio/msbuild/property-functions
我接受了上面的答案,因为@Gigi是正确的(截至目前),但我很恼火,并提出了以下PowerShell脚本 .
首先,我在我的解决方案文件夹(UpdateBuildVersion.ps1)中有脚本:
我把它添加到csproj文件中:
即使将其设置为PreBuildEvent,事实上版本号在文件加载到内存之后才会更新,因此版本号在下一次构建之前不会反映出来 . 实际上,您可以将其更改为PostBuildEvent,它将具有相同的效果 .
我还创建了以下两个脚本:(UpdateMinorVersion.ps1)
(UpdateMajorVersion.ps1)
To enable versioning of your .Net Core / .Net Whatever project based on your GIT setup, using the tags/describe functionality of GIT.
我一直在使用Prebuild.targets.xml文件,该文件位于项目的根文件夹中,并包含在csproj文件中,如:
使用“GenerateAssembyInfo”标记禁用自动装配信息生成 .
然后Prebuild.targets.xml将生成一个CommonAssemblyInfo.cs文件,您可以根据您的GIT版本包含所需的版本标签
注意:我在其他地方找到了Prebuilds.targets.xml,所以没有打扰清理它 . )
Prebuild.targets.xml文件:
编辑:如果你正在使用MSBUILD建设
可能会给你带来麻烦,使用
代替
Visual Studio的自动版本扩展现在支持简单的用户界面中的.Net Core和.Net Standard自动增量 .
https://marketplace.visualstudio.com/items?itemName=PrecisionInfinity.AutomaticVersions
我认为来自@joelsand的Answer是设置在VSTS上运行的dotnet核心版本号的正确答案
要为此答案添加更多信息,
BUILD_BUILDNUMBER
实际上是predefined variable .事实证明,有两个版本的预定义变量 .
一个是build.xxxx,另一个是BUILD_XXXX .
您只能在cproj中使用
Environment Variable Name
.我们可以使用
dotnet publish -- version-suffix 1.2.3
的特殊参数对于文件版本:
对于版本:
https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?tabs=netcore21