可以在 .NET Standard 库之间共享版本信息吗?

Can you share version information between .NET Standard libraries?

在典型的 .NET 应用程序中,产品和版本信息存储在 'Properties' 文件夹下的 AssemblyInfo.cs 文件中,就像这样...

DLL Project
 - Properties Folder
    - AssemblyInfo.cs

在我们的例子中,我们有一个解决方案,我们需要在 11 个 DLL 之间保持版本信息同步。

为此,我们首先从每个项目的 AssemblyInfo.cs 文件中删除所有共享值,仅保留特定项目的特定值。

然后,我们将所有共享值放在名为 AssemblyInfo_Shared.cs 的第二个文件中,我们将其存储在项目文件夹的同级文件夹中。然后,我们通过 link 将该文件添加到每个项目的 'Properties' 文件夹(这是添加时按钮上的小 'down' 箭头。)

通过这样做,所有相关的 DLL 共享相同的版本信息,同时仍然保留特定于程序集的属性。当我们编辑单个文件并同时更新所有 11 个 DLL 的版本时,它使得保持一组版本化的 DLL 同步变得轻而易举。

这是它的样子...

Common Folder
  - AssemblyInfo_Shared.cs (Actual)

DLL Project A
 - Properties Folder
    - AssemblyInfo.cs // Only values specific to A
    - AssemblyInfo_Shared.cs (Link)

DLL Project B
 - Properties Folder
    - AssemblyInfo.cs // Only values specific to B
    - AssemblyInfo_Shared.cs (Link)

项目 A 中 AssemblyInfo.cs 的内容如下所示...

using System.Reflection;

[assembly: AssemblyTitle("SomeApp.LibA")]
[assembly: AssemblyDescription("This is the code for  A")]

这是项目 B 的

using System.Reflection;

[assembly: AssemblyTitle("SomeApp.LibB")]
[assembly: AssemblyDescription("This is the code for Project B")]

这是共享的...

using System;
using System.Reflection;
using System.Resources;
using System.Runtime.InteropServices;

[assembly: AssemblyProduct("SomeApp")]
[assembly: AssemblyVersion("1.4.3.0")]
[assembly: AssemblyFileVersion("1.4.3.0")]
[assembly: AssemblyCompany("MyCo")]
[assembly: AssemblyCopyright("Copyright (c) 2010-2018, MyCo")]
[assembly: ComVisible(false)]
[assembly: NeutralResourcesLanguage("en-US")]

[assembly: CLSCompliant(true)]

通过上述,两个 DLL 共享相同的版本信息,因为在构建时公共文件与项目特定文件 'merged'。希望这是有道理的。

但是,在 .NET Standard 项目中,版本信息似乎直接烘焙到 <PropertyGroup> 部分下的项目文件中,所以我不确定我们如何才能实现相同的功能。

.NET Standard 有任何支持吗?

是的,你可以 ;o)

将名为 Properties 的文件夹添加到每个项目根目录并将 link 添加到 AssemblyInfo_Shared.cs

之后你必须在每个 .Net Standard/Core 项目配置中设置

<PropertyGroup>
  ...
  <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

您将在 https://github.com/SirRufo/SharedVersionTest

找到完整的解决方案

Rufo 爵士的解决方案非常好,但这里有另一种方法,可以通过新的项目格式实现。这使您可以自定义自动程序集生成。

您可以将 Directory.Build.props 文件放在项目的父目录中,它会自动包含在内。见 the documentation:

However, now you can add a new property to every project in one step by defining it in a single file called Directory.Build.props in the root folder that contains your source. When MSBuild runs, Microsoft.Common.props searches your directory structure for the Directory.Build.props file (and Microsoft.Common.targets looks for Directory.Build.targets). If it finds one, it imports the property. Directory.Build.props is a user-defined file that provides customizations to projects under a directory.

所以您可以利用它来添加您的程序集信息:

<?xml version="1.0" encoding="utf-8"?>
<Project>
  <PropertyGroup>
    <Version>1.4.3.0</Version>
    <Product>SomeApp</Product>
    <Company>MyCo</Company>
    <Copyright>Copyright (c) 2010-2018, MyCo</Copyright>
  </PropertyGroup>
</Project>

CLSCompliant 属性可能没有标签,但您将拥有组装信息和其他一些东西所需的一切。 Here are the docs for NuGet-related properties, but unfortunately, right now the only "documentation" for assembly info properties is the source code here (until this issue 至少解决了)。

然后您可以在每个项目中覆盖您想要的任何 属性。