Skip to content

Fix module import failure when newer Admin or Fonts versions are installed #64

@MariusStorhaug

Description

The NerdFonts module depends on the Admin and Fonts modules. When either dependency is updated beyond the pinned version, Import-Module NerdFonts fails because the #Requires directives use RequiredVersion, which demands an exact match.

This is a blocking issue on PowerShell 7.5+ where module auto-update behavior and side-by-side version loading interact poorly with exact version pins.

Originally reported by Michael Kriese (@viceice) in #53.

Request

What happens

When a user has a newer version of Admin (e.g., 1.1.13) or Fonts (e.g., 1.1.26) installed, importing NerdFonts fails:

Import-Module NerdFonts
Import-Module: The required module 'Admin' is not loaded. Load the module or remove the module from
'RequiredModules' in the file '[...]PowerShell\Modules\NerdFonts\1.0.32\NerdFonts.psd1'.

The user has no way to resolve this without manually installing the exact pinned version of each dependency alongside the newer one.

What is expected

Newer versions of Admin and Fonts should satisfy the dependency constraint. The #Requires directives should specify a minimum version, not an exact version, so that any version equal to or greater than the stated version is accepted.

Environment

  • Module version: 1.0.32
  • PowerShell: 7.5+ (Core)
  • OS: Windows (also affects Linux/macOS)

Regression

This was not previously noticeable because the dependency modules had not been updated beyond the pinned versions. It became a problem once Admin and Fonts released newer versions.

Workaround

Manually install the exact pinned versions of Admin (1.1.6) and Fonts (1.1.21) alongside any newer versions already present. This is fragile and defeats the purpose of semantic versioning.

Acceptance criteria

  • Import-Module NerdFonts succeeds when the installed versions of Admin and Fonts are equal to or newer than the minimum required versions
  • The #Requires directives use ModuleVersion (minimum version) instead of RequiredVersion (exact version)
  • No change in behavior when the exact pinned versions are installed

Related


Technical decisions

Directive syntax: Change from RequiredVersion to ModuleVersion in the #Requires -Modules hashtable. ModuleVersion specifies the minimum acceptable version, allowing any newer version to satisfy the constraint.

Minimum versions: Bump the floor to the latest published versions of each dependency at the time of the fix, rather than carrying forward stale pins:

  • Admin: 1.1.13 (aligned with PSModule/Fonts#59)
  • Fonts: 1.1.26 (latest published version)

Both modules follow SemVer, so any future minor/patch release remains compatible.

Note

Why ModuleVersion (minimum) instead of RequiredVersion (exact pin):
Per the official PowerShell module manifest documentation, version constraints in both RequiredModules and #Requires -Modules support three strategies:

Key Behavior Risk
RequiredVersion Exact pin — only that version satisfies Causes "dependency hell" when any newer version is installed
ModuleVersion Minimum floor — any version ≥ value satisfies Recommended default. Works as long as the dependency honors SemVer
ModuleVersion + MaximumVersion Major-pinned range — allows minor/patch, blocks next major Best protection when a future major version may introduce breaking changes

Exact pinning (RequiredVersion) should be avoided for published modules that follow SemVer. It is the root cause of this bug.

Test file: The test file tests/NerdFonts.Tests.ps1 also uses RequiredVersion for Pester (5.7.1). This is a separate concern — Pester version pinning in tests is intentional and common. It should not be changed in this issue.

Future consideration: migrate from #Requires to manifest RequiredModules

The #Requires -Modules directive on individual function files is evaluated at script scope and does not cause Install-Module / Install-PSResource to auto-install dependencies. It only asserts presence at load time.

The module manifest RequiredModules key, by contrast:

  • Is resolved and auto-installed by the PowerShell Gallery when a user runs Install-Module NerdFonts
  • Provides a single, authoritative declaration of dependencies (no duplication across files)
  • Supports the same ModuleVersion / MaximumVersion / RequiredVersion syntax

Moving the Admin and Fonts dependency declarations from per-file #Requires directives to RequiredModules in the module manifest would eliminate duplication and give users automatic dependency resolution. This is tracked as a follow-up, not part of this fix.


Implementation plan

Core changes

  • In src/functions/public/Install-NerdFont.ps1, change line 1 from #Requires -Modules @{ ModuleName = 'Fonts'; RequiredVersion = '1.1.21' } to #Requires -Modules @{ ModuleName = 'Fonts'; ModuleVersion = '1.1.26' }
  • In src/functions/public/Install-NerdFont.ps1, change line 2 from #Requires -Modules @{ ModuleName = 'Admin'; RequiredVersion = '1.1.6' } to #Requires -Modules @{ ModuleName = 'Admin'; ModuleVersion = '1.1.13' }

Verification

  • Verify Import-Module NerdFonts succeeds with newer versions of Admin and Fonts installed
  • Verify Import-Module NerdFonts still succeeds with the exact minimum versions installed
  • Verify Install-NerdFont functions correctly after the change

Metadata

Metadata

Assignees

No one assigned

    Labels

    PatchbugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions