设置 .NET Core 项目的版本号 - CSPROJ - 而不是 JSON 项目

2023-12-23

这个问题非常类似于设置.NET Core项目的版本号 https://stackoverflow.com/questions/36057041/setting-the-version-number-for-net-core-projects,但不一样。使用撰写本文时最新的稳定版本 .NET Core (1.1) 和 VS2017,.NET Core 已从基于 JSON 的项目文件切换为 CSPROJ 文件。

所以 - 我想做的是建立一个 CI 环境,我希望能够在其中修改某物在构建之前用正确的版本号标记我的构建。

如果我使用像这样的旧属性(SharedAssemblyInfo.cs 技巧):

[assembly: AssemblyFileVersion("3.3.3.3")]
[assembly: AssemblyVersion("4.4.4.4")]

在项目的某个地方,我得到
CS0579 - Duplicate 'System.Reflection.AssemblyFileVersionAttribute'
and
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 包 - 我更喜欢有一种对所有内容进行版本控制的方法,这就像旧的 JSON 项目,我可以在其中更新单个文件。

UPDATE我将编写对 CSPROJ 文件的更改脚本,在我看来,这相当老套,因为我需要修改的部分看起来像这样......

<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) 中的自动版本控制 https://stackoverflow.com/questions/43019832/auto-versioning-in-visual-studio-2017-net-core) - 我以前没有见过这个问题,现在阅读它似乎几乎相同,只是我不想设置版本号。另外,这个问题的答案并不能解决我的问题 - 只问我在问题中问的问题。我的问题所接受的答案正是我解决问题所需的答案 - 因此,虽然另一个问题首先出现并且看起来相同 - 它根本对我没有帮助。也许 mod 可以提供帮助?


您可以通过传递来覆盖命令行中的任何属性/p:PropertyName=Value作为参数dotnet restore, dotnet build and dotnet pack.

目前,版本组成的工作方式如下: 如果Version未设置,使用VersionPrefix(如果未设置,则默认为 1.0.0)并且 - 如果存在 - 追加VersionSuffix.

所有其他版本都默认为任何版本Version is.

例如你可以设置<VersionPrefix>1.2.3</VersionPrefix>在你的.csproj然后打电话dotnet pack --version-suffix beta1生产一个YourApp.1.2.3-beta1.nupkg(如果您有一个项目引用,并且希望也应用版本后缀,则需要调用dotnet restore /p:VersionSuffix=beta1在此之前 - 这是工具中的一个已知错误)。

当然,您也可以使用自定义变量,参见这个 GitHub 问题 https://github.com/dotnet/cli/issues/4859举几个例子。

有关受支持的程序集属性的完整参考,我建议查看构建逻辑的源代码here https://github.com/dotnet/sdk/blob/1f1485fc216cd87b0289737eb7fe7de417335022/src/Tasks/Microsoft.NET.Build.Tasks/build/Microsoft.NET.GenerateAssemblyInfo.targets#L56-L85(被包围的值$()是所使用的属性)。 既然我已经谈论了来源,this https://github.com/dotnet/sdk/blob/1f1485fc216cd87b0289737eb7fe7de417335022/src/Tasks/Microsoft.NET.Build.Tasks/build/Microsoft.NET.DefaultAssemblyInfo.targets是组成版本和其他一些属性的逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置 .NET Core 项目的版本号 - CSPROJ - 而不是 JSON 项目 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 按成员序列化

    我已经实现了template
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐