web-dev-qa-db-ja.com

dotnet CLIですべてのNuGetパッケージを一度に更新するにはどうすればよいですか?

VS Code(Macを使用)のソリューションのすべてのNuGetパッケージを更新しようとしています。 VSコードまたは特定のproject.jsonファイルでそれを達成する方法はありますか?現時点では1つずつ行っていますが、それを行う拡張機能または機能があると思いましたか?

22

これは、これを行うシェルスクリプトとパワーシェルスクリプトです

#!/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

4
Jon Canning

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"
    }
}
2
Rolf Wessels

私は同じことをするためにケーキのビルドタスクを作成しました。下記参照:

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)
                }
            );
        }
    }
});
0
Roemer

Jon Caningの回答に基づいて、.bashrcを追加するためにこの小さなbashスクリプトを記述しました(または、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のエキスパートではないので、改善できると確信しています

0
Boudin