Releases: adamschlesinger/uepm
Releases · adamschlesinger/uepm
v2.0.0
v2.0.0 is a complete rewrite of UEPM in Rust. The binary is fully self-contained —
no Node.js runtime is required for plugin consumers or authors. All registry
communication is handled directly over HTTPS using the npm registry protocol.
Breaking Changes
Config/UEPM.inisection[Package]renamed to[Plugin]— update any
existing plugin manifests that declare a[Package]section.Config/UEPM.inisection[Plugins]renamed to[Dependencies]— update
any existing project or plugin manifests that declare a[Plugins]section.- The tool is now distributed as a compiled binary via GitHub Releases. The previous
npm-based install (npm install -g uepm) no longer applies. Use the new install
scripts instead (see README).
Added
Plugin consumer workflow
uepm install [@scope/plugin[@version]]— resolves semver ranges against the npm
registry, downloads and sha512-verifies tarballs, extracts intoUEPMPlugins/,
pins new packages to^<resolved>inConfig/UEPM.ini, and writesuepm.lockuepm install(no arguments) — reinstalls everything listed inConfig/UEPM.ini,
usinguepm.lockfor reproducible versionsuepm uninstall @scope/plugin— removes the plugin directory and its entry from
bothConfig/UEPM.inianduepm.lockuepm update [@scope/plugin]— re-resolves to the latest version satisfying the
declared range, ignoring the lockfile; updatesuepm.lockuepm list— prints all installed plugins, their resolved versions, and whether
each plugin's declared engine range is compatible with the project's engine versionuepm.lock— deterministic lockfile recording resolved version, tarball URL, and
sha512 integrity for every installed plugin (including transitives)- Recursive transitive dependency resolution — if an installed plugin declares its
own[Dependencies], those are resolved and installed automatically; conflicts
between required versions are reported as errors file:protocol —uepm install file:../my-plugincreates a symlink in
UEPMPlugins/pointing at a local directory, enabling live development without
publishing to the registryCommitPluginssetting in[Settings]— whentrue,UEPMPlugins/is tracked
in VCS; whenfalse(default),uepm initwritesUEPMPlugins/to.gitignore
or.p4ignoreautomatically- Perforce detection —
uepm initwrites.p4ignoreinstead of.gitignorewhen
P4PORT/P4CONFIGenv vars or a.p4configfile are present .uprojectinjection —uepm initaddsUEPMPluginsto theAdditionalPluginDirectories
array in the project's.uprojectfile so Unreal picks up installed plugins
Plugin author workflow
uepm init(plugin context) — detects.upluginfiles and prompts for[Plugin]
metadata (name, version, description, author, license, engine range, main), with
defaults derived from.upluginfields (FriendlyName,VersionName,CreatedBy,
Description)[Plugin]section inConfig/UEPM.ini— plugin authors declare distribution
metadata alongside[Dependencies]; project manifests without a[Plugin]section
are unaffecteduepm publish— validates[Plugin], builds a.tgztarball in memory, computes
SHA-512 integrity + SHA-1 shasum, and PUTs directly to the npm registry API; no
Node.js or npm required. Supports--dry-run,--tag,--access, OTP prompting
on 401, andUEPM_TOKENfor authentication- Engine version detection — scans Epic's
LauncherInstalled.daton macOS/Linux (and
the Windows registry on Windows) to pre-fill the engine compatibility range during
uepm init
Distribution
install.sh— curl-pipe-sh installer for macOS and Linux; detects architecture and
downloads the correct binary from GitHub Releasesinstall.ps1— PowerShell installer for Windows; updates the current session's
PATHsouepmis available immediately without reopening the terminalUEPM_REGISTRYenv var — override the registry base URL (useful for private registries
or testing)UEPM_TOKENenv var — bearer token for authenticated registry operationsUEPM_VERSIONenv var — pin the version installed byinstall.sh/install.ps1
(useful for CI pipelines that need a specific release)
Changed
- Tool renamed from "Unreal Engine Package Manager" to Unreal Engine Plugin Manager
(binary nameuepmis unchanged) Config/UEPM.iniis now included in published tarballs so consumers can resolve
transitive dependencies after extraction- Lockfile now records a
dependenciesmap per plugin entry for transitive deps
Fixed
uepm listengine compatibility check now correctly tests whether the project's
engine version satisfies each plugin's declared engine range (previously always
reported incompatible)uepm update <plugin>now preserves all other locked packages; previously wiped
the entire lockfile and re-fetched fresh versions for everythinguepm uninstallnow removes the package entry fromuepm.lock; previously left
a stale entry that could resurface on re-install- Tarball extraction now rejects entries with
..path components or absolute paths,
preventing path traversal even from a compromised registry package - Transitive dependencies are now correctly installed and recorded in
uepm.lock
when a registry package declares its own[Dependencies] NoMatchingVersionerror now correctly names the package in the messageCommitPluginsis now always persisted on re-init, even when the engine association
is a launcher GUID rather than a version string- Engine compatibility ranges use comma-separated form (
>=5.3.0, <6.0.0) as
required by the semver crate
UEPM v1.1.0
Full Changelog: https://github.com/bad-planning/uepm/commits/v1.1.0