Update targetframework for .NET Core projects with PowerShell
With the recent release of .NET Core 3.1 last Wednesday, I decided to upgrade to current project I’m working on from .NET Core 3.0 to .NET Core 3.1. This sounds easy right?
Well not if the solution contains a mix 48 .NET Core 3 and .NET Standard 2.1 projects. And this time I decided not to do this manually.
I recently found a PowerShell script on the internet which allowed me to add a property to all .csproj files in the solution. So I grabbed this as my starting point, because now that I could to that it shouldn’t be that difficult to update properties in a similar way :-)
Fortunately it didn’t cost me much time to create a script that could do this for me. Even with a configurable boolean to make sure I’m not overwriting any .NET Standard projects.
Below is the script. Which is also hosted on my GitHub by the way!
#find all csproj files recursive in this directory
$paths = Get-ChildItem -include *.csproj -Recurse
$OnlyUpdateMatchingFrameworks = $true #can also be #false
$desiredTargetFramework = "netcoreapp3.1"
#foreach found file, update the framework
foreach($pathobject in $paths)
{
$path = $pathobject.fullname
$doc = New-Object System.Xml.XmlDocument
$doc.Load($path)
$node = $doc.SelectSingleNode("//Project/PropertyGroup")
$TargetFrameworkNode = $node.SelectSingleNode("TargetFramework")
if (-not $TargetFrameworkNode) {
write-host "Node does not exist!"
}
else {
write-host "Node found!"
write-host "value was" + $TargetFrameworkNode.InnerText
if($OnlyUpdateMatchingFrameworks -eq $true)
{
write-host "Only matching nodes may be updated! Checking.."
if($TargetFrameworkNode.InnerText -like "netcoreapp*")
{
write-host "Updating node!"
$TargetFrameworkNode.InnerText = $desiredTargetFramework
}
}
else{
write-host "Updating node!"
$TargetFrameworkNode.InnerText = $desiredTargetFramework
}
write-host "value is" + $TargetFrameworkNode.InnerText
$doc.Save($pathobject)
}
}