是否可以在 .NET 标准库之间共享版本信息?



在典型的 .NET 应用中,产品和版本信息存储在"属性"文件夹下的AssemblyInfo.cs文件中,如下所示...

DLL Project
- Properties Folder
- AssemblyInfo.cs

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

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

然后,我们将所有共享值放在名为AssemblyInfo_Shared.cs的第二个文件中,该文件存储在项目的同级文件夹中。 然后,我们通过链接将该文件添加到每个项目的"属性"文件夹中(这是添加按钮时按钮上的小"向下"箭头(。

通过执行此操作,所有相关 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)

Project 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 共享相同的版本信息,因为在生成时公共文件与特定于项目的文件"合并"。 希望这是有道理的。

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

.NET Standard 是否有任何支持此功能的内容?

是的,你可以;o(

将一个名为">属性">的文件夹添加到每个项目根目录,并将链接添加到AssemblyInfo_Shared.cs

之后,您必须在每个.Net标准/核心项目配置中进行设置

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

您将在 https://github.com/SirRufo/SharedVersionTest 找到完整的解决方案

Rufo爵士的解决方案完全没问题,但这是另一种方式,通过新的项目格式实现。这使您可以自定义自动装配体生成。

您可以将Directory.Build.props文件放在项目的父目录中,它将自动包含在内。请参阅文档:

但是,现在,您可以在包含源代码的根文件夹中名为Directory.Build.props的单个文件中定义一个新属性,只需一步即可将新属性添加到每个项目。当 MSBuild 运行时,Microsoft.Common.props 会在目录结构中搜索 Directory.Build.props 文件(Microsoft.Common.targets会查找Directory.Build.targets(。如果找到一个,它将导入该属性。Directory.Build.props是一个用户定义的文件,它为目录下的项目提供自定义。

因此,您可以利用它来添加程序集信息:

<?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属性可能没有标记,但您将拥有程序集信息所需的一切以及其他一些内容。下面是 NuGet 相关属性的文档,但遗憾的是,目前程序集信息属性的唯一"文档"是此处的源代码(至少在解决此问题之前(。

然后,可以覆盖每个项目中所需的任何属性。

最新更新