使用 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-outdatedon:schedule:- cron: '0 1 * * *'push:branches: - "master"
jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v1- name: Setup .NET 6uses: actions/setup-dotnet@v1with:dotnet-version: '6.0.x'include-prerelease: true- name: buildrun: dotnet build- name: install dotnet-outdatedrun: dotnet tool install --global dotnet-outdated-tool- name: Run dotnet-outdatedrun: dotnet-outdated -u- name: check for changesrun: |if git diff --exit-code; thenecho "has_changes=false" >> $GITHUB_ENVelseecho "has_changes=true" >> $GITHUB_ENVfi- name: Build againif: ${{ env.has_changes == 'true' }}run: dotnet build- name: Create Pull Requestif: ${{ env.has_changes == 'true' }}uses: peter-evans/create-pull-request@v3with:token: ${{ secrets.GITHUB_TOKEN }}commit-message: "Update NuGet Packages"title: 'Update NuGet Packages'body: >This PR updates the outdated NuGet packages.labels: automated prbranch: update-nuget-dependenciesbase: ${{ github.ref }}
基本执行过程是这样的,先 build 项目,然后安装 dotnet-outdated
工具并尝试更新项目中的 NuGet 包,然后通过 git diff
检测是否有文件变更,如果有变更则重新 build 项目看是否会失败,如果成功了,就提交变更并自动发起一个 PR
这种方式如果更新最新版本失败的话就会导致 CI 失败,如果不希望 CI 失败也可以改造更新版本后的 dotnet build
,改造成下面的方式
- name: Build againif: ${{ env.has_changes == 'true' }}run: |if dotnet build; thenecho "has_breaking_changes=false" >> $GITHUB_ENVelseecho "has_breaking_changes=true" >> $GITHUB_ENVfi- name: Create Pull Requestif: ${{ env.has_breaking_changes == 'false' }}uses: peter-evans/create-pull-request@v3with:token: ${{ secrets.GITHUB_TOKEN }}commit-message: "Update NuGet Packages"title: 'Update NuGet Packages'body: >This PR updates the outdated NuGet packages.labels: automated prbranch: update-nuget-dependenciesbase: ${{ 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