如何使用dotnet CLI一次更新所有NuGet软件包?
我正在尝试用VS代码(使用Mac)更新解决方案的所有NuGet软件包。有没有办法在VS代码或特定的project.json文件中实现这一点?目前,我将一个接一个地介绍,但我原以为会有一个扩展或功能为您实现这一点?这里有一个shell脚本和一个powershell脚本可以实现这一点如何使用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 .
#!/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>