Public/Import-OriAzBopPsModule.ps1
<#
.SYNOPSIS Install PowerShell module from online gallery. .DESCRIPTION This cmdlet will try to install PowerShell module from online gallery. It does the following: 1. Checks if required module is already loaded with a required (or higher) version. 2. If not, tryes to import required version from installed modules. 3. If the loaded module version is still lower or missing (it is not installed) it tries to install it 4. Checks for prerequisities like PS version, PackageManager version etc 5. Installs necessary tools if needed 6. Registers repository if not yet 7. Installs the module 8. Loads required version of the module .PARAMETER DevOpsAccount The name of the dev ops account. Default value is 'oriflame' .PARAMETER RegisterPsRepoFeedList Powershell Repository feed to register if needed .PARAMETER RegisterNugetRepoFeedList Nuget Repository feed to register if needed .PARAMETER Name Specifies the exact names of modules to install from the online gallery. The module name must match the module name in the repository. .PARAMETER Repository Repository feed to register if needed for getting powershell modules. ##### .PARAMETER Guid Exact GUID of module. .PARAMETER MaximumVersion Maximum module version .PARAMETER RequiredVersion Exact required module version. When is not set the lastet version will be installed and loaded. .PARAMETER Version Most likely minimum module versionloaded. .PARAMETER Credential Repository Credential if needed .PARAMETER SkipImport When is set Import-Module will be skipped .EXAMPLE $password = ConvertTo-SecureString 'xbchuuuuhaaaatest' -AsPlainText -Force $RepositoryCredential = New-Object System.Management.Automation.PSCredential 'PackageManage@oriflame.net',$password Import-OriAzBopPsModule ` -Name OriAzEncEnvironmentConfiguration ` -RequiredVersion 1.0.48 ` -Credential $RepositoryCredential #> function Import-OriAzBopPsModule { [CmdLetBinding()] param ( [Parameter(Mandatory = $false, HelpMessage = "The name of the dev ops account")] [String] $DevOpsAccount = $Script:VstsAccount, [Parameter(Mandatory = $true, HelpMessage = "Exact name of the module")] [String] $Name, [Parameter(Mandatory = $false, HelpMessage = "Powershell Repository feed to register if needed")] [String[]] $RegisterPsRepoFeedList = @('PackageManagementFeed'), [Parameter(Mandatory = $false, HelpMessage = "Nuget Repository feed to register if needed")] [String[]] $RegisterNugetRepoFeedList = @('DeploymentPackages'), [Parameter(Mandatory = $false, HelpMessage = "Repository feed to register if needed for getting powershell modules")] [String] $Repository = 'PackageManagementFeed', [Parameter(Mandatory = $false, HelpMessage = "GUID of the module")] [string] $Guid, [Parameter(Mandatory = $false, HelpMessage = "Maximum module version")] [Version] $MaximumVersion, [Parameter(Mandatory = $false, HelpMessage = "Required module version")] [Version] $RequiredVersion, [Alias("Version")] [Parameter(Mandatory = $false, HelpMessage = "Most likely minimum module version")] [Version] $MinimumVersion, [Parameter(Mandatory=$false, HelpMessage = "Repository Credential if needed")] [PSCredential] $Credential = $null, [Parameter(Mandatory = $false, HelpMessage = "When is set import-module will be skipped.")] [switch] $SkipImport ) $ErrorActionPreference = 'Stop' Write-Debug "-- Import-OriAzBopPsModule --" Write-Debug "Name: $Name" Write-Debug "Guid: $Guid" Write-Debug "MaximumVersion: $MaximumVersion" Write-Debug "RequiredVersion: $RequiredVersion" Write-Debug "MinimumVersion: $MinimumVersion" # Required module is already imported if (Test-GetModule -Name $Name -RequiredVersion $RequiredVersion) { Write-Verbose "Module $Name is already imported." return } # Fix credential provider Invoke-WebRequest -Uri "https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1" -UseBasicParsing | Invoke-Expression |Out-Null Install-OriAzBopPrerequisity -Name PowerShellGet -MinimumVersion 2.2.3 -SkipImport:$SkipImport -AllowClobber -SkipPublisherCheck Install-OriAzBopPrerequisity -Name PackageManagement -MinimumVersion 1.4.6 -SkipImport:$SkipImport -AllowClobber -SkipPublisherCheck # Required module needs to be installed and imported Register-OriAzBopRepository ` -DevOpsAccount $DevOpsAccount ` -RepositoryCredential $Credential ` -PsProjectName $RegisterPsRepoFeedList ` -NugetProjectName $RegisterNugetRepoFeedList ` -SkipPrompt:$true ` -Verbose:$VerbosePreference ` -Debug:$DebugPreference $InstalledLocation = Invoke-ModuleInstall ` -Name $Name ` -Guid $Guid ` -MaximumVersion $MaximumVersion ` -RequiredVersion $RequiredVersion ` -Version $MinimumVersion ` -Credential $Credential ` -Repository $Repository ` -SkipImport:$SkipImport ` -Verbose:$VerbosePreference ` -Debug:$DebugPreference Write-Verbose "Re-Import Module InstalledLocation: $InstalledLocation" # Note: Following import does NOT work. # Import-Module -Name $Name -RequiredVersion $RequiredVersion -Verbose # Any using of -RequiredVersion skip execution of init.ps1 # This problem we're bpassing via using Import-Module on installed path of module. if($SkipImport.IsPresent) { Write-Debug "Skip of Import-Module" } else { Import-Module $InstalledLocation ` -Verbose:$VerbosePreference ` -Debug:$DebugPreference ` -Force } Write-Debug "-- End of Import-OriAzBopPsModule --" } |