我想根据
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但这些都没有成功。
您应该能够使用构建自定义来实现这一点,例如目录构建属性。我建议彻底阅读有关定制的部分,以了解概念、潜在陷阱、差异(例如
.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