From bb49427e4212b3617115504b23ab244ed51f572d Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Sat, 23 Apr 2022 16:10:29 +0100 Subject: [PATCH 1/5] upgrade from net452 to net461 for windows ps --- Engine/Engine.csproj | 12 ++++++------ Engine/FindAstPositionVisitor.cs | 2 +- .../Collection/PlatformInformationCollector.cs | 4 ++-- .../Microsoft.PowerShell.CrossCompatibility.csproj | 4 ++-- .../PSCompatibilityCollector.psm1 | 2 +- PSCompatibilityCollector/build.ps1 | 8 ++++---- README.md | 3 ++- Rules/Rules.csproj | 6 +++--- appveyor.yml | 2 +- build.psm1 | 6 +++--- tools/releaseBuild/signing.xml | 6 +++--- 11 files changed, 28 insertions(+), 27 deletions(-) diff --git a/Engine/Engine.csproj b/Engine/Engine.csproj index f3f60f840..4bd82e718 100644 --- a/Engine/Engine.csproj +++ b/Engine/Engine.csproj @@ -2,7 +2,7 @@ 1.20.0 - netcoreapp3.1;net452 + netcoreapp3.1;net462 Microsoft.Windows.PowerShell.ScriptAnalyzer 1.20.0 Engine @@ -10,11 +10,11 @@ 9.0 - + - + portable @@ -70,15 +70,15 @@ $(DefineConstants);PSV7;CORECLR - + - + - + diff --git a/Engine/FindAstPositionVisitor.cs b/Engine/FindAstPositionVisitor.cs index 5816f7e59..4b3371372 100644 --- a/Engine/FindAstPositionVisitor.cs +++ b/Engine/FindAstPositionVisitor.cs @@ -337,7 +337,7 @@ public override AstVisitAction VisitUsingStatement(UsingStatementAst usingStatem } #endif -#if !(NET452 || PSV6) // NET452 includes V3,4,5 +#if !(net462 || PSV6) // net462 includes V3,4,5 public override AstVisitAction VisitPipelineChain(PipelineChainAst pipelineChainAst) { return Visit(pipelineChainAst); diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/PlatformInformationCollector.cs b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/PlatformInformationCollector.cs index dfd62b806..9a7eab952 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/PlatformInformationCollector.cs +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/PlatformInformationCollector.cs @@ -330,7 +330,7 @@ private Architecture GetProcessArchitecture() return (Architecture)RuntimeInformation.ProcessArchitecture; #else // We assume .NET Framework must be on an Intel architecture - // net452 does not reliably have the above API + // net462 does not reliably have the above API return Environment.Is64BitProcess ? Architecture.X64 : Architecture.X86; @@ -344,7 +344,7 @@ private Architecture GetOSArchitecture() return (Architecture)RuntimeInformation.OSArchitecture; #else // We assume .NET Framework must be on an Intel architecture - // net452 does not reliably have the above API + // net462 does not reliably have the above API return Environment.Is64BitOperatingSystem ? Architecture.X64 : Architecture.X86; diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj index 4e66e5148..19f63c022 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Microsoft.PowerShell.CrossCompatibility.csproj @@ -2,7 +2,7 @@ 1.20.0 - netstandard2.0;net452 + netstandard2.0;net462 1.20.0 @@ -16,7 +16,7 @@ - + diff --git a/PSCompatibilityCollector/PSCompatibilityCollector.psm1 b/PSCompatibilityCollector/PSCompatibilityCollector.psm1 index aea680da4..0e3f6a8e4 100644 --- a/PSCompatibilityCollector/PSCompatibilityCollector.psm1 +++ b/PSCompatibilityCollector/PSCompatibilityCollector.psm1 @@ -8,5 +8,5 @@ if ($PSVersionTable.PSVersion.Major -ge 6) } else { - Import-Module ([System.IO.Path]::Combine($PSScriptRoot, 'net452', 'Microsoft.PowerShell.CrossCompatibility.dll')) -Force + Import-Module ([System.IO.Path]::Combine($PSScriptRoot, 'net462', 'Microsoft.PowerShell.CrossCompatibility.dll')) -Force } diff --git a/PSCompatibilityCollector/build.ps1 b/PSCompatibilityCollector/build.ps1 index ec028ee08..0d1b47958 100644 --- a/PSCompatibilityCollector/build.ps1 +++ b/PSCompatibilityCollector/build.ps1 @@ -8,7 +8,7 @@ param( $Configuration = 'Debug', [Parameter()] - [ValidateSet('netstandard2.0', 'net452')] + [ValidateSet('netstandard2.0', 'net462')] [string] $Framework, @@ -24,7 +24,7 @@ $ErrorActionPreference = 'Stop' if ($IsWindows -eq $false) { $script:TargetFrameworks = 'netstandard2.0' } else { - $script:TargetFrameworks = 'netstandard2.0','net452' + $script:TargetFrameworks = 'netstandard2.0','net462' } $script:ModuleName = Split-Path $PSScriptRoot -Leaf @@ -36,7 +36,7 @@ $script:BinModDir = [System.IO.Path]::Combine($PSScriptRoot, 'out', "$script:Mod $script:BinModSrcDir = Join-Path $PSScriptRoot 'Microsoft.PowerShell.CrossCompatibility' $script:PublishDlls = @{ - 'net452' = @('Microsoft.PowerShell.CrossCompatibility.dll', 'Microsoft.PowerShell.CrossCompatibility.pdb', 'Newtonsoft.Json.dll') + 'net462' = @('Microsoft.PowerShell.CrossCompatibility.dll', 'Microsoft.PowerShell.CrossCompatibility.pdb', 'Newtonsoft.Json.dll') 'netstandard2.0' = @('Microsoft.PowerShell.CrossCompatibility.dll', 'Microsoft.PowerShell.CrossCompatibility.pdb', 'Newtonsoft.Json.dll') } @@ -44,7 +44,7 @@ function Invoke-CrossCompatibilityModuleBuild { param( [Parameter()] - [ValidateSet('netstandard2.0', 'net452')] + [ValidateSet('netstandard2.0', 'net462')] [string] $Framework = 'netstandard2.0', diff --git a/README.md b/README.md index b09a98b4f..09b5cb2d5 100644 --- a/README.md +++ b/README.md @@ -126,9 +126,10 @@ Note: the PSScriptAnalyzer Chocolatey package is provided and supported by the c #### Requirements * [.NET Core 3.1.102 SDK](https://www.microsoft.com/net/download/dotnet-core/3.1#sdk-3.1.102) or newer patch release +* If building for Windows PowerShell versions, then the .NET Framework 4.6.2 [targeting pack](https://dotnet.microsoft.com/en-us/download/dotnet-framework/net462) (also referred to as developer/targeting pack) need to be installed. This is only possible on Windows. * [Pester v5 PowerShell module, available on PowerShell Gallery](https://github.com/pester/Pester) * [PlatyPS PowerShell module, available on PowerShell Gallery](https://github.com/PowerShell/platyPS/releases) -* Optionally but recommended for development: [Visual Studio 2017/2019](https://www.visualstudio.com/downloads/) +* Optionally but recommended for development: [Visual Studio](https://www.visualstudio.com/downloads) #### Steps * Obtain the source diff --git a/Rules/Rules.csproj b/Rules/Rules.csproj index b59837c52..db2c0c646 100644 --- a/Rules/Rules.csproj +++ b/Rules/Rules.csproj @@ -2,7 +2,7 @@ 1.20.0 - netcoreapp3.1;net452 + netcoreapp3.1;net462 Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules 1.20.0 Rules @@ -22,12 +22,12 @@ - + - + portable diff --git a/appveyor.yml b/appveyor.yml index 84f29a49f..e311eaa3a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -30,7 +30,7 @@ build_script: ./build.ps1 -Configuration "$env:BuildConfiguration" -PSVersion 3 } ./build.ps1 -Configuration "$env:BuildConfiguration" -PSVersion "$env:PSVersion" - ./PSCompatibilityCollector/build.ps1 -Configuration "$env:BuildConfiguration" -Framework 'net452' + ./PSCompatibilityCollector/build.ps1 -Configuration "$env:BuildConfiguration" -Framework 'net462' } - pwsh: | if ($env:PowerShellEdition -eq 'PowerShellCore') { diff --git a/build.psm1 b/build.psm1 index 8bc052f9e..7564e564b 100644 --- a/build.psm1 +++ b/build.psm1 @@ -200,13 +200,13 @@ function Start-ScriptAnalyzerBuild Set-Variable -Name profilesCopied -Value $true -Scope 1 } - $framework = 'net452' + $framework = 'net462' if ($PSVersion -eq 7) { $framework = 'netcoreapp3.1' } # build the appropriate assembly - if ($PSVersion -match "[34]" -and $Framework -ne "net452") + if ($PSVersion -match "[34]" -and $Framework -ne "net462") { throw ("ScriptAnalyzer for PS version '{0}' is not applicable to {1} framework" -f $PSVersion,$Framework) } @@ -316,7 +316,7 @@ function Start-ScriptAnalyzerBuild else { "$projectRoot\Rules\bin\${buildConfiguration}\${framework}" } - if ($framework -eq 'net452') { + if ($framework -eq 'net462') { $nsoft = Join-Path $rulesProjectOutputDir 'Newtonsoft.Json.dll' Copy-Item -path $nsoft -Destination $destinationDirBinaries } diff --git a/tools/releaseBuild/signing.xml b/tools/releaseBuild/signing.xml index 25c44ff89..f2fc1c3ee 100644 --- a/tools/releaseBuild/signing.xml +++ b/tools/releaseBuild/signing.xml @@ -44,8 +44,8 @@ - - - + + + From c3dd8a61ac952b05a93da494efc11cc0f614b724 Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Sat, 23 Apr 2022 22:13:17 +0100 Subject: [PATCH 2/5] fix casing and bug where psv7 wasn't used --- Engine/FindAstPositionVisitor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/FindAstPositionVisitor.cs b/Engine/FindAstPositionVisitor.cs index 4b3371372..05532c456 100644 --- a/Engine/FindAstPositionVisitor.cs +++ b/Engine/FindAstPositionVisitor.cs @@ -337,7 +337,7 @@ public override AstVisitAction VisitUsingStatement(UsingStatementAst usingStatem } #endif -#if !(net462 || PSV6) // net462 includes V3,4,5 +#if !(NET462 || PSV7) // net462 includes V3,4,5 public override AstVisitAction VisitPipelineChain(PipelineChainAst pipelineChainAst) { return Visit(pipelineChainAst); From ae3f2bd205279bf42c80176b959341a1c47860a2 Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Fri, 27 May 2022 17:20:33 +0100 Subject: [PATCH 3/5] use APIs available in net461 but not net452 --- Rules/UseCmdletCorrectly.cs | 10 +++++----- Rules/UseUsingScopeModifierInNewRunspaces.cs | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Rules/UseCmdletCorrectly.cs b/Rules/UseCmdletCorrectly.cs index a0d08e2c1..0239d95fc 100644 --- a/Rules/UseCmdletCorrectly.cs +++ b/Rules/UseCmdletCorrectly.cs @@ -29,11 +29,11 @@ public class UseCmdletCorrectly : IScriptRule private static readonly ConcurrentDictionary> s_pkgMgmtMandatoryParameters = new ConcurrentDictionary>(new Dictionary> { - { "Find-Package", new string[0] }, - { "Find-PackageProvider", new string[0] }, - { "Get-Package", new string[0] }, - { "Get-PackageProvider", new string[0] }, - { "Get-PackageSource", new string[0] }, + { "Find-Package", Array.Empty() }, + { "Find-PackageProvider", Array.Empty() }, + { "Get-Package", Array.Empty() }, + { "Get-PackageProvider", Array.Empty() }, + { "Get-PackageSource", Array.Empty() }, { "Import-PackageProvider", new string[] { "Name" } }, { "Install-Package", new string[] { "Name" } }, { "Install-PackageProvider", new string[] { "Name" } }, diff --git a/Rules/UseUsingScopeModifierInNewRunspaces.cs b/Rules/UseUsingScopeModifierInNewRunspaces.cs index 6d665e989..a435c1d31 100644 --- a/Rules/UseUsingScopeModifierInNewRunspaces.cs +++ b/Rules/UseUsingScopeModifierInNewRunspaces.cs @@ -183,7 +183,7 @@ public override AstVisitAction VisitScriptBlockExpression(ScriptBlockExpressionA return AstVisitAction.Continue; } - HashSet varsInLocalAssignments = FindVarsInAssignmentAsts(scriptBlockExpressionAst); + IReadOnlyCollection varsInLocalAssignments = FindVarsInAssignmentAsts(scriptBlockExpressionAst); if (varsInLocalAssignments != null) { AddAssignedVarsToSession(sessionName, varsInLocalAssignments); @@ -205,7 +205,7 @@ public override AstVisitAction VisitScriptBlockExpression(ScriptBlockExpressionA /// Example: `$foo = "foo"` ==> the VariableExpressionAst for $foo is returned /// /// - private static HashSet FindVarsInAssignmentAsts(Ast ast) + private static IReadOnlyCollection FindVarsInAssignmentAsts(Ast ast) { HashSet variableDictionary = new HashSet(); @@ -264,7 +264,7 @@ private static bool IsAssignmentStatementAst(Ast ast) /// /// private static IEnumerable FindNonAssignedNonUsingVarAsts( - Ast ast, HashSet varsInAssignments) + Ast ast, IReadOnlyCollection varsInAssignments) { // Find all variables that are not locally assigned, and don't have $using: scope modifier foreach (VariableExpressionAst variable in ast.FindAll(IsNonUsingNonSpecialVariableExpressionAst, true)) @@ -368,7 +368,7 @@ private static bool TryGetSessionNameFromInvokeCommand(CommandAst invokeCommandA /// GetAssignedVarsInSession: Retrieves all previously declared vars for a given session (as in Invoke-Command -Session $session). /// /// - private HashSet GetAssignedVarsInSession(string sessionName) + private IReadOnlyCollection GetAssignedVarsInSession(string sessionName) { return _varsDeclaredPerSession[sessionName]; } @@ -378,7 +378,7 @@ private HashSet GetAssignedVarsInSession(string sessionName) /// /// /// - private void AddAssignedVarsToSession(string sessionName, HashSet variablesToAdd) + private void AddAssignedVarsToSession(string sessionName, IReadOnlyCollection variablesToAdd) { if (!_varsDeclaredPerSession.ContainsKey(sessionName)) { From 00e1ce2d32c3d64f9bd8fb2a8e5e7f2fc420c7ee Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Wed, 15 Jun 2022 23:14:18 +0100 Subject: [PATCH 4/5] fix merge conflict error --- Engine/Engine.csproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/Engine/Engine.csproj b/Engine/Engine.csproj index 063936e6f..10ebf1222 100644 --- a/Engine/Engine.csproj +++ b/Engine/Engine.csproj @@ -1,8 +1,6 @@  - 1.20.0 - netcoreapp3.1;net462 1.21.0 netcoreapp3.1;net462 Microsoft.Windows.PowerShell.ScriptAnalyzer From 264654019562e5f0b10a55fd8c0438561fd71dae Mon Sep 17 00:00:00 2001 From: "Christoph Bergmeister [MVP]" Date: Wed, 15 Jun 2022 22:32:45 +0000 Subject: [PATCH 5/5] empty