【问题标题】:Is it possible to use the same version for multiple dependencies in a csproj file?是否可以对 csproj 文件中的多个依赖项使用相同的版本?
【发布时间】:2021-12-16 18:32:44
【问题描述】:

我有一个 C# 项目 (.NET6),如下所示:

项目.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    ...
  </PropertyGroup>
  ...
  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="6.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.0" />
    ...
  </ItemGroup>
  ...
</Project>

是否有可能在一个地方维护这些依赖版本(它们都属于一起)?
类似于例如Maven allows by using a property?

问题是当我想更新时 - 例如到6.0.1 - 我总是必须一次更新所有依赖版本。这在使用像 Dependabot 这样的自动工具时尤其成问题,因为它们通常会为每个依赖项创建一个拉取请求,因为它们无法识别这些依赖项属于一起。

我也检查过,但到目前为止我没有找到任何其他解决方案,无论是在 StackOverflow 上还是在 Microsoft docs 中。

【问题讨论】:

    标签: c# csproj


    【解决方案1】:

    是的,这行得通。只需为版本使用一个变量。

    像这样:

    
      <PropertyGroup>
        <EntityFrameworkVersion>6.0.0</EntityFrameworkVersion>
      </PropertyGroup>
    
    <ItemGroup>
        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="$(EntityFrameworkVersion)" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="$(EntityFrameworkVersion)" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="$(EntityFrameworkVersion)" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="$(EntityFrameworkVersion)" />
        ...
      </ItemGroup>
    

    现在您只需编辑一行即可更新版本。我通常什至将变量定义移动到顶级 Directory.build.props 文件中,这样我只需要编辑一行即可更新解决方案中所有项目的版本。

    这个解决方案有两个可能的问题:

    • 我不确定(也从未真正测试过)dependabot 是否能够解决此问题。可能不是。
    • 根据经验,当解决方案很大时(许多项目具有此依赖项),更新Directory.build.props 文件通常会使 Visual Studio 崩溃。不过,在更改版本之前关闭它,一切都很好。

    【讨论】:

    • I normally even move the variable definition to the top-level Directory.build.props file 我不会这样做 - 这意味着您的解决方案中的每个项目都将具有相同的版本直接安装。我更希望通过 nuget 安装正确的版本来解决传递依赖关系......
    • @RB。也许“通常”不是正确的词。 “有时”会更好。我特别将它用于从解决方案中的许多项目(直接)引用的依赖项,并且我真的只想使用一个版本。
    • 你只需要在项目没有相互引用的情况下这样做——这将是一个不寻常的场景,但在这种情况下,我会使用这种方法。否则我认为将依赖项保留在项目文件中就不会那么令人惊讶了。
    【解决方案2】:

    首先,您可以简化引用,因为另外 2 个 are dependencies 将被自动包含在内。

    <ItemGroup>
        <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.0" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="6.0.0" />
    </ItemGroup>
    

    如果您确实希望他们共享版本,您可以为该版本定义一个属性:

    <PropertyGroup>
        <EfVersion>6.0.0</EfVersion>
    <PropertyGroup>
    
    <ItemGroup>
        <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="$(EfVersion)" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="$(EfVersion)" />
    </ItemGroup>
    

    但是,我不建议这样做 - 一旦您使用任何工具(如 Nuget 包管理器)来更新这些引用,您很可能会遇到问题(从内存中它会将 EfVersion 替换为具体的版本,但这将是特定于工具的实现细节)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多