Publish-Packages.psm1
<#
.Synopsis Automatic Publish Tool (APT) .DESCRIPTION Publish or rewrite nugets (feed/local nuget storage) .EXAMPLE Publish-Packages -Path D:\Projects\ActiveOffice.NET\ActiveOffice.NET\devops\output\ -Feed Lomtec.ActiveOffice .EXAMPLE Publish-Packages -Path D:\Projects\ActiveOffice.NET\ActiveOffice.NET\devops\output\ -ProjectPackages D:\Projects\CISSS\src\packages\ -EnableDebug .EXAMPLE Publish-Packages -Path D:\Projects\ActiveOffice.NET\ActiveOffice.NET\devops\output\ -ProjectPackages D:\Projects\CISSS\src\packages\ -EnableDebug -ResetFeed .NOTES Author: Imrich Szolik #> function Publish-Packages { [CmdletBinding()] param ( #Packages path [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$false, HelpMessage="Packages path")] [string] $Path, #Package feed name [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Packages feed name.")] [string] $Feed, #Disable deploy to nuget server, rewrite local packages for debug [switch] [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Disable deploy to nuget server, rewrite local packages for debug!")] $EnableDebug, #Delete global and locel feed [switch] [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Delete global and locel feed")] $ResetFeed, #Project packages path [string[]] [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Project packages path.")] $ProjectPackages, #Publish verbosity [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$false, HelpMessage="Verbosity")] $Verbosity = "quiet" ) begin { if ($null -eq (Get-Command nuget -ErrorAction SilentlyContinue)) { throw "Please install nuget CLI. [ Download https://www.nuget.org/downloads & add copy nuget.exe to %userprofile%\.dotnet\tools ]" } # if(-not $EnableDebug.IsPresent){ if([string]::IsInterned($Feed)){ throw "Feed is required!" } } # } process { $files = Get-ChildItem -Path $Path -Filter *.nupkg if(($files | Measure-Object).Count -eq 0 ){ Write-Host "#### APT NUGET deploy into $Feed aborted. Not found any packages ####" return } Write-Host "#### APT NUGET deploy into $Feed ####" #to local files if($EnableDebug.IsPresent){ # $match = [regex] '(?<name>.+)\.(?<major>\d+)\.(?<minor>\d+)\.(?<revison>\d+)\.nupkg' $globalNuget = Join-Path -Path (Join-Path -Path $env:USERPROFILE -ChildPath ".nuget") -ChildPath "packages" # foreach($file in $files){ $result = $match.Match($file) if($result.Success){ #rename .nuget to zip (Expand-Archive powershell 5.0) $zipFile = "$file.FullName.zip" Copy-Item $file.FullName $zipFile # $name = Split-Path -Path $result.Groups['name'] -Leaf $version = "$($result.Groups['major']).$($result.Groups['minor']).$($result.Groups['revison'])" $globalPackages = Join-Path $globalNuget -ChildPath $name # Write-Host "#### APT NUGET rewrite: $name.$version ####" if( Test-Path -Type Container $globalPackages){ $packageDirectory = Join-Path $globalPackages -ChildPath $version # Remove-Item -Force -Recurse $packageDirectory -ErrorAction SilentlyContinue # if(-not $ResetFeed.IsPresent){ Write-Verbose "Rewrite user-global package: $name.$version" Expand-Archive -Force -Path $zipFile -DestinationPath $packageDirectory } else{ Write-Verbose "Reset user-global package: $name.$version" } } # if($null -ne $ProjectPackages -and $ProjectPackages.Length -gt 0){ # foreach($p in $ProjectPackages){ # $localPackage = Join-Path $p -ChildPath "$name.$version" # if( Test-Path -Type Container $localPackage){ # Remove-Item -Force -Recurse $localPackage -ErrorAction SilentlyContinue # if(-not $ResetFeed.IsPresent){ Write-Verbose "Rewrite project package: $name.$version" Expand-Archive -Force -Path $zipFile -DestinationPath $localPackage } else{ Write-Verbose "Reset project package: $name.$version" } } } } # Remove-Item $zipFile -Force -ErrorAction SilentlyContinue } } } #to nuget server else{ $exists = nuget.exe list -NonInteractive -Source $Feed | Select-Object @{name='Item';expression={$_.Replace(" ",".")}} | Select-Object -ExpandProperty Item $hasPreRelease = ($files | Where-Object -Property Name -Match '(-rc|-alpha|-beta)' | Measure-Object -Line).Lines if($hasPreRelease -gt 0){ $preReleaseExists = nuget.exe list -Prerelease -NonInteractive -Source $Feed | Select-Object @{name='Item';expression={$_.Replace(" ",".")}} | Select-Object -ExpandProperty Item $exists = $exists + $preReleaseExists } # foreach($file in $files){ $filename = $file.Name $name = $filename.SubString(0,$filename.Length-6) # if($exists -notcontains $name){ Write-Host "#### APT NUGET deploy: $name ####" nuget.exe push -Source $Feed -ApiKey az $file.FullName -Verbosity $Verbosity } else{ Write-Verbose "Found $name, not deployed." } } } } end { } } Export-ModuleMember -Function Publish-Packages # SIG # Begin signature block # MIIIEwYJKoZIhvcNAQcCoIIIBDCCCAACAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBkyXLwUZvjNF89 # T/NuMo+/t4zEfJt9gX2GWpyN8wiuD6CCBQ8wggULMIIC86ADAgECAgIApTANBgkq # hkiG9w0BAQsFADCBoDELMAkGA1UEBhMCU0sxETAPBgNVBAgTCFNsb3Zha2lhMRMw # EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpMb210ZWMuY29tMSswKQYDVQQD # EyJMb210ZWMuY29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MScwJQYJKoZIhvcN # AQkBFhhJbXJpY2guU3pvbGlrQGxvbXRlYy5jb20wHhcNMTkwMzI2MTUwNDQzWhcN # MzAwMTAxMDAwMDAwWjCBkzELMAkGA1UEBhMCU0sxETAPBgNVBAgTCFNsb3Zha2lh # MRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpMb210ZWMuY29tMR4wHAYD # VQQDExVMb210ZWMuY29tIFBvd2Vyc2hlbGwxJzAlBgkqhkiG9w0BCQEWGEltcmlj # aC5Tem9saWtAbG9tdGVjLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC # ggEBAL4n4nCHbkdrf09IHNFQ2P/z6I43GKScsFJOQHUMkRD3ALoUFL/URC9sW2fY # rqG5VkFAKhnM0VxeiICR53cAshNShjFf58PhaS973jtCoJcaugIVBVoFIuQ+gnNY # Jp2VdBbIPKMW4JjjZOxBEkHpMWmfitXKWGKeU68Qcn3oI6PO+YSztfXLe1NU+1GI # O3fA7E0vHVPUf/qWZXMYU5ElLQVm9AXbfX79mTgl76A57+OC6j+Aehkd2OPfUl4w # snox3fOyUAUA8iojeWh97PpXd/s+RkuxWdgsC4YSWDUjhZSzBkml9uerYqo9a+XA # b39dvkpK9TPl3q5HNBQMkCfp8bkCAwEAAaNaMFgwCQYDVR0TBAIwADALBgNVHQ8E # BAMCB4AwKwYDVR0lBCQwIgYIKwYBBQUHAwMGCisGAQQBgjcCARUGCisGAQQBgjcC # ARYwEQYJYIZIAYb4QgEBBAQDAgSwMA0GCSqGSIb3DQEBCwUAA4ICAQAJJapv9skY # jh5HTsJnqDdtqh7YOOXuA8g+DKBj+5gDEZE5V9VhAFVp8UJ9RoITGGIRTVId0lqc # LJiVSTHx305VW9aID8vo77kfrTyXvPXNIsTtHnPkkwH47+CoiY3IpPQLjUA/Q6Qd # qwINvvwom7/Wc+OoIqlPdJH5DbBrIy85dr6M/Lm3Rw2BolcTRwXTB3xAhweth78B # P6pbcAd32FdymkRopLIihuNs7g7ZR/Q/5803G+OiQIMRGyTvaQ+aQjJgFpkzp7NI # whzougfCOV47Sc89jEpUqw16i2UFfz2ywOlWUyYtue1S1PjM1ljgJfRo+e0wUnFp # gFQzXGF1bTYVaQ4e3nJleADfvqeXoH2AYeBTbz9BcogkkfURAC3iiob1bNs5jE1C # brEDCw6m/03k0oOmm3xQksXyAhBYuUkRwu9jd4y3FwZ/syDGLz3b6cY8o1YyINOO # A3B2r92shNt0rWhJu3v+qcIVmFQ0aKlhNNRoiVlQgJ7NgO0UV+vU2lgiscpUSxEt # xKN+450r49su06NA6zsyn3CELUmVkPyjx5fyizwt9KxVuYOUSEb32Y7QCffHJ1qt # F6SuQrKbgb/24y7cCDW6PDVRvPOySUlKu9sPykICDjvzXBvjYEILM7AmtYCIBGQg # imBsQvTEoXJXiwAOi1XNz3LxcjQHQ/ZM4zGCAlowggJWAgEBMIGnMIGgMQswCQYD # VQQGEwJTSzERMA8GA1UECBMIU2xvdmFraWExEzARBgNVBAcTCkJyYXRpc2xhdmEx # EzARBgNVBAoTCkxvbXRlYy5jb20xKzApBgNVBAMTIkxvbXRlYy5jb20gQ2VydGlm # aWNhdGlvbiBBdXRob3JpdHkxJzAlBgkqhkiG9w0BCQEWGEltcmljaC5Tem9saWtA # bG9tdGVjLmNvbQICAKUwDQYJYIZIAWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEK # MAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3 # AgELMQ4wDAYKKwYBBAGCNwIBFjAvBgkqhkiG9w0BCQQxIgQg/eEQDlNlNw+KQ1zg # sLoeELYOl1zXjgYrRz+RFrHzlaIwDQYJKoZIhvcNAQEBBQAEggEAbSiNVK7BJktp # 7UG1vSIGb/GDAc5TFC6OoJByZKYMKNXtELXGVKhU9KjIH+hYz5SMZeXIZ39Aeqvn # Lu8j1mCRbA7DonygZg0IgjzfdLnQsez7JMuuqtAFgB/dxRZ/EY9lwERGUFvLLbo3 # qQj6FoLU8LR9M7GwK1uL99E8NYw0rSWQEKbJ2pK3pqxEB0ZD87i3Ul23JlQNjLTJ # g8kekQsDIXHLo0K0mu1awyXKcqZSYD56/Xdh63quQLF1edHpSDi4JtdXyd1x6cbr # kHAHbrqasrOtRAnsYjITh/FDd1VVRW0Jl4ntQcTA2kRo3d62JWXT8p03fGLQKXGg # 3/138kkWTQ== # SIG # End signature block |