Skip to content

Commit fb1641a

Browse files
committed
Don't check twice if env is properly configured
1 parent 762cfa4 commit fb1641a

13 files changed

+134
-99
lines changed

lib/android-tools-info.ts

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,30 +43,39 @@ export class AndroidToolsInfo implements IAndroidToolsInfo {
4343
public validateInfo(options?: { showWarningsAsErrors: boolean, validateTargetSdk: boolean }): boolean {
4444
let detectedErrors = false;
4545
this.showWarningsAsErrors = options && options.showWarningsAsErrors;
46-
const toolsInfoData = this.getToolsInfo();
4746
const isAndroidHomeValid = this.validateAndroidHomeEnvVariable();
4847

4948
detectedErrors = androidToolsInfo.validateInfo().map(warning => this.printMessage(warning.warning)).length > 0;
5049

5150
if (options && options.validateTargetSdk) {
52-
const targetSdk = toolsInfoData.targetSdkVersion;
53-
const newTarget = `${AndroidToolsInfo.ANDROID_TARGET_PREFIX}-${targetSdk}`;
54-
if (!_.includes(AndroidToolsInfo.SUPPORTED_TARGETS, newTarget)) {
55-
const supportedVersions = AndroidToolsInfo.SUPPORTED_TARGETS.sort();
56-
const minSupportedVersion = this.parseAndroidSdkString(_.first(supportedVersions));
57-
58-
if (targetSdk && (targetSdk < minSupportedVersion)) {
59-
this.printMessage(`The selected Android target SDK ${newTarget} is not supported. You must target ${minSupportedVersion} or later.`);
60-
detectedErrors = true;
61-
} else if (!targetSdk || targetSdk > this.getMaxSupportedVersion()) {
62-
this.$logger.warn(`Support for the selected Android target SDK ${newTarget} is not verified. Your Android app might not work as expected.`);
63-
}
64-
}
51+
detectedErrors = this.validateTargetSdk();
6552
}
6653

6754
return detectedErrors || !isAndroidHomeValid;
6855
}
6956

57+
public validateTargetSdk(options?: { showWarningsAsErrors: boolean }): boolean {
58+
this.showWarningsAsErrors = options && options.showWarningsAsErrors;
59+
60+
const toolsInfoData = this.getToolsInfo();
61+
const targetSdk = toolsInfoData.targetSdkVersion;
62+
const newTarget = `${AndroidToolsInfo.ANDROID_TARGET_PREFIX}-${targetSdk}`;
63+
64+
if (!_.includes(AndroidToolsInfo.SUPPORTED_TARGETS, newTarget)) {
65+
const supportedVersions = AndroidToolsInfo.SUPPORTED_TARGETS.sort();
66+
const minSupportedVersion = this.parseAndroidSdkString(_.first(supportedVersions));
67+
68+
if (targetSdk && (targetSdk < minSupportedVersion)) {
69+
this.printMessage(`The selected Android target SDK ${newTarget} is not supported. You must target ${minSupportedVersion} or later.`);
70+
return true;
71+
} else if (!targetSdk || targetSdk > this.getMaxSupportedVersion()) {
72+
this.$logger.warn(`Support for the selected Android target SDK ${newTarget} is not verified. Your Android app might not work as expected.`);
73+
}
74+
}
75+
76+
return false;
77+
}
78+
7079
public validateJavacVersion(installedJavacVersion: string, options?: { showWarningsAsErrors: boolean }): boolean {
7180
if (options) {
7281
this.showWarningsAsErrors = options.showWarningsAsErrors;

lib/commands/build.ts

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ export class BuildCommandBase {
77
protected $platformsData: IPlatformsData,
88
protected $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
99
protected $platformService: IPlatformService,
10-
private $bundleValidatorHelper: IBundleValidatorHelper,
11-
private $platformEnvironmentRequirements: IPlatformEnvironmentRequirements) {
10+
private $bundleValidatorHelper: IBundleValidatorHelper) {
1211
this.$projectData.initializeProjectData();
1312
}
1413

@@ -45,18 +44,16 @@ export class BuildCommandBase {
4544
}
4645
}
4746

48-
protected async canExecuteCore(platform: string): Promise<boolean> {
49-
const result = await this.$platformEnvironmentRequirements.checkEnvironmentRequirements({ platform: platform, cloudCommandName: "build" });
50-
this.validatePlatform(platform);
51-
return result;
52-
}
53-
54-
private validatePlatform(platform: string): void {
47+
protected async validatePlatform(platform: string): Promise<void> {
5548
if (!this.$platformService.isPlatformSupportedForOS(platform, this.$projectData)) {
5649
this.$errors.fail(`Applications for platform ${platform} can not be built on this OS`);
5750
}
5851

5952
this.$bundleValidatorHelper.validate();
53+
54+
const platformData = this.$platformsData.getPlatformData(platform, this.$projectData);
55+
const platformProjectService = platformData.platformProjectService;
56+
await platformProjectService.validate(this.$projectData);
6057
}
6158
}
6259

@@ -71,15 +68,16 @@ export class BuildIosCommand extends BuildCommandBase implements ICommand {
7168
$platformService: IPlatformService,
7269
$bundleValidatorHelper: IBundleValidatorHelper,
7370
$platformEnvironmentRequirements: IPlatformEnvironmentRequirements) {
74-
super($options, $errors, $projectData, $platformsData, $devicePlatformsConstants, $platformService, $bundleValidatorHelper, $platformEnvironmentRequirements);
71+
super($options, $errors, $projectData, $platformsData, $devicePlatformsConstants, $platformService, $bundleValidatorHelper);
7572
}
7673

7774
public async execute(args: string[]): Promise<void> {
7875
return this.executeCore([this.$platformsData.availablePlatforms.iOS]);
7976
}
8077

8178
public async canExecute(args: string[]): Promise<boolean> {
82-
return await super.canExecuteCore(this.$devicePlatformsConstants.iOS) && args.length === 0 && this.$platformService.validateOptions(this.$options.provision, this.$options.teamId, this.$projectData, this.$platformsData.availablePlatforms.iOS);
79+
await super.validatePlatform(this.$devicePlatformsConstants.iOS);
80+
return args.length === 0 && this.$platformService.validateOptions(this.$options.provision, this.$options.teamId, this.$projectData, this.$platformsData.availablePlatforms.iOS);
8381
}
8482
}
8583

@@ -96,24 +94,19 @@ export class BuildAndroidCommand extends BuildCommandBase implements ICommand {
9694
$platformService: IPlatformService,
9795
$bundleValidatorHelper: IBundleValidatorHelper,
9896
$platformEnvironmentRequirements: IPlatformEnvironmentRequirements) {
99-
super($options, $errors, $projectData, $platformsData, $devicePlatformsConstants, $platformService, $bundleValidatorHelper, $platformEnvironmentRequirements);
97+
super($options, $errors, $projectData, $platformsData, $devicePlatformsConstants, $platformService, $bundleValidatorHelper);
10098
}
10199

102100
public async execute(args: string[]): Promise<void> {
103101
return this.executeCore([this.$platformsData.availablePlatforms.Android]);
104102
}
105103

106104
public async canExecute(args: string[]): Promise<boolean> {
107-
await super.canExecuteCore(this.$devicePlatformsConstants.Android);
108-
105+
await super.validatePlatform(this.$devicePlatformsConstants.Android);
109106
if (this.$options.release && (!this.$options.keyStorePath || !this.$options.keyStorePassword || !this.$options.keyStoreAlias || !this.$options.keyStoreAliasPassword)) {
110107
this.$errors.fail(ANDROID_RELEASE_BUILD_ERROR_MESSAGE);
111108
}
112109

113-
const platformData = this.$platformsData.getPlatformData(this.$devicePlatformsConstants.Android, this.$projectData);
114-
const platformProjectService = platformData.platformProjectService;
115-
await platformProjectService.validate(this.$projectData);
116-
117110
return args.length === 0 && await this.$platformService.validateOptions(this.$options.provision, this.$options.teamId, this.$projectData, this.$platformsData.availablePlatforms.Android);
118111
}
119112
}

lib/commands/run.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,14 @@ export class RunCommandBase implements ICommand {
99
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
1010
private $errors: IErrors,
1111
private $hostInfo: IHostInfo,
12-
private $liveSyncCommandHelper: ILiveSyncCommandHelper,
13-
private $platformEnvironmentRequirements: IPlatformEnvironmentRequirements) { }
12+
private $liveSyncCommandHelper: ILiveSyncCommandHelper) { }
1413

1514
public allowedParameters: ICommandParameter[] = [];
1615
public async execute(args: string[]): Promise<void> {
1716
return this.$liveSyncCommandHelper.executeCommandLiveSync(this.platform);
1817
}
1918

2019
public async canExecute(args: string[]): Promise<boolean> {
21-
await this.$platformEnvironmentRequirements.checkEnvironmentRequirements({platform: this.platform, cloudCommandName: "run"});
22-
2320
if (args.length) {
2421
this.$errors.fail(ERROR_NO_VALID_SUBCOMMAND_FORMAT, "run");
2522
}

lib/declarations.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,12 @@ interface IAndroidToolsInfo {
564564
*/
565565
validateAndroidHomeEnvVariable(options?: { showWarningsAsErrors: boolean }): boolean;
566566

567+
/**
568+
* Validates target sdk
569+
* @returns {boolean} True if there are detected issues, false otherwise
570+
*/
571+
validateTargetSdk(options?: { showWarningsAsErrors: boolean }): boolean;
572+
567573
/**
568574
* Gets the path to `adb` executable from ANDROID_HOME. It should be `$ANDROID_HOME/platform-tools/adb` in case it exists.
569575
* @return {string} Path to the `adb` executable. In case it does not exists, null is returned.

lib/definitions/platform.d.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -367,10 +367,5 @@ interface IUpdateAppOptions extends IOptionalFilesToSync, IOptionalFilesToRemove
367367
}
368368

369369
interface IPlatformEnvironmentRequirements {
370-
checkEnvironmentRequirements(input: ICheckEnvironmentRequirementsInput): Promise<boolean>;
371-
}
372-
373-
interface ICheckEnvironmentRequirementsInput {
374-
platform: string;
375-
cloudCommandName: string;
370+
checkEnvironmentRequirements(platform: string): Promise<boolean>;
376371
}

lib/services/android-project-service.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
3232
private $hostInfo: IHostInfo,
3333
private $logger: ILogger,
3434
$projectDataService: IProjectDataService,
35-
private $sysInfo: ISysInfo,
3635
private $injector: IInjector,
3736
private $pluginVariablesService: IPluginVariablesService,
3837
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
3938
private $npm: INodePackageManager,
40-
private $androidPluginBuildService: IAndroidPluginBuildService) {
39+
private $androidPluginBuildService: IAndroidPluginBuildService,
40+
private $platformEnvironmentRequirements: IPlatformEnvironmentRequirements) {
4141
super($fs, $projectDataService);
4242
this._androidProjectPropertiesManagers = Object.create(null);
4343
this.isAndroidStudioTemplate = false;
@@ -155,13 +155,8 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
155155
this.validatePackageName(projectData.projectId);
156156
this.validateProjectName(projectData.projectName);
157157

158-
this.$androidToolsInfo.validateAndroidHomeEnvVariable({ showWarningsAsErrors: true });
159-
160-
const javaCompilerVersion = (await this.$sysInfo.getSysInfo()).javacVersion;
161-
162-
this.$androidToolsInfo.validateJavacVersion(javaCompilerVersion, { showWarningsAsErrors: true });
163-
164-
await this.$androidToolsInfo.validateInfo({ showWarningsAsErrors: true, validateTargetSdk: true });
158+
await this.$platformEnvironmentRequirements.checkEnvironmentRequirements(this.getPlatformData(projectData).normalizedPlatformName);
159+
this.$androidToolsInfo.validateTargetSdk({ showWarningsAsErrors: true });
165160
}
166161

167162
public async validatePlugins(): Promise<void> {

lib/services/ios-project-service.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
4949
private $pbxprojDomXcode: IPbxprojDomXcode,
5050
private $xcode: IXcode,
5151
private $iOSEntitlementsService: IOSEntitlementsService,
52+
private $platformEnvironmentRequirements: IPlatformEnvironmentRequirements,
5253
private $sysInfo: ISysInfo,
5354
private $xCConfigService: XCConfigService) {
54-
super($fs, $projectDataService);
55+
super($fs, $projectDataService);
5556
}
5657

5758
private _platformsDirCache: string = null;
@@ -130,16 +131,12 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
130131
return path.join(this.getPlatformData(projectData).projectRoot, projectData.projectName, "Resources");
131132
}
132133

133-
public async validate(): Promise<void> {
134+
public async validate(projectData: IProjectData): Promise<void> {
134135
if (!this.$hostInfo.isDarwin) {
135136
return;
136137
}
137138

138-
try {
139-
await this.$childProcess.exec("which xcodebuild");
140-
} catch (error) {
141-
this.$errors.fail("Xcode is not installed. Make sure you have Xcode installed and added to your PATH");
142-
}
139+
await this.$platformEnvironmentRequirements.checkEnvironmentRequirements(this.getPlatformData(projectData).normalizedPlatformName);
143140

144141
const xcodeBuildVersion = await this.getXcodeVersion();
145142
if (helpers.versionCompare(xcodeBuildVersion, IOSProjectService.XCODEBUILD_MIN_VERSION) < 0) {

0 commit comments

Comments
 (0)