Skip to content

Commit 8d85266

Browse files
Fail build on cyclical class dependencies
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent 18d9d8b commit 8d85266

3 files changed

Lines changed: 31 additions & 11 deletions

File tree

.github/actions/Build-PSModule/src/helpers/Build/Add-ContentFromItem.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Write-Debug "[`$scriptName] - $relativeFolderPath - Processing folder"
3939

4040
if ($DependencyAware) {
4141
$files = $Path | Get-ChildItem -Recurse -File -Force -Filter '*.ps1' | Sort-Object -Property FullName
42-
$files = Get-DependencyOrderedScriptFiles -Files $files
42+
$files = Get-DependencyOrderedScriptFile -Files $files
4343
} else {
4444
$files = $Path | Get-ChildItem -File -Force -Filter '*.ps1' | Sort-Object -Property FullName
4545
}

.github/actions/Build-PSModule/src/helpers/Build/Build-PSModuleRootModule.ps1

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,13 @@ Write-Debug "[$scriptName] - [data] - Done"
187187
if (-not (Test-Path -Path $scriptFolderPath)) {
188188
continue
189189
}
190-
Add-ContentFromItem -Path $scriptFolderPath -RootModuleFilePath $rootModuleFile -RootPath $ModuleOutputFolder -DependencyAware:$dependencyAware
190+
$addContentParams = @{
191+
Path = $scriptFolderPath
192+
RootModuleFilePath = $rootModuleFile
193+
RootPath = $ModuleOutputFolder
194+
DependencyAware = $dependencyAware
195+
}
196+
Add-ContentFromItem @addContentParams
191197
Remove-Item -Path $scriptFolderPath -Force -Recurse
192198
}
193199
#endregion - Add content from subfolders

.github/actions/Build-PSModule/src/helpers/Build/Get-DependencyOrderedScriptFiles.ps1 renamed to .github/actions/Build-PSModule/src/helpers/Build/Get-DependencyOrderedScriptFile.ps1

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
1-
function Get-DependencyOrderedScriptFiles {
1+
function Get-DependencyOrderedScriptFile {
2+
<#
3+
.SYNOPSIS
4+
Sorts script files so class/enum dependencies are loaded before dependents.
5+
6+
.DESCRIPTION
7+
Reads declared class/enum types and type references from each script and returns
8+
files in dependency order. When a cyclical dependency is detected, the function
9+
warns and throws to fail the build early.
10+
11+
.EXAMPLE
12+
Get-DependencyOrderedScriptFile -Files (Get-ChildItem -Path '.\classes' -Filter '*.ps1')
13+
#>
214
[OutputType([System.IO.FileInfo[]])]
315
[CmdletBinding()]
416
param(
517
[Parameter(Mandatory)]
618
[System.IO.FileInfo[]] $Files
719
)
820

9-
$sortedFiles = $Files | Sort-Object -Property FullName
21+
[System.IO.FileInfo[]]$sortedFiles = $Files | Sort-Object -Property FullName
1022
if ($sortedFiles.Count -le 1) {
1123
return $sortedFiles
1224
}
@@ -67,8 +79,8 @@ function Get-DependencyOrderedScriptFiles {
6779
$remainingPaths = @($sortedFiles.FullName)
6880
$ready = @(
6981
$remainingPaths |
70-
Where-Object { $dependenciesByPath[$_].Count -eq 0 } |
71-
Sort-Object
82+
Where-Object { $dependenciesByPath[$_].Count -eq 0 } |
83+
Sort-Object
7284
)
7385
$orderedPaths = [System.Collections.Generic.List[string]]::new()
7486

@@ -89,11 +101,13 @@ function Get-DependencyOrderedScriptFiles {
89101

90102
if ($orderedPaths.Count -lt $sortedFiles.Count) {
91103
$remainingNames = ($remainingPaths | ForEach-Object { [System.IO.Path]::GetFileName($_) }) -join ', '
92-
Write-Warning "Cyclical class/enum dependencies detected in [$($sortedFiles[0].DirectoryName)]. Falling back to lexical order for unresolved files: $remainingNames"
93-
$remainingPaths | Sort-Object | ForEach-Object {
94-
$orderedPaths.Add($_)
95-
}
104+
$message = @(
105+
"Cyclical class/enum dependencies detected in [$($sortedFiles[0].DirectoryName)]."
106+
"Build cannot continue with unresolved files: $remainingNames"
107+
) -join ' '
108+
Write-Warning $message
109+
throw $message
96110
}
97111

98-
return @($orderedPaths | ForEach-Object { $metadataByPath[$_].File })
112+
return [System.IO.FileInfo[]]@($orderedPaths | ForEach-Object { $metadataByPath[$_].File })
99113
}

0 commit comments

Comments
 (0)