Staging flattens a culture directory's .psd1 into the output root
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 74/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- powershell
- Domain
- build-system
Research direction
Start at the Build-PSBuildModule staging logic described in the issue, and review related issues #206, #207, and #210 before changing the depth behavior. Verify that root manifest and module files still stage correctly while a localized en-US/Messages.psd1 is not copied into the output root.
Written by the indexing model from the issue text.
Description
Found while researching #207. Reading the code confirms it; it is also visible in that issue's own reproduction output.
What happens
Build-PSBuildModule stages the module's loose files with:
$getChildItemSplat = @{
Path = $Path
Include = "*.psm1", "*.psd1", "*.ps1xml"
Depth = 1
}
Get-ChildItem @getChildItemSplat |
Copy-Item -Destination $DestinationPath -Force
-Depth 1 implies recursion one level down, so this matches en-US/Messages.psd1 — and Copy-Item -Destination $DestinationPath writes it flat into the output root, discarding the directory it came from.
A module with a localized Messages.psd1 therefore builds an output containing a stray Messages.psd1 at the root that nothing reads. If CopyDirectories also names en-US, the correct copy is there too, and the built tree carries both.
Why it matters, mildly
Nothing breaks. Import-LocalizedData resolves through the culture directory and ignores the stray file, and a module without a culture directory never hits it. The costs are that the published package carries a file that serves no purpose and misleads anyone reading the tree, and that a consumer debugging localization finds two copies of the same file and has to work out which one is live.
It is also the same root cause as #210, seen from the other side: the depth-1 glob is trying to serve two purposes — collect the root manifest and module file, and leave everything else to CopyDirectories — and reaches one level too far.
Options
- Drop
-Depth 1, so the glob matches only the root. The manifest and root module are always at the root, so nothing intended is lost. Anything deeper isCopyDirectories' job. Smallest change. - Preserve relative paths when copying, so
en-US/Messages.psd1lands aten-US/Messages.psd1. More faithful, and it would partly address #210 — but it makes the glob a second, implicit staging mechanism competing withCopyDirectories, which is how the two got tangled in the first place. - Leave it. The stray file is inert.
(1) looks right, and it is a one-word deletion. But -Depth 1 was presumably added deliberately at some point, and I could not find what for — worth a moment's thought before removing it, in case some layout depends on it.
Related: #206, #207 and #210 are all in this same staging logic. Worth deciding together.
- Dominant language
- PowerShell
- Stars
- 145
- Forks
- 27
- Avg merge
- 10h 16m
- Merged PRs (30d)
- 34
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from psake/PowerShellBuild
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
psake/PowerShellBuild#218 · 1 comment ·
-
CI: Install the built module from a local repository to verify install-time dependency behaviour Openenhancement github_actions
Difficulty 4/5 3-5 days Newbie friendliness 68/100
psake/PowerShellBuild#229 ·
-
bug
Difficulty 3/5 1-2 days Newbie friendliness 55/100
psake/PowerShellBuild#222 ·
-
bug
Difficulty 4/5 3-5 days Newbie friendliness 68/100
psake/PowerShellBuild#221 ·
-
bug
Difficulty 3/5 1-2 days Newbie friendliness 55/100
psake/PowerShellBuild#220 ·
All issues in psake/PowerShellBuild
Similar issues
-
type/automation type/tech-debt
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
priority: p3
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
googleapis/librarian#7636 ·
-
package-update
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
oSoWoSo/vOid_Community_repOsitory#147 · 1 comment ·
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
-
agentic-workflows cascade-suspected
Difficulty 1/5 Under an hour Newbie friendliness 88/100