Jay*_*Jay 48 versioning continuous-integration .net-core asp.net-core
此问题与设置.NET Core项目的版本号非常相似,但不相同.在编写(1.1)和VS2017时,使用最新的稳定版.NET Core,.NET Core已从基于JSON的项目文件切换到CSPROJ文件.
所以 - 我想要做的是建立一个CI环境,我希望能够在构建之前修改某些内容,以使用正确的版本号标记我的构建.
如果我使用这样的属性旧(SharedAssemblyInfo.cs技巧):
[assembly: AssemblyFileVersion("3.3.3.3")]
[assembly: AssemblyVersion("4.4.4.4")]
某处项目时,我得到的
CS0579 - Duplicate 'System.Reflection.AssemblyFileVersionAttribute'
和
CS0579 - Duplicate 'System.Reflection.AssemblyVersionAttribute'
错误的时候建设.
在深入挖掘它时,我发现在构建过程中有一个看起来像这样的文件(在构建之前它不存在)\obj\Debug\netcoreapp1.1:
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyDescriptionAttribute("Package Description")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.99.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.99")]
[assembly: System.Reflection.AssemblyProductAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyTitleAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.1.99.0")]
// Generated by the MSBuild WriteCodeFragment class.
问题 - 我该怎么做?
所以我可以看到这必须以某种方式从项目属性"包页面"中输入的值生成,但我不知道在我的CI机器上更改这些值的正确方法是什么.
理想情况下,我希望能够在我的(Jenkins)CI脚本中指定所有这些信息,但我决定只能设置版本号.
编辑 - 更多信息
 
在阅读完第一个答案之后,我想明确表示我正在创建服务和NuGET包 - 而且我更愿意使用1种方式对所有内容进行版本控制,这就像旧的JSON项目,我可以更新单个文件.  
更新 我要编写一个更改CSPROJ文件的脚本,在我看来相当hacky,因为我需要修改的部分看起来像这样......
<PropertyGroup>
 <OutputType>Exe</OutputType>
 <TargetFramework>netcoreapp1.1</TargetFramework>
 <Version>1.0.7777.0</Version>
 <AssemblyVersion>1.0.8888.0</AssemblyVersion>
 <FileVersion>1.0.9999.0</FileVersion>
 <Company>MyCompany</Company>
 <Authors>AuthorName</Authors>
 <Product>ProductName</Product>
 <Description />
 <Copyright>Copyright © 2017</Copyright>
</PropertyGroup>
所以 - 这里的问题是有多个'PropertyGroup'元素; 其他人似乎被贴上了标签 - 但不知道CSPROJ是如何组合在一起的,我不能说这种情况总是如此.
我的工作前提是将始终填充包详细信息,否则值标记(上面)不会出现在XML中 - 因此我可以使用脚本来更新适当的值.如果没有值标签,我将不清楚将值插入哪个PropertyGroup元素(以及哪个顺序,因为这看起来很重要;更改顺序阻止我在VS2017中加载项目).
我仍然坚持要比这个更好的解决方案!
更新:有人将此问题标记为可能重复(在Visual Studio 2017(.NET Core)中自动版本控制) - 之前我没有看过这个问题,现在阅读它似乎几乎相同,除了我不想只是设置版本号.此外,这个问题的答案并没有解决我的问题 - 只询问我在问题中提出的问题.接受我的问题的答案正是我需要解决问题的答案 - 所以当另一个问题首先出现并且显得相同时 - 它根本没有帮助我.也许一个mod可以帮助?
Mar*_*ich 57
您可以通过将/p:PropertyName=Value参数传递给dotnet restore,dotnet build和来覆盖命令行中的任何属性dotnet pack.
目前,版本组合的工作原理如下:如果Version未设置,则使用VersionPrefix(如果未设置则默认为1.0.0)和 - 如果存在 - 追加VersionSuffix.
然后所有其他版本默认为任何版本Version.
例如,您可以<VersionPrefix>1.2.3</VersionPrefix>在csproj中设置然后调用dotnet pack --version-suffix beta1以生成一个YourApp.1.2.3-beta1.nupkg(如果您有项目引用,您也希望应用版本后缀,则需要dotnet restore /p:VersionSuffix=beta1在此之前调用- 这是工具中的已知错误) .
当然,您也可以使用自定义变量,请参阅此GitHub问题以获取一些示例.
有关受支持的程序集属性的完整参考,我建议在此处查看构建逻辑的源代码(包含的值$()是使用的属性).因为我已经在谈论源代码,所以这是组成版本和其他一些属性的逻辑.
Chr*_*zie 40
dotnet build /p:AssemblyVersion=1.2.3.4
那对你有用吗?
Ark*_*nic 14
对于那些正在寻找不同的自动化 (CI) 方法来执行此操作的人,请考虑在 .csproj 文件中使用基于环境变量的条件。例如,您通常可能有一个硬编码的版本前缀和一个基于时间戳的后缀。但是对于正确的版本,您可能希望将两者替换为您在 CI 构建期间设置的单个版本。为此,您可以在调用之前设置一个环境变量dotnet build:比方说,RELEASE_VERSION。
在 .csproj 文件中,在 a 下<PropertyGroup>,您将拥有以下内容:
<Version Condition="'$(RELEASE_VERSION)' != ''">$(RELEASE_VERSION)</Version>
<VersionPrefix Condition="'$(RELEASE_VERSION)' == ''">0.0.1</VersionPrefix>
<VersionSuffix Condition="'$(RELEASE_VERSION)' == ''">$([System.DateTime]::UtcNow.ToString(`yyyyMMdd-HHmm`))</VersionSuffix>
上述条件设置为,如果环境变量RELEASE_VERSION为空,则使用普通的前缀和后缀标签。但如果它不为空,则使用signular version 标签。
小智 8
我所做的就是在 .csproj 中
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <Deterministic>false</Deterministic>
    <AssemblyVersion>2.0.*</AssemblyVersion>
  </PropertyGroup>
</Project>
在 AssemblyVersion 中指定通配符,然后关闭确定性标志。将为通配符添加数字。
直接回答您的问题:msbuild的新SDK是自动生成程序集信息文件.您可以使用msbuild指令来抑制它(通过示例查看它:dotnet migrate在基于project.json的项目上调用).
但是让我告诉你我的处理:我有多个项目共享相同的版本.我添加了一个version.props文件,其中包含一个包含名为的项的属性组VersionPrefix.这个文件我通过csproj文件(Include语句)包含在内.我还删除了所有AssemblyInfo.cs文件,让SDK为我生成它们.
我version.props在构建期间修改了文件.
小智 6
如果您在项目文件中丢失了一些程序集信息,MsBuild 2017 将生成一些程序集信息。
如果您可以阅读 msbuild 目标文件,您可以查看:
[VS Install Dir] \MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.GenerateAssemblyInfo.targets
您将看到您可以使用项目文件中的某些属性来禁用生成的程序集信息,以防止与生成的工具重复。
<GenerateAssemblyInfo> (此属性将打开/关闭所有生成程序集信息)<GenerateAssemblyCompanyAttribute><GenerateAssemblyConfigurationAttribute><GenerateAssemblyCopyrightAttribute><GenerateAssemblyDescriptionAttribute><GenerateAssemblyFileVersionAttribute><GenerateAssemblyInformationalVersionAttribute><GenerateAssemblyProductAttribute><GenerateAssemblyTitleAttribute><GenerateAssemblyVersionAttribute><GenerateNeutralResourcesLanguageAttribute>就我而言,主键是/property:Version=1.2.3.4。然后以下命令行完成了该工作:
dotnet build SolutionName.sln -c Release /property:Version=1.2.3.4
这将覆盖程序集的默认版本。
| 归档时间: | 
 | 
| 查看次数: | 34193 次 | 
| 最近记录: |