Files
SAMY/samy.functions.ps1

87 lines
4.0 KiB
PowerShell

function Initialize-NuGetProvider {
[CmdletBinding()]
param()
# Silent defaults
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$ProgressPreference = 'SilentlyContinue'
$ConfirmPreference = 'None'
# Extra guardrails for "ShouldContinue" style prompts
$PSDefaultParameterValues['*:Confirm'] = $false
# Ensure provider folders exist (CurrentUser and AllUsers locations)
$userProvPath = Join-Path $env:LOCALAPPDATA 'PackageManagement\ProviderAssemblies'
$allProvPath = Join-Path ${env:ProgramFiles} 'PackageManagement\ProviderAssemblies'
foreach ($p in @($userProvPath, $allProvPath)) {
try {
if ($p -and -not (Test-Path $p)) {
New-Item -Path $p -ItemType Directory -Force -ErrorAction Stop | Out-Null
Write-LogHybrid "Ensured provider folder exists: $p" Info Bootstrap -LogToEvent
}
} catch {
# AllUsers path can fail without admin. That's OK.
Write-LogHybrid "Could not create provider folder: $p ($($_.Exception.Message))" Warning Bootstrap -LogToEvent
}
}
# 1) Install NuGet provider FIRST, silently, so Install-Module never prompts
try {
$existing = Get-PackageProvider -Name NuGet -ListAvailable -ErrorAction SilentlyContinue |
Sort-Object Version -Descending | Select-Object -First 1
if (-not $existing -or $existing.Version -lt [Version]'2.8.5.201') {
Write-LogHybrid "Installing NuGet provider (min 2.8.5.201)..." Info Bootstrap -LogToEvent
# ForceBootstrap helps avoid interactive bootstrap prompts
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 `
-Force -ForceBootstrap -Confirm:$false `
-Scope CurrentUser -ErrorAction Stop | Out-Null
$existing = Get-PackageProvider -Name NuGet -ListAvailable -ErrorAction SilentlyContinue |
Sort-Object Version -Descending | Select-Object -First 1
}
if ($existing) {
Import-PackageProvider -Name NuGet -Force -ErrorAction Stop | Out-Null
Write-LogHybrid "NuGet provider ready (v$($existing.Version))" Success Bootstrap -LogToEvent
} else {
throw "NuGet provider still not available after install attempt."
}
}
catch {
Write-LogHybrid "NuGet provider install/import failed: $($_.Exception.Message)" Error Bootstrap -LogToEvent
throw
}
# 2) Now it is safe to update / install modules without NuGet prompts
try {
Import-Module PackageManagement -Force -ErrorAction SilentlyContinue | Out-Null
Import-Module PowerShellGet -Force -ErrorAction SilentlyContinue | Out-Null
$pkgMgmtVersion = (Get-Module PackageManagement -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1).Version
if ($pkgMgmtVersion -and $pkgMgmtVersion -lt [Version]'1.3.1') {
Install-Module PackageManagement -Force -AllowClobber -Confirm:$false -ErrorAction Stop
Write-LogHybrid "Updated PackageManagement to latest version" Info Bootstrap -LogToEvent
}
if (-not (Get-Module PowerShellGet -ListAvailable)) {
Install-Module PowerShellGet -Force -AllowClobber -Confirm:$false -ErrorAction Stop
Write-LogHybrid "Installed PowerShellGet module" Info Bootstrap -LogToEvent
}
# Trust PSGallery (optional, but common)
$gallery = Get-PSRepository -Name PSGallery -ErrorAction SilentlyContinue
if ($gallery -and $gallery.InstallationPolicy -ne 'Trusted') {
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted -ErrorAction Stop
Write-LogHybrid "PSGallery marked as Trusted" Info Bootstrap -LogToEvent
}
}
catch {
Write-LogHybrid "PackageManagement/PowerShellGet setup failed: $($_.Exception.Message)" Warning Bootstrap -LogToEvent
# You can choose to throw here if you want hard-fail behavior
}
}