diff --git a/lib/definitions/project.d.ts b/lib/definitions/project.d.ts index a7467b90eb..45eecd2de7 100644 --- a/lib/definitions/project.d.ts +++ b/lib/definitions/project.d.ts @@ -346,7 +346,7 @@ interface IProjectConfigService { * Get value for a given config key path * @param key the property key path */ - getValue(key: string): any; + getValue(key: string, defaultValue?: any): any; /** * Set value for a given config key path * @param key the property key path diff --git a/lib/package-manager.ts b/lib/package-manager.ts index 3ba18aaf9e..8bc54a92cf 100644 --- a/lib/package-manager.ts +++ b/lib/package-manager.ts @@ -16,6 +16,7 @@ import { IDictionary, } from "./common/declarations"; import { injector } from "./common/yok"; +import { IProjectConfigService } from "./definitions/project"; export class PackageManager implements IPackageManager { private packageManager: INodePackageManager; private _packageManagerName: string; @@ -27,7 +28,8 @@ export class PackageManager implements IPackageManager { private $yarn: INodePackageManager, private $pnpm: INodePackageManager, private $logger: ILogger, - private $userSettingsService: IUserSettingsService + private $userSettingsService: IUserSettingsService, + private $projectConfigService: IProjectConfigService ) {} @cache() @@ -140,6 +142,25 @@ export class PackageManager implements IPackageManager { ); } + try { + const configPm = this.$projectConfigService.getValue( + "cli.packageManager" + ); + + if (configPm) { + this.$logger.trace( + `Determined packageManager to use from user config is: ${configPm}` + ); + pm = configPm; + } + } catch (err) { + // ignore error, but log info + this.$logger.trace( + "Tried to read cli.packageManager from project config and failed. Error is: ", + err + ); + } + if (pm === PackageManagers.yarn || this.$options.yarn) { this._packageManagerName = PackageManagers.yarn; return this.$yarn; diff --git a/test/ios-project-service.ts b/test/ios-project-service.ts index 5993c6d124..6de7894a86 100644 --- a/test/ios-project-service.ts +++ b/test/ios-project-service.ts @@ -35,6 +35,7 @@ import { ProjectDataStub, TempServiceStub, ProjectDataServiceStub, + ProjectConfigServiceStub, } from "./stubs"; import { xcode } from "../lib/node/xcode"; import temp = require("temp"); @@ -172,6 +173,7 @@ function createTestInjector( getSettingValue: async (settingName: string): Promise => undefined, }); testInjector.register("packageManager", PackageManager); + testInjector.register("projectConfigService", ProjectConfigServiceStub); testInjector.register("npm", NodePackageManager); testInjector.register("yarn", YarnPackageManager); testInjector.register("xcconfigService", XcconfigService); diff --git a/test/package-installation-manager.ts b/test/package-installation-manager.ts index 64878d987a..9b9bcea58d 100644 --- a/test/package-installation-manager.ts +++ b/test/package-installation-manager.ts @@ -15,7 +15,7 @@ import * as yok from "../lib/common/yok"; import ChildProcessLib = require("../lib/common/child-process"); import { SettingsService } from "../lib/common/test/unit-tests/stubs"; import { ProjectDataService } from "../lib/services/project-data-service"; -import { ProjectDataStub } from "./stubs"; +import { ProjectConfigServiceStub, ProjectDataStub } from "./stubs"; import { IInjector } from "../lib/common/definitions/yok"; import * as _ from "lodash"; import { IDictionary } from "../lib/common/declarations"; @@ -48,6 +48,7 @@ function createTestInjector(): IInjector { testInjector.register("yarn", YarnLib.YarnPackageManager); testInjector.register("pnpm", PnpmLib.PnpmPackageManager); testInjector.register("packageManager", PackageManagerLib.PackageManager); + testInjector.register("projectConfigService", ProjectConfigServiceStub); testInjector.register( "packageInstallationManager", PackageInstallationManagerLib.PackageInstallationManager diff --git a/test/plugins-service.ts b/test/plugins-service.ts index 4a5e5a75b4..d5b74fd4ba 100644 --- a/test/plugins-service.ts +++ b/test/plugins-service.ts @@ -68,6 +68,10 @@ function createTestInjector() { getSettingValue: async (settingName: string): Promise => undefined, }); testInjector.register("packageManager", PackageManager); + testInjector.register( + "projectConfigService", + stubs.PackageInstallationManagerStub + ); testInjector.register("npm", NodePackageManager); testInjector.register("yarn", YarnPackageManager); testInjector.register("pnpm", PnpmPackageManager); diff --git a/test/services/extensibility-service.ts b/test/services/extensibility-service.ts index b6dbca09b5..672ff84db0 100644 --- a/test/services/extensibility-service.ts +++ b/test/services/extensibility-service.ts @@ -57,6 +57,10 @@ describe("extensibilityService", () => { testInjector.register("hostInfo", HostInfo); testInjector.register("httpClient", {}); testInjector.register("packageManager", PackageManager); + testInjector.register( + "projectConfigService", + stubs.ProjectConfigServiceStub + ); testInjector.register("options", {}); testInjector.register("pacoteService", { manifest: async (