使用 dotnet-outdated 维护项目 nuget 包版本

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 dotnet-outdated 维护项目 nuget 包版本相关的知识,希望对你有一定的参考价值。

使用 dotnet-outdated 维护项目 nuget 包版本

Intro

我们项目中或多或少都会有一些 NuGet 包,使用到 NuGet 包时,如何保证我们的 NuGet 包不会太旧呢?我们可以借助 dotnet-outdated 来检查项目中的 NuGet 包是否有更新

Sample

首先我们需要执行 dotnet tool install --global dotnet-outdated-tool 命令安装 dotnet-outdated 工具,命令安装好之后就会执行 dotnet-outdated 就可以分析当前解决方案/项目下的 NuGet 依赖是否是最新的,如果不是最新的会打印当前版本的信息和最新版本的信息

这只会打印版本更新信息,并不会直接更新,如果要更新包版本,只需要添加一个 -u 的选项即可,直接 -u 会更新所有不是最新的 package

CI Service

利用 dotnet-outdated 我们可以检测项目中引用的 NuGet 包是否有更新,也可以将其改造为一个 CI 服务,在 push 代码或者定期检查项目中引用的 NuGet 包是否有新版本,下面是我自定义的一个 Github Actions 示例:

name: dotnet-outdated

on:
  schedule:
    - cron:  '0 1 * * *'
  push:
    branches: 
      - "master"
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: Setup .NET 6
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: '6.0.x'
        include-prerelease: true
    - name: build
      run: dotnet build
    - name: install dotnet-outdated
      run: dotnet tool install --global dotnet-outdated-tool
    - name: Run dotnet-outdated
      run: dotnet-outdated -u
    - name: check for changes
      run: |
        if git diff --exit-code; then
          echo "has_changes=false" >> $GITHUB_ENV
        else
          echo "has_changes=true" >> $GITHUB_ENV
        fi
    - name: Build again
      if: $ env.has_changes == 'true' 
      run: dotnet build
    - name: Create Pull Request
      if: $ env.has_changes == 'true' 
      uses: peter-evans/create-pull-request@v3
      with:
        token: $ secrets.GITHUB_TOKEN 
        commit-message: "Update NuGet Packages"
        title: 'Update NuGet Packages'
        body: >
          This PR updates the outdated NuGet packages.
        labels: automated pr
        branch: update-nuget-dependencies
        base: $ github.ref 

基本执行过程是这样的,先 build 项目,然后安装 dotnet-outdated 工具并尝试更新项目中的 NuGet 包,然后通过 git diff 检测是否有文件变更,如果有变更则重新 build 项目看是否会失败,如果成功了,就提交变更并自动发起一个 PR

这种方式如果更新最新版本失败的话就会导致 CI 失败,如果不希望 CI 失败也可以改造更新版本后的 dotnet build,改造成下面的方式

- name: Build again
      if: $ env.has_changes == 'true' 
      run: |
        if dotnet build; then
          echo "has_breaking_changes=false" >> $GITHUB_ENV
        else
          echo "has_breaking_changes=true" >> $GITHUB_ENV
        fi
    - name: Create Pull Request
      if: $ env.has_breaking_changes == 'false' 
      uses: peter-evans/create-pull-request@v3
      with:
        token: $ secrets.GITHUB_TOKEN 
        commit-message: "Update NuGet Packages"
        title: 'Update NuGet Packages'
        body: >
          This PR updates the outdated NuGet packages.
        labels: automated pr
        branch: update-nuget-dependencies
        base: $ github.ref 

这样 dotnet build 失败的话就不会直接导致 CI 失败,并且也不会自动创建 PR,但是这样的话可能就不知道有更新了,还是建议使用第一种方式,让 CI 失败及时更新并修复失败

More

dotnet-outdated 除了上面的简单用法之外,还有更多小技巧

比如我们可以使用 --version-lock 来只更新小版本,比如使用 --version-lock=Major 只更新 Minor 版本的更新,举个栗子,4.0.0 只会更新到 4.x.x  版本,不会更新到 5.x.x 版本

另外可以指定 --pre-release 来指定使用预览版本的更新,默认会自动根据当前 NuGet 包的版本去决定是否使用预览版本,如果是预览版本是会使用预览版本,如果是稳定版则不会使用预览版,可以显式指定 -pre=Always/--pre-release=Always 来指定始终使用预览版本

我们也可以指定 -u:prompt 来一个一个提示更新

更多用法可以参考文档

References

  • https://github.com/dotnet-outdated/dotnet-outdated

  • https://github.com/OpenReservation/ReservationServer

  • https://github.com/OpenReservation/ReservationServer/blob/dev/.github/workflows/dotnet-outdated.yml

  • https://github.com/OpenReservation/ReservationServer/pull/56

  • https://github.com/WeihanLi/SparkTodo/blob/master/.github/workflows/dotnet-outdated.yml

以上是关于使用 dotnet-outdated 维护项目 nuget 包版本的主要内容,如果未能解决你的问题,请参考以下文章

使用 SBT 维护多项目模块

日常维护管理-DBA运维交接清单

请问在ASP.NET项目MVC4项目中可以使用jQuery.i18n.properties 实现 Web 前端的国际化吗?

项目一众筹网02_5_管理员维护(分页 和 管理员的增删改查)——管理员维护我们使用同步,角色维护我们使用异步(ajax)

使用 git 为我的项目维护骨架的最佳方法

第四次软件工程项目---结对编程