From 13b0f4ce10bc861a0935ae3b4da034b8fceb4eb3 Mon Sep 17 00:00:00 2001 From: fatme Date: Mon, 21 Jan 2019 08:16:21 +0200 Subject: [PATCH] fix: use `npm view` command to get gradle versions from registry in order to fix the problems when private npm registry is configured Rel to https://github.com/NativeScript/nativescript-cli/issues/4283 --- lib/base-package-manager.ts | 2 +- lib/services/android-plugin-build-service.ts | 40 ++++++++++++++++--- test/services/android-plugin-build-service.ts | 28 +++++++++++++ 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/lib/base-package-manager.ts b/lib/base-package-manager.ts index ecfdfbfb0e..4352acce18 100644 --- a/lib/base-package-manager.ts +++ b/lib/base-package-manager.ts @@ -93,7 +93,7 @@ export abstract class BasePackageManager implements INodePackageManager { array.push(`--${flag}`); array.push(`${config[flag]}`); } else if (config[flag]) { - if (flag === "dist-tags" || flag === "versions" || flag === "name") { + if (flag === "dist-tags" || flag === "versions" || flag === "name" || flag === "gradle") { array.push(` ${flag}`); continue; } diff --git a/lib/services/android-plugin-build-service.ts b/lib/services/android-plugin-build-service.ts index 7894bd6f41..b7254d65f7 100644 --- a/lib/services/android-plugin-build-service.ts +++ b/lib/services/android-plugin-build-service.ts @@ -294,26 +294,56 @@ export class AndroidPluginBuildService implements IAndroidPluginBuildService { } private async getRuntimeGradleVersions(projectDir: string): Promise { - const registryData = await this.$packageManager.getRegistryPackageData(TNS_ANDROID_RUNTIME_NAME); let runtimeGradleVersions: IRuntimeGradleVersions = null; if (projectDir) { const projectRuntimeVersion = this.$platformService.getCurrentPlatformVersion( this.$devicePlatformsConstants.Android, this.$projectDataService.getProjectData(projectDir)); - runtimeGradleVersions = this.getGradleVersions(registryData.versions[projectRuntimeVersion]); + runtimeGradleVersions = await this.getGradleVersions(projectRuntimeVersion); this.$logger.trace(`Got gradle versions ${JSON.stringify(runtimeGradleVersions)} from runtime v${projectRuntimeVersion}`); } if (!runtimeGradleVersions) { - const latestRuntimeVersion = registryData["dist-tags"].latest; - runtimeGradleVersions = this.getGradleVersions(registryData.versions[latestRuntimeVersion]); + const latestRuntimeVersion = await this.getLatestRuntimeVersion(); + runtimeGradleVersions = await this.getGradleVersions(latestRuntimeVersion); this.$logger.trace(`Got gradle versions ${JSON.stringify(runtimeGradleVersions)} from the latest runtime v${latestRuntimeVersion}`); } return runtimeGradleVersions || {}; } - private getGradleVersions(packageData: { gradle: { version: string, android: string } }): IRuntimeGradleVersions { + private async getLatestRuntimeVersion(): Promise { + let runtimeVersion: string = null; + + try { + const result = await this.$packageManager.view(TNS_ANDROID_RUNTIME_NAME, { "dist-tags": true }); + runtimeVersion = result.latest; + } catch (err) { + this.$logger.trace(`Error while getting latest android runtime version from view command: ${err}`); + const registryData = await this.$packageManager.getRegistryPackageData(TNS_ANDROID_RUNTIME_NAME); + runtimeVersion = registryData["dist-tags"].latest; + } + + return runtimeVersion; + } + + private async getGradleVersions(runtimeVersion: string): Promise { + let runtimeGradleVersions: { gradle: { version: string, android: string } } = null; + + try { + const output = await this.$packageManager.view(`${TNS_ANDROID_RUNTIME_NAME}@${runtimeVersion}`, { gradle: true }); + runtimeGradleVersions = { gradle: output }; + } catch (err) { + this.$logger.trace(`Error while getting gradle data for android runtime from view command: ${err}`); + const registryData = await this.$packageManager.getRegistryPackageData(TNS_ANDROID_RUNTIME_NAME); + runtimeGradleVersions = registryData.versions[runtimeVersion]; + } + + const result = this.getGradleVersionsCore(runtimeGradleVersions); + return result; + } + + private getGradleVersionsCore(packageData: { gradle: { version: string, android: string } }): IRuntimeGradleVersions { const packageJsonGradle = packageData && packageData.gradle; let runtimeVersions: IRuntimeGradleVersions = null; if (packageJsonGradle && (packageJsonGradle.version || packageJsonGradle.android)) { diff --git a/test/services/android-plugin-build-service.ts b/test/services/android-plugin-build-service.ts index 29c7e303f3..304c0ea6ee 100644 --- a/test/services/android-plugin-build-service.ts +++ b/test/services/android-plugin-build-service.ts @@ -111,6 +111,34 @@ describe('androidPluginBuildService', () => { } }; + return result; + }, + view: async (packageName: string, config: any): Promise => { + let result: any = null; + if (config && config.gradle) { + const packageVersion = packageName.split("@")[1]; + switch (packageVersion) { + case "1.0.0": + result = { + version: options.projectRuntimeGradleVersion, + android: options.projectRuntimeGradleAndroidVersion + }; + break; + case "4.1.2": + result = { + version: options.latestRuntimeGradleVersion, + android: options.latestRuntimeGradleAndroidVersion + }; + break; + } + } + + if (config && config["dist-tags"]) { + result = { + latest: "4.1.2" + }; + } + return result; } };