Skip to content

[rush] preferredVersions doesn't work when subspace is enabled. #5118

Open
@fzxen

Description

@fzxen

Summary

I am trying to enable subspace in my repo by flowing the doc. Then discovered a problem: After enabling the subspace feature, the preferredVersions in common-version will not take effect.

Details

when subspace is disable, rush will create a file named as pnpmfileSettings.json including preferredVersions.

export interface IPnpmfileShimSettings {
semverPath: string;
allPreferredVersions: { [dependencyName: string]: string };
allowedAlternativeVersions: { [dependencyName: string]: ReadonlyArray<string> };
/**
* The versions of all packages that are part of the workspace.
*/
workspaceVersions: Record<string, string>;
userPnpmfilePath?: string;
}

Then, pnpmfile.cjs read preferredVersions from pnpmfileSettings.json and it can set the preferred versions on the dependency map

function setPreferredVersions(dependencies: { [dependencyName: string]: string } | undefined): void {
for (const [name, version] of Object.entries(dependencies || {})) {
const preferredVersion: string | undefined = allPreferredVersions?.get(name);
if (preferredVersion && !allowedAlternativeVersions?.get(name)?.has(version)) {
let preferredVersionRange: TSemver.Range | undefined;
let versionRange: TSemver.Range | undefined;
try {
preferredVersionRange = new semver!.Range(preferredVersion);
versionRange = new semver!.Range(version);
} catch {
// Swallow invalid range errors
}
if (
preferredVersionRange &&
versionRange &&
semver!.subset(preferredVersionRange, versionRange, { includePrerelease: true })
) {
dependencies![name] = preferredVersion;
}
}
}
}

However, when subspace is enable, pnpmfileSettings.json no longer contains preferredVersion information

export interface ISubspacePnpmfileShimSettings {
semverPath: string;
workspaceProjects: Record<string, IWorkspaceProjectInfo>;
subspaceProjects: Record<string, IWorkspaceProjectInfo>;
userPnpmfilePath?: string;
}

rush create a file named as global-pnpmfile.cjs and it doesn't seem to implement any logic related to preferredVersions.

function init(context: IPnpmfileContext | any): IPnpmfileContext {
// Sometimes PNPM may provide us a context arg that doesn't fit spec, ex.:
// https://github.com/pnpm/pnpm/blob/97c64bae4d14a8c8f05803f1d94075ee29c2df2f/packages/get-context/src/index.ts#L134
// So we need to normalize the context format before we move on
if (typeof context !== 'object' || Array.isArray(context)) {
context = {
log: (message: string) => {},
originalContext: context
} as IPnpmfileContext;
}
if (!settings) {
// Initialize the settings from file
if (!context.splitWorkspacePnpmfileShimSettings) {
context.splitWorkspacePnpmfileShimSettings = __non_webpack_require__('./pnpmfileSettings.json');
}
settings = context.splitWorkspacePnpmfileShimSettings!;
} else if (!context.splitWorkspacePnpmfileShimSettings) {
// Reuse the already initialized settings
context.splitWorkspacePnpmfileShimSettings = settings;
}
// If a userPnpmfilePath is provided, we expect it to exist
if (!userPnpmfile && settings.userPnpmfilePath) {
userPnpmfile = require(settings.userPnpmfilePath);
}
// If a semverPath is provided, we expect it to exist
if (!semver && settings.semverPath) {
semver = require(settings.semverPath);
}
// Return the normalized context
return context as IPnpmfileContext;
}

Subspace does not support preferredVersions, does it?

Standard questions

Please answer these questions to help us investigate your issue more quickly:

Question Answer
@microsoft/rush globally installed version? 5.147.2
rushVersion from rush.json? 5.147.2
useWorkspaces from rush.json? Yes
Operating system? Mac
Would you consider contributing a PR? Yes
Node.js version (node -v)? v20.16.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    Needs Investigation

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions