-
Notifications
You must be signed in to change notification settings - Fork 132
Expand file tree
/
Copy pathUpdate-PSModuleManifest.ps1
More file actions
90 lines (79 loc) · 5.3 KB
/
Update-PSModuleManifest.ps1
File metadata and controls
90 lines (79 loc) · 5.3 KB
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
param
(
# Path to Module Manifest
[Parameter(Mandatory = $false)]
[string] $ModuleManifestPath = ".\release\*\*.*.*",
# Specifies a unique identifier for the module.
[Parameter(Mandatory = $false)]
[string] $Guid,
# Specifies the version of the module.
[Parameter(Mandatory = $false)]
[string] $ModuleVersion,
# Indicates the module is prerelease.
[Parameter(Mandatory = $false)]
[string] $Prerelease,
# Skip automatic additions to RequiredAssemblies from module file list.
[Parameter(Mandatory = $false)]
[switch] $SkipRequiredAssembliesDetection = $true
)
## Initialize
Import-Module "$PSScriptRoot\CommonFunctions.psm1" -Force -WarningAction SilentlyContinue -ErrorAction Stop
[hashtable] $paramUpdateModuleManifest = @{ }
[System.IO.FileInfo] $ModuleManifestFileInfo = Get-PathInfo $ModuleManifestPath -DefaultFilename "*.psd1" -ErrorAction Stop
#[System.IO.DirectoryInfo] $ModuleOutputDirectoryInfo = $ModuleManifestFileInfo.Directory
## Read Module Manifest
$ModuleManifest = Import-PowerShellDataFile $ModuleManifestFileInfo.FullName
$paramUpdateModuleManifest['NestedModules'] = $ModuleManifest['NestedModules'] | Where-Object { $null -ne $_ -and (Get-PathInfo $_ -DefaultDirectory $ModuleManifestFileInfo.DirectoryName -ErrorAction Ignore).Exists }
$paramUpdateModuleManifest['FunctionsToExport'] = $ModuleManifest['FunctionsToExport']
$paramUpdateModuleManifest['CmdletsToExport'] = $ModuleManifest['CmdletsToExport']
$paramUpdateModuleManifest['AliasesToExport'] = $ModuleManifest['AliasesToExport']
if ($ModuleManifest.PrivateData.PSData['Prerelease'] -eq 'source') { $paramUpdateModuleManifest['Prerelease'] = " " }
## Override from Parameters
if ($Guid) { $paramUpdateModuleManifest['Guid'] = $Guid }
if ($ModuleVersion) { $paramUpdateModuleManifest['ModuleVersion'] = $ModuleVersion }
if ($Prerelease) { $paramUpdateModuleManifest['Prerelease'] = $Prerelease }
## Get Module Output FileList
$ModuleFileListFileInfo = Get-ChildItem $ModuleManifestFileInfo.DirectoryName -Recurse -File
$ModuleRequiredAssembliesFileInfo = $ModuleFileListFileInfo | Where-Object Extension -EQ '.dll'
## Get Paths Relative to Module Base Directory
$ModuleFileList = Get-RelativePath $ModuleFileListFileInfo.FullName -WorkingDirectory $ModuleManifestFileInfo.DirectoryName -ErrorAction Stop
$ModuleFileList = $ModuleFileList -replace '\\net45\\', '\!!!\' -replace '\\netcoreapp2.1\\', '\net45\' -replace '\\!!!\\', '\netcoreapp2.1\' # PowerShell Core fails to load assembly if net45 dll comes before netcoreapp2.1 dll in the FileList.
$paramUpdateModuleManifest['FileList'] = $ModuleFileList
## Generate RequiredAssemblies list based on existing items and file list
$paramUpdateModuleManifest['RequiredAssemblies'] = $ModuleManifest['RequiredAssemblies'] | Where-Object { $_ -notin $ModuleFileListFileInfo.Name }
if (!$SkipRequiredAssembliesDetection -and $ModuleRequiredAssembliesFileInfo) {
$ModuleRequiredAssemblies = Get-RelativePath $ModuleRequiredAssembliesFileInfo.FullName -WorkingDirectory $ModuleManifestFileInfo.DirectoryName -ErrorAction Stop
$paramUpdateModuleManifest['RequiredAssemblies'] += $ModuleRequiredAssemblies
}
## Clear Existing RequiredAssemblies, NestedModules, and FileList
# if ($paramUpdateModuleManifest.ContainsKey('RequiredAssemblies')) {
# if (!$paramUpdateModuleManifest['RequiredAssemblies']) { $paramUpdateModuleManifest.Remove('RequiredAssemblies') }
# (Get-Content $ModuleManifestFileInfo.FullName -Raw) -replace "(?s)(#\s*)?RequiredAssemblies\s*=\s*@\([^)]*\)", "# RequiredAssemblies = @()" | Set-Content $ModuleManifestFileInfo.FullName
# }
# if ($paramUpdateModuleManifest.ContainsKey('NestedModules') -and !$paramUpdateModuleManifest['NestedModules']) {
# $paramUpdateModuleManifest.Remove('NestedModules')
# (Get-Content $ModuleManifestFileInfo.FullName -Raw) -replace "(?s)(#\s*)?NestedModules\s*=\s*@\([^)]*\)", "# NestedModules = @()" | Set-Content $ModuleManifestFileInfo.FullName
# }
# if ($paramUpdateModuleManifest.ContainsKey('FileList')) {
# (Get-Content $ModuleManifestFileInfo.FullName -Raw) -replace "(?s)(#\s*)?FileList\s*=\s*@\([^)]*\)", "# FileList = @()" | Set-Content $ModuleManifestFileInfo.FullName
# }
## Install Module Dependencies
foreach ($Module in $ModuleManifest['RequiredModules']) {
if ($Module -is [hashtable]) { $ModuleName = $Module.ModuleName }
else { $ModuleName = $Module }
if ($ModuleName -notin $ModuleManifest.PrivateData.PSData['ExternalModuleDependencies'] -and !(Get-Module $ModuleName -ListAvailable)) {
Install-Module $ModuleName -Force -SkipPublisherCheck -Repository PSGallery -AcceptLicense
}
}
## Save original manifest content before Update-ModuleManifest corrupts
## custom PrivateData keys containing hashtable arrays (it serializes them as type name strings).
## Update Module Manifest in Module Output Directory
# Update-ModuleManifest -Path $ModuleManifestFileInfo.FullName -ErrorAction Stop @paramUpdateModuleManifest
foreach ($key in $paramUpdateModuleManifest.Keys) {
if ($paramUpdateModuleManifest[$key]) { # Only update manifest properties that have values
Update-Metadata -Path $ModuleManifestFileInfo.FullName -PropertyName $key -Value $paramUpdateModuleManifest[$key]
}
else {
Write-Debug -Message ('Metadata is empty for {0}, skipping update for this property.' -f $key)
}
}