VS Code(Macを使用)のソリューションのすべてのNuGetパッケージを更新しようとしています。 VSコードまたは特定のproject.jsonファイルでそれを達成する方法はありますか?現時点では1つずつ行っていますが、それを行う拡張機能または機能があると思いましたか?
これは、これを行うシェルスクリプトとパワーシェルスクリプトです
#!/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
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"
}
}
私は同じことをするためにケーキのビルドタスクを作成しました。下記参照:
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)
}
);
}
}
});
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のエキスパートではないので、改善できると確信しています