Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用dotnet CLI一次更新所有NuGet软件包?_Nuget_Visual Studio Code_.net Core - Fatal编程技术网

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

如何使用dotnet CLI一次更新所有NuGet软件包?,nuget,visual-studio-code,.net-core,Nuget,Visual Studio Code,.net Core,我正在尝试用VS代码(使用Mac)更新解决方案的所有NuGet软件包。有没有办法在VS代码或特定的project.json文件中实现这一点?目前,我将一个接一个地介绍,但我原以为会有一个扩展或功能为您实现这一点?这里有一个shell脚本和一个powershell脚本可以实现这一点 #!/bin/bash regex='PackageReference Include="([^"]*)" Version="([^"]*)"' find .

我正在尝试用VS代码(使用Mac)更新解决方案的所有NuGet软件包。有没有办法在VS代码或特定的project.json文件中实现这一点?目前,我将一个接一个地介绍,但我原以为会有一个扩展或功能为您实现这一点?

这里有一个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
还应提及Paket,它是一个支持更新的极好的替代软件包管理器:

dotnet tool install paket--tool path.paket

还可以查看
过时的dotnet

基于Jon Caning的回答,我已经将这个小bash脚本编写成add-in.bashrc(或者只需稍加修改,将其保存在其bash文件中)

函数读取解决方案(){
echo“解析解决方案$1”
而IFS=''read-r line | |[[-n“$line”]];do
如果[[$line=~\”([^\“]*.csproj)\“]];则
project=“${BASH_重新匹配[1]}”
阅读“U项目”$(echo“$project”| tr'\\'''''/')”
fi
完成<“$1”
}
函数read_项目(){
echo“解析项目$1”
package_regex='PackageReference Include=“([^”]*)”Version=“([^”]*)”'
而IFS=''read-r line | |[[-n“$line”]];do
如果[[$line=~$package\u regex]];则
name=“${BASH_重赛[1]}”
version=“${BASH_重新匹配[2]}”
如果[[$version!=*-*]];则
dotnet添加“$1”包“$name”
fi
fi
已完成<$1
}
函数dotnet_update_packages(){
has_read=0
如果[[$1=~\.sln$]];则
阅读解决方案“$1”
返回0
elif[[$1=~\.csproj$]];然后
读_项目“$1”
返回0
elif[[$1!=”“];然后
回显“无效文件$1”
返回1
fi
对于在./*.sln中的解决方案,请执行以下操作:
如果[!-f${solution}];则
持续
fi
读取解决方案“${solution}”
has_read=1
完成
如果[[$has_read-eq 1]];则
返回0
fi
对于位于/*.csproj;do的项目
如果[!-f${project}];则
持续
fi
读取项目“${project}”
完成
}
导出-f dotnet\u更新\u包
要使用它,或者在包含解决方案的文件夹中不带参数地运行它,它将首先查找当前文件夹中的所有解决方案文件,并运行这些文件夹中引用的所有csproj文件(如果使用的不是c#,则可能需要更改)

如果找不到解决方案,它将查找当前目录中的所有csproj文件并运行这些文件

您还可以将.sln或.csproj文件作为参数传递:
dotnet\u update\u包mysolution.sln

dotnet\u update\u包myproject.csproj


我不是bash专家,因此我相信它可以基于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"
    }
}

我创建了一个蛋糕构建任务来执行同样的操作。请参见以下内容:

任务(“Nuget更新”)
.是否(()=>
{
var files=GetFiles(“./***.csproj”);
foreach(文件中的var文件)
{
var content=System.IO.File.ReadAllText(File.FullPath);
var matches=System.Text.RegularExpressions.Regex.matches(内容,@“PackageReference Include=”“([^”“]*)”版本=“”([^”“]*)”;
信息($“从{file.GetFilename()}更新{matches.Count}引用”);
foreach(System.Text.RegularExpressions.Match中的匹配){
var packageName=match.Groups[1]。值;
信息($“更新包{packageName}”);
var exitCode=StartProcess(“cmd.exe”,
新进程设置{
参数=新的ProcessArgumentBuilder()
.Append(“/C”)
.Append(“dotnet”)
.附加(“添加”)
.Append(file.FullPath)
.Append(“包”)
.Append(packageName)
}
);
}
}
});
我写这篇文章是为了让包在Githup上保持最新。
要更新解决方案的所有包,我首先使用
dotnet sln list

对于每个项目,我使用
dotnet list package--outlated
获得过期软件包列表,它给出每个过期软件包的最新版本。
对于每个包,我用
dotnet添加包{package name}--version{new version}
更新项目

完整代码:

#更新一个项目包
函数更新包{
param(
$project
)
$return=$false
#获取过时的软件包
$packageLineList=dotnet list$项目包--过时
foreach($packageLineList中的行){
写入主机$line
$match=$line-match'>\s(\s*)\s*\s*\s*\s*\s*(\s*)'
如果(!$match){
#该行不包含包信息,是否继续
持续
}
#更新过时的软件包
$add=dotnet add$project package$Matches.1--版本$Matches.2
if($LASTEXITCODE-ne 0){
#更新包时出错
写入错误“dotnet添加$project包$Matches.1--版本$Matches.2以代码$LASTEXITCODE退出”
写入主机$added
打破
}
$return=$true
}
return$return
}
#恢复依赖项
网络还原
#获取解决方案中的所有项目列表
$projectList=dotnet sln列表
$updated=$false
foreach($projectList中的路径){
如果($path-eq“项目”-或$path-eq“------------”){
#该行不包含路径,是否继续
持续
}
#更新项目依赖项
$projectUpdated=UpdatePack
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
$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"
    }
}
dotnet tool install nukeeper --global
nukeeper update <SLN/PROJ>