




















@@ -91,6 +91,7 @@ import {
9191resolveGlobalInstallTarget,
9292resolveGlobalInstallSpec,
9393resolvePnpmGlobalDirFromGlobalRoot,
94+type ResolvedGlobalInstallTarget,
9495} from "../../infra/update-global.js";
9596import { cleanupStaleManagedServiceUpdateHandoffs } from "../../infra/update-managed-service-handoff-cleanup.js";
9697import { runGatewayUpdate, type UpdateRunResult } from "../../infra/update-runner.js";
@@ -1045,17 +1046,28 @@ async function resolvePackageRuntimePreflightError(params: {
10451046tag: string;
10461047timeoutMs?: number;
10471048nodeRunner?: string;
1049+spec?: string;
1050+command?: string;
1051+cwd?: string;
1052+env?: NodeJS.ProcessEnv;
10481053}): Promise<string | null> {
10491054if (!canResolveRegistryVersionForPackageTarget(params.tag)) {
10501055return null;
10511056}
1057+if (params.spec && !canResolveRegistryVersionForPackageTarget(params.spec)) {
1058+return null;
1059+}
10521060const target = params.tag.trim();
10531061if (!target) {
10541062return null;
10551063}
10561064const status = await fetchNpmPackageTargetStatus({
10571065 target,
1066+spec: params.spec,
10581067timeoutMs: params.timeoutMs,
1068+command: params.command,
1069+cwd: params.cwd,
1070+env: params.env,
10591071});
10601072if (status.error) {
10611073return null;
@@ -1503,21 +1515,26 @@ async function runPackageInstallUpdate(params: {
15031515invocationCwd?: string;
15041516honorPackageRoot?: boolean;
15051517nodeRunner?: string;
1518+installEnv?: NodeJS.ProcessEnv;
1519+installTarget?: ResolvedGlobalInstallTarget;
15061520}): Promise<UpdateRunResult> {
1507-const manager = await resolveGlobalManager({
1508-root: params.root,
1509-installKind: params.installKind,
1510-timeoutMs: params.timeoutMs,
1511-});
1512-const installEnv = await createGlobalInstallEnv();
1521+const installEnv = params.installEnv ?? (await createGlobalInstallEnv());
15131522const runCommand = createGlobalCommandRunner();
1514-const installTarget = await resolveGlobalInstallTarget({
1515- manager,
1516- runCommand,
1517-timeoutMs: params.timeoutMs,
1518-pkgRoot: params.root,
1519-honorPackageRoot: params.honorPackageRoot === true,
1520-});
1523+let installTarget = params.installTarget;
1524+if (!installTarget) {
1525+const manager = await resolveGlobalManager({
1526+root: params.root,
1527+installKind: params.installKind,
1528+timeoutMs: params.timeoutMs,
1529+});
1530+installTarget = await resolveGlobalInstallTarget({
1531+ manager,
1532+ runCommand,
1533+timeoutMs: params.timeoutMs,
1534+pkgRoot: params.root,
1535+honorPackageRoot: params.honorPackageRoot === true,
1536+});
1537+}
15211538const pkgRoot = installTarget.packageRoot;
15221539const packageName =
15231540(pkgRoot ? await readPackageName(pkgRoot) : await readPackageName(params.root)) ??
@@ -1620,7 +1637,7 @@ async function runPackageInstallUpdate(params: {
1620163716211638return {
16221639status: packageUpdate.failedStep ? "error" : "ok",
1623-mode: manager,
1640+mode: installTarget.manager,
16241641root: packageUpdate.verifiedPackageRoot ?? params.root,
16251642reason: packageUpdate.failedStep ? packageUpdate.failedStep.name : undefined,
16261643before: { version: beforeVersion },
@@ -3286,6 +3303,9 @@ async function updateCommandInternal(opts: UpdateCommandOptions): Promise<void>
32863303let downgradeRisk = false;
32873304let fallbackToLatest = false;
32883305let packageInstallSpec: string | null = null;
3306+let packageInstallEnv: NodeJS.ProcessEnv | undefined;
3307+let packageInstallCwd: string | undefined;
3308+let packageInstallTarget: ResolvedGlobalInstallTarget | undefined;
32893309let packageAlreadyCurrent = false;
32903310let managedServiceRootRedirect: ManagedServiceRootRedirect | null = null;
32913311// Resolved independently of the root redirect so it covers the common case
@@ -3340,11 +3360,46 @@ async function updateCommandInternal(opts: UpdateCommandOptions): Promise<void>
33403360}
3341336133423362if (updateInstallKind !== "git") {
3363+packageInstallEnv = await createGlobalInstallEnv();
3364+packageInstallCwd = tryResolveInvocationCwd();
3365+if (updateInstallKind === "package") {
3366+const manager = await resolveGlobalManager({
3367+ root,
3368+ installKind,
3369+timeoutMs: updateStepTimeoutMs,
3370+});
3371+packageInstallTarget = await resolveGlobalInstallTarget({
3372+ manager,
3373+runCommand: createGlobalCommandRunner(),
3374+timeoutMs: updateStepTimeoutMs,
3375+pkgRoot: root,
3376+honorPackageRoot:
3377+managedServiceRootRedirect !== null || managedServiceNodeRunner !== undefined,
3378+});
3379+}
3380+const npmMetadataCommand =
3381+packageInstallTarget?.manager === "npm" ? packageInstallTarget.command : undefined;
33433382currentVersion = switchToPackage ? null : await readPackageVersion(root);
33443383if (explicitTag) {
3345-targetVersion = await resolveTargetVersion(tag, timeoutMs);
3384+const explicitSpec = resolveGlobalInstallSpec({
3385+packageName: DEFAULT_PACKAGE_NAME,
3386+ tag,
3387+env: packageInstallEnv,
3388+});
3389+targetVersion = await resolveTargetVersion(tag, timeoutMs, {
3390+spec: explicitSpec,
3391+command: npmMetadataCommand,
3392+cwd: packageInstallCwd,
3393+env: packageInstallEnv,
3394+});
33463395} else {
3347-targetVersion = await resolveNpmChannelTag({ channel, timeoutMs }).then((resolved) => {
3396+targetVersion = await resolveNpmChannelTag({
3397+ channel,
3398+ timeoutMs,
3399+command: npmMetadataCommand,
3400+cwd: packageInstallCwd,
3401+env: packageInstallEnv,
3402+}).then((resolved) => {
33483403tag = resolved.tag;
33493404fallbackToLatest = channel === "beta" && resolved.tag === "latest";
33503405return resolved.version;
@@ -3367,7 +3422,7 @@ async function updateCommandInternal(opts: UpdateCommandOptions): Promise<void>
33673422packageInstallSpec = resolveGlobalInstallSpec({
33683423packageName: DEFAULT_PACKAGE_NAME,
33693424 tag,
3370-env: process.env,
3425+env: packageInstallEnv,
33713426});
33723427}
33733428@@ -3485,8 +3540,12 @@ async function updateCommandInternal(opts: UpdateCommandOptions): Promise<void>
34853540if (updateInstallKind === "package") {
34863541const runtimePreflightError = await resolvePackageRuntimePreflightError({
34873542 tag,
3543+spec: packageInstallSpec ?? undefined,
34883544 timeoutMs,
34893545nodeRunner: managedServiceNodeRunner,
3546+command: packageInstallTarget?.manager === "npm" ? packageInstallTarget.command : undefined,
3547+cwd: packageInstallCwd,
3548+env: packageInstallEnv,
34903549});
34913550if (runtimePreflightError) {
34923551defaultRuntime.error(runtimePreflightError);
@@ -3591,6 +3650,8 @@ async function updateCommandInternal(opts: UpdateCommandOptions): Promise<void>
35913650honorPackageRoot:
35923651managedServiceRootRedirect !== null || managedServiceNodeRunner !== undefined,
35933652nodeRunner: managedServiceNodeRunner,
3653+installEnv: packageInstallEnv,
3654+installTarget: packageInstallTarget,
35943655})
35953656 : await runGitUpdate({
35963657 root,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。