qbo4.Nuget.ps1

<#
Manage iterative updating of Nuget packages.
These functions must be called from Visual Studio's Package Manager Console,
because they interact with Visual Studio.
 
Usage:
 
install-module qbo4.Infrastructure
import-module qbo4.Infrastructure
cd c:\source\devops\quandis\qbo3\
update-qbonugetpackages "3.0.7-CI-" qbo.Application.sln -prerelease
#>


function Update-qboNugetPackages {
    <#
    .SYNOPSIS
        Updates qbo-related Nuget packages in a solution
    .INPUTS
         
    #>

    [CmdletBinding()]
    Param(
        [Parameter(Position=0, Mandatory=$true)]
        [string]$Version,
        [Parameter(Position=1)]
        [string]$Solution=$dte.Solution.FullName,
        [Parameter(Position=2)]
        [string]$Filter="qbo",
        [Parameter(Position=3)]
        [string]$Source=$null,
        [Parameter(Position=4)]
        [string]$Include="*",
        [Parameter(Position=5)]
        [string]$Exclude="",
        [Parameter(Mandatory=$false)]
        [Switch]
        $Prerelease,
        [Switch]
        $WhatIf
    )
    if ($Version -match "-$") { $Version = $Version + (get-date -format 'yyyyMMdd-HHms') }
    $folder = split-path -path $Solution


    # open solution if not already open
    if ($Solution -ne $dte.Solution.FullName) {
        Write-Host "Opening $Solution"
        $dte.Solution.Open($Solution)
    }

    # move to solution root folder
    $item = get-item $dte.Solution.FullName
    cd $item.Directory.FullName

    Write-Host " Restoring nuget packages for $Solution"
    nuget restore $Solution

    # $packages = get-package -filter $filter | select-object id | get-unique -asstring
    $packages = get-package -filter $filter | % {$_.id } | sort | get-unique
    $projects = get-package -filter $filter | where-object {$_.ProjectName -notlike $Exclude } | where-object {$_.ProjectName -like $Include} | % {$_.ProjectName} | sort | get-unique 

    # Filter packages based on package source
    # Filter projects based on a project filter

    foreach ($package in $packages) { 
        if ($Source -ne $null) {
            Write-Host " Updating $($package) from $($Source)"
            update-package -id $package -source $source -IncludePrerelease:$Prerelease -whatif:$WhatIf -ErrorAction SilentlyContinue 
        } else {
            Write-Host " Updating $($package) from any feed"
            update-package -id $package -IncludePrerelease:$Prerelease -whatif:$WhatIf -ErrorAction SilentlyContinue 
        }
    }

    if ($WhatIf) {
        return
    }

    foreach ($project in $projects) {
        $csproj = $project + ".csproj"
        $path = (get-childitem -recurse -include $csproj).FullName
        Write-Host " Packing $project using version $Version"
        nuget pack $path -build -version $Version
    }

    # push instead of copy
    Write-Host " Push nuget packages to $source"
    $nugets = get-childitem -recurse -include "*$version.nupkg"
    foreach ($nuget in $nugets) { 
        Write-Host " Pushing $nuget"
        # copy $nuget $Repo
        nuget push -source $Source $nuget
    }
}

<#
Todo: create a wrapper function to execute in the proper build order for qbo3:
 
$solutions = @(
    "C:\source\devops\quandis\qbo3\qbo.Application.sln",
    "C:\source\devops\quandis\qbo3\qbo.Attachment.sln",
    "C:\source\devops\quandis\qbo3\qbo.Contact.sln",
)
$version = "3.0.7-CI-"
 
foreach ($solution in $solutions) {
    update-qbonugetpackages $solution $version -prerelease
 
}
 
#>


Export-ModuleMember -Function @('Update-qboNugetPackages')