如何使用dotnet CLI一次更新所有NuGet包?

时间:2016-12-10 21:57:25

标签: nuget visual-studio-code .net-core

我试图在VS Code(使用Mac)中更新所有NuGet包以获得解决方案。有没有办法在VS代码或特定的project.json文件中实现?目前我一个接一个地去,但我原本以为有延伸或功能可以为你做这个?

9 个答案:

答案 0 :(得分:2)

这是将执行此操作的shell脚本和powershell脚本

#!/bin/bash
regex='PackageReference Include="([^"]*)" Version="([^"]*)"'
find . -name "*.*proj" | while read proj
do
  while read line
  do
    if [[ $line =~ $regex ]]
    then
      name="${BASH_REMATCH[1]}"
      version="${BASH_REMATCH[2]}"
      if [[ $version != *-* ]]
      then
        dotnet add $proj package $name
      fi
    fi
  done < $proj
done

$regex = [regex] 'PackageReference Include="([^"]*)" Version="([^"]*)"'
ForEach ($file in get-childitem . -recurse | where {$_.extension -like "*proj"})
{
  $proj = $file.fullname
  $content = Get-Content $proj
  $match = $regex.Match($content)
  if ($match.Success) {
    $name = $match.Groups[1].Value
    $version = $match.Groups[2].Value
    if ($version -notin "-") {
      iex "dotnet add $proj package $name"
    }
  }
}

还应该提到Paket是支持更新的出色替代软件包管理器:

https://fsprojects.github.io/Paket/index.html

dotnet tool install paket --tool-path .paket

答案 1 :(得分:1)

我写了this powershell script是为了使软件包保持最新状态。
要更新该解决方案的所有软件包,请首先使用dotnet sln list
对于每个项目,我都会使用dotnet list package --outdated获得过时软件包的列表,它给出了每个过时软件包的最新版本。
对于每个软件包,我都使用dotnet add package {package name} --version {new version}更新项目。

完整代码:

# Update one project packages
function UpdatePackages {
    param (
        $project
    )

    $return = $false
    
    # Get outdated packages
    $packageLineList = dotnet list $project package --outdated
    
    foreach($line in $packageLineList) {
       Write-Host $line
       
       $match = $line -match '>\s(\S*)\s*\S*\s*\S*\s*(\S*)'
       if (!$match) {
          # the line doesn't contain a package information, continue
          continue
       }
       
       # update an outdated package
       $added = dotnet add $project package $Matches.1 --version $Matches.2

       if ($LASTEXITCODE -ne 0) {
           # error while updating the package
           Write-Error "dotnet add $project package $Matches.1 --version $Matches.2 exit with code $LASTEXITCODE"
           Write-Host $added
           break
       }

       $return = $true
    }

    return $return
}

# Restore dependencies
dotnet restore

# Get all project list in the solution
$projectList = dotnet sln list
$updated = $false

foreach($path in $projectList) {
    if ($path -eq "Project(s)" -or $path -eq "----------") {
        # The line doesn't contain a path, continue
        continue
    }

    # Update project dependencies
    $projectUpdated = UpdatePackages -project $path
        
    if ($LASTEXITCODE -ne 0) {
        #The update fail, exit
        exit $LASTEXITCODE
    }

    $updated = $updated -or $projectUpdated
}

if (!$updated) {
    # No packages to update found, exit
    Write-Host "nothing to update"
    exit 0
}

答案 2 :(得分:1)

对于CLI- 正如评论中已经提到的,存在一个用于执行更新的程序包 https://github.com/dotnet-outdated/dotnet-outdated

从用户界面- 如果有人仍在寻找答案,那么与vs 2019相比,这很容易:)

右键单击解决方案,然后选择“ 管理解决方案的nuget程序包”。

它应该打开如下所示的窗口-

enter image description here

在选择pacakge的右侧,我们可以看到项目,并且可以更新软件包:)

答案 3 :(得分:0)

基于Jon Caning的回答,我编写了这个小bash脚本以添加.bashrc(或只是进行一些更改以将其保存在其bash文件中)

function read_solution() {
    echo "Parsing solution $1"

    while IFS='' read -r line || [[ -n "$line" ]]; do
            if [[ $line =~ \"([^\"]*.csproj)\" ]]; then
                    project="${BASH_REMATCH[1]}"

                    read_project "$(echo "$project"|tr '\\' '/')"
            fi
    done < "$1"
}

function read_project() {
    echo "Parsing project $1"
    package_regex='PackageReference Include="([^"]*)" Version="([^"]*)"'

    while IFS='' read -r line || [[ -n "$line" ]]; do
            if [[ $line =~ $package_regex ]]; then
                    name="${BASH_REMATCH[1]}"
                    version="${BASH_REMATCH[2]}"

                    if [[ $version != *-* ]]; then
                            dotnet add "$1" package "$name"
                    fi
            fi
    done < $1
}

function dotnet_update_packages() {
    has_read=0

    if [[ $1 =~ \.sln$ ]]; then
            read_solution "$1"
            return 0
    elif [[ $1 =~ \.csproj$ ]]; then
            read_project "$1"
            return 0
    elif [[ $1 != "" ]]; then
            echo "Invalid file $1"
            return 1
    fi


    for solution in ./*.sln; do
            if [ ! -f ${solution} ]; then
                    continue
            fi

            read_solution "${solution}"
            has_read=1
    done

    if [[ $has_read -eq 1 ]]; then
            return 0
    fi

    for project in ./*.csproj; do
            if [ ! -f ${project} ]; then
                    continue
            fi

            read_project "${project}"
    done
}
export -f dotnet_update_packages

要使用它,请在没有解决方案的文件夹中运行而不带参数的应用程序,它将首先在当前文件夹中查找所有解决方案文件,并为其中引用的所有csproj文件运行(如果工作,可能需要更改它)除了C#之外)。

如果找不到解决方案,它将在当前目录中查找所有csproj文件并为它们运行。

您还可以将.sln或.csproj文件作为参数传递:
dotnet_update_packages mysolution.sln
dotnet_update_packages myproject.csproj

我不是bash专家,所以我敢肯定它可以改善

答案 4 :(得分:0)

基于Jon Canning的powershell解决方案。我修复了一个小错误,该错误只更新了第一个依赖项,而不是项目文件的所有依赖项。

$regex = 'PackageReference Include="([^"]*)" Version="([^"]*)"'

ForEach ($file in get-childitem . -recurse | where {$_.extension -like "*proj"})
{
    $packages = Get-Content $file.FullName |
        select-string -pattern $regex -AllMatches | 
        ForEach-Object {$_.Matches} | 
        ForEach-Object {$_.Groups[1].Value.ToString()}| 
        sort -Unique

    ForEach ($package in $packages)
    {
        write-host "Update $file package :$package"  -foreground 'magenta'
        $fullName = $file.FullName
        iex "dotnet add $fullName package $package"
    }
}

答案 5 :(得分:0)

我创建了一个cake build任务来做同样的事情。见下文:

Task("Nuget-Update")
    .Does(() =>
{
    var files = GetFiles("./**/*.csproj");
    foreach(var file in files)
    {
        var content = System.IO.File.ReadAllText(file.FullPath);
        var matches = System.Text.RegularExpressions.Regex.Matches(content, @"PackageReference Include=""([^""]*)"" Version=""([^""]*)""");
        Information($"Updating {matches.Count} reference(s) from {file.GetFilename()}");
        foreach (System.Text.RegularExpressions.Match match in matches) {
            var packageName = match.Groups[1].Value;
            Information($"  Updating package {packageName}");
            var exitCode = StartProcess("cmd.exe",
                new ProcessSettings {
                    Arguments = new ProcessArgumentBuilder()
                        .Append("/C")
                        .Append("dotnet")
                        .Append("add")
                        .Append(file.FullPath)
                        .Append("package")
                        .Append(packageName)
                }
            );
        }
    }
});

答案 6 :(得分:0)

对于更新所有项目中的所有软件包,nuget package manager gui扩展名都可以一键完成。

  1. 打开VSCode,然后按Ctrl + Shift + P,然后选择“ Nuget软件包管理器GUI:更新软件包”
  2. 点击“更新和卸载程序包”
  3. 点击“更新所有软件包”
  4. 完成!

test

答案 7 :(得分:0)

这似乎可行https://nukeeper.com/

dotnet tool install nukeeper --global
nukeeper update <SLN/PROJ>

答案 8 :(得分:-3)

对于VS Code,您可以尝试 NuGet软件包管理器

https://marketplace.visualstudio.com/items?itemName=jmrog.vscode-nuget-package-manager