根据另一个引用包的版本动态分配 C# 项目的版本

问题描述 投票:0回答:1

我想根据

Version
Version
属性设置 C# 项目的
PackageReference
属性。

也就是说,在我的项目中,我引用了版本

"A"
的包
"1.2.3.4"
:

<ItemGroup>
    <PackageReference Include="A" Version="1.2.3.4" />
</ItemGroup>

并且我希望对引用的包Version

"A"
属性有一个
引用
,并将其分配给项目版本的值:

<PropertyGroup>
    <Version><!--use the version of "A"--></Version>
</PropertyGroup>

根据我在这里看到的语法,我尝试了几种方法:https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-items?view=vs-2022但这些都没有成功。

c# reference attributes version packagereference
1个回答
0
投票

您应该能够使用构建自定义来实现这一点,例如目录构建属性。我建议彻底阅读有关定制的部分,以了解概念、潜在陷阱、差异(例如

.props
.targets
之间)等。

注意: 如果您想使用例如Visual Studio 中的 NuGet 包管理器,并让它自动更新您的自定义值。在下面的示例中,如果您要转到 NuGet PM 视图并将包手动更新到 8.0.1,则

MicrosoftDependencyInjectionVersion
值不会更新 -
$(MicrosoftDependencyInjectionVersion)
值将直接在 csproj 中被 8.0.1 覆盖- 文件,不在您的
.props
文件中。

示例

在项目的根目录下创建一个名为

Directory.Build.props
的文件,其中包含以下内容:

<Project>
  <PropertyGroup>
      <MicrosoftDependencyInjectionVersion>8.0.0</MicrosoftDependencyInjectionVersion>
  </PropertyGroup>
</Project>

您可以使用

8.0.0
(或任何您命名的属性)从项目文件中引用值
$(MicrosoftDependencyInjectionVersion)

项目文件中的示例用法:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <Version>$(MicrosoftDependencyInjectionVersion)</Version>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(MicrosoftDependencyInjectionVersion)" />
  </ItemGroup>

</Project>

以及该项目中的一个简单程序:

internal class Program
{
    private static void Main(string[] _)
    {
        var assembly = Assembly.GetExecutingAssembly();
        Console.WriteLine(assembly.FullName);
        var diAssembly = Assembly.GetAssembly(typeof(Microsoft.Extensions.DependencyInjection.ServiceCollection));
        Console.WriteLine(diAssembly?.FullName ?? "di assembly is null");
    }
}

应输出:

ConsoleApp21, Version=8.0.0.0, Culture=neutral, PublicKeyToken=null
Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60

文件的版本信息也应该告诉你同样的信息:

© www.soinside.com 2019 - 2024. All rights reserved.