Public/Set-ModuleFormats.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
function Set-ModuleFormats {
    <#
    .SYNOPSIS
        EXPIRIMENTAL: Set FormatsToProcess
        
        [string]$FormatsPath in a module manifest

    .FUNCTIONALITY
        CI/CD

    .DESCRIPTION
        EXPIRIMENTAL: Set FormatsToProcess
        
        [string]$FormatsPath in a module manifest

    .PARAMETER Name
        Name or path to module to inspect. Defaults to ProjectPath\ProjectName via Get-BuildVariables

    .PARAMETER FormatsToProcess
        Array of .ps1xml files

    .PARAMETER FormatsRelativePath
        Path to the ps1xml files relatives to the root of the module (example: ".\Format")

    .NOTES
        Major thanks to Joel Bennett for the code behind working with the psd1
            Source: https://github.com/PoshCode/Configuration

    .EXAMPLE
        Set-ModuleFormats -FormatsRelativePath '.\Format'

        Update module manifiest FormatsToProcess parameters with all the .ps1xml present in the .\Format folder.

    .LINK
        https://github.com/RamblingCookieMonster/BuildHelpers

    .LINK
        about_BuildHelpers
    #>

    [cmdletbinding()]
    param(
        [parameter(ValueFromPipeline = $True)]
        [Alias('Path')]
        [string]$Name,

        [string[]]$FormatsToProcess,

        [string]$FormatsRelativePath
    )
    Process
    {
        if(-not $Name)
        {
            $BuildDetails = Get-BuildVariables
            $Name = Join-Path ($BuildDetails.ProjectPath) (Get-ProjectName)
        }

        $params = @{
            Force = $True
            Passthru = $True
            Name = $Name
        }

        # Create a runspace
        $PowerShell = [Powershell]::Create()

        # Add scriptblock to the runspace
        [void]$PowerShell.AddScript({
            Param ($Force, $Passthru, $Name)
            Import-Module -Name $Name -PassThru:$Passthru -Force:$Force

        }).AddParameters($Params)

        #Invoke the command
        $Module = $PowerShell.Invoke()

        if(-not $Module)
        {
            Throw "Could not find module '$Name'"
        }

        $Parent = $Module.ModuleBase
        $File = "$($Module.Name).psd1"
        $ModulePSD1Path = Join-Path $Parent $File
        if(-not (Test-Path $ModulePSD1Path))
        {
            Throw "Could not find expected module manifest '$ModulePSD1Path'"
        }

        if(-not $FormatsToProcess)
        {
            $FormatPath = Join-Path -Path $Parent -ChildPath $FormatsRelativePath
            $FormatList = Get-ChildItem -Path $FormatPath\*.ps1xml

            $FormatsToProcess = @()
            Foreach ($Item in $FormatList) {
                $FormatsToProcess += Join-Path -Path $FormatsRelativePath -ChildPath $Item.Name
            }
        }

        Update-MetaData -Path $ModulePSD1Path -PropertyName FormatsToProcess -Value $FormatsToProcess

        # Close down the runspace
        $PowerShell.Dispose()
    }
}