Build/Build-Module.ps1
|
param ( # A CalVer string if you need to manually override the default yyyy.M.d version string. [string]$CalVer, [switch]$PublishToPSGallery, [string]$PSGalleryAPIPath, [string]$PSGalleryAPIKey ) if (Get-Module -Name 'PSPublishModule' -ListAvailable) { Write-Verbose 'PSPublishModule is installed.' } else { Write-Verbose 'PSPublishModule is not installed. Attempting installation.' try { Install-Module -Name Pester -AllowClobber -Scope CurrentUser -SkipPublisherCheck -Force Install-Module -Name PSScriptAnalyzer -AllowClobber -Scope CurrentUser -Force Install-Module -Name PSPublishModule -AllowClobber -Scope CurrentUser -Force } catch { Write-Error "PSPublishModule installation failed. $_" } } Update-Module -Name PSPublishModule Import-Module -Name PSPublishModule -Force $CopyrightYear = if ($Calver) { $CalVer.Split('.')[0] } else { (Get-Date -Format yyyy) } Build-Module -ModuleName 'Locksmith2' { # Usual defaults as per standard module $Manifest = [ordered] @{ ModuleVersion = if ($Calver) { $CalVer } else { (Get-Date -Format yyyy.M.d.Hmm) } CompatiblePSEditions = @('Desktop', 'Core') GUID = 'e32f7d0d-2b10-4db2-b776-a193958e3d69' Author = 'Jake Hildreth' CompanyName = 'Gilmour Technologies Ltd' Copyright = "(c) 2025 - $CopyrightYear. All rights reserved." Description = 'An AD CS toolkit for AD Admins, Defensive Security Professionals, and Filthy Red Teamers' ProjectUri = 'https://github.com/jakehildreth/Locksmith2' PowerShellVersion = '5.1' Tags = @('Locksmith', 'Locksmith2', 'ActiveDirectory', 'ADCS', 'CA', 'Certificate', 'CertificateAuthority', 'CertificateServices', 'PKI', 'X509', 'Windows') } New-ConfigurationManifest @Manifest # Add standard module dependencies (directly, but can be used with loop as well) New-ConfigurationModule -Type RequiredModule -Name 'PSCertutil' -Guid 'Auto' -Version 'Latest' # Add external module dependencies, using loop for simplicity $RequiredExternalModules = @( 'Microsoft.PowerShell.Utility', 'Microsoft.PowerShell.Archive', 'Microsoft.PowerShell.Management', 'Microsoft.PowerShell.Security', 'PowerShellGet', 'CimCmdlets' ) foreach ($Module in $RequiredExternalModules) { New-ConfigurationModule -Type ExternalModule -Name $Module } # Add approved modules, that can be used as a dependency, but only when specific function from those modules is used # And on that time only that function and dependant functions will be copied over # Keep in mind it has it's limits when "copying" functions such as it should not depend on DLLs or other external files #New-ConfigurationModule -Type ApprovedModule -Name 'PSSharedGoods', 'PSWriteColor', 'Connectimo', 'PSUnifi', 'PSWebToolbox', 'PSMyPassword' #New-ConfigurationModuleSkip -IgnoreFunctionName 'Invoke-Formatter', 'Find-Module' -IgnoreModuleName 'platyPS' New-ConfigurationModuleSkip -IgnoreModuleName 'PwshSpectreConsole', 'PSWriteHTML' $ConfigurationFormat = [ordered] @{ RemoveComments = $false PlaceOpenBraceEnable = $true PlaceOpenBraceOnSameLine = $true PlaceOpenBraceNewLineAfter = $true PlaceOpenBraceIgnoreOneLineBlock = $false PlaceCloseBraceEnable = $true PlaceCloseBraceNewLineAfter = $true PlaceCloseBraceIgnoreOneLineBlock = $false PlaceCloseBraceNoEmptyLineBefore = $true UseConsistentIndentationEnable = $true UseConsistentIndentationKind = 'space' UseConsistentIndentationPipelineIndentation = 'IncreaseIndentationAfterEveryPipeline' UseConsistentIndentationIndentationSize = 4 UseConsistentWhitespaceEnable = $true UseConsistentWhitespaceCheckInnerBrace = $true UseConsistentWhitespaceCheckOpenBrace = $true UseConsistentWhitespaceCheckOpenParen = $true UseConsistentWhitespaceCheckOperator = $true UseConsistentWhitespaceCheckPipe = $true UseConsistentWhitespaceCheckSeparator = $true AlignAssignmentStatementEnable = $true AlignAssignmentStatementCheckHashtable = $true UseCorrectCasingEnable = $true } # format PSD1 and PSM1 files when merging into a single file # enable formatting is not required as Configuration is provided # New-ConfigurationFormat -ApplyTo 'OnMergePSM1', 'OnMergePSD1' -Sort None @ConfigurationFormat # format PSD1 and PSM1 files within the module # enable formatting is required to make sure that formatting is applied (with default settings) New-ConfigurationFormat -ApplyTo 'DefaultPSD1', 'DefaultPSM1' -EnableFormatting -Sort None # when creating PSD1 use special style without comments and with only required parameters New-ConfigurationFormat -ApplyTo 'DefaultPSD1', 'OnMergePSD1' -PSD1Style 'Minimal' # configuration for documentation, at the same time it enables documentation processing New-ConfigurationDocumentation -Enable:$false -StartClean -UpdateWhenNew -PathReadme 'Docs\Readme.md' -Path 'Docs' New-ConfigurationImportModule -ImportSelf -ImportRequiredModules New-ConfigurationBuild -Enable:$true -SignModule:$false -DeleteTargetModuleBeforeBuild -MergeModuleOnBuild -MergeFunctionsFromApprovedModules -DoNotAttemptToFixRelativePaths -UseWildcardForFunctions New-ConfigurationArtefact -Type Unpacked -Enable -Path "$PSScriptRoot\..\Artefacts\Unpacked" #-RequiredModulesPath "$PSScriptRoot\..\Artefacts\Modules" New-ConfigurationArtefact -Type Packed -Enable -Path "$PSScriptRoot\..\Artefacts\Packed" -IncludeTagName # global options for publishing to github/psgallery if ($PublishToPSGallery) { if ($PSGalleryAPIKey) { # Use API key directly (from environment variable in CI) New-ConfigurationPublish -Type PowerShellGallery -ApiKey $PSGalleryAPIKey -Enabled:$true } elseif ($PSGalleryAPIPath) { # Use API key from file (for local development) New-ConfigurationPublish -Type PowerShellGallery -FilePath $PSGalleryAPIPath -Enabled:$true } else { Write-Error "PublishToPSGallery specified but neither PSGalleryAPIKey nor PSGalleryAPIPath provided." } } } |