From 9318cdcf60dc19b7aceefc16b0fce12086e7f767 Mon Sep 17 00:00:00 2001 From: Dimitar Kerezov Date: Wed, 13 Dec 2017 18:00:35 +0200 Subject: [PATCH] Always clean platforms/app when --bundle is passed (#3269) * Always clean platforms/app when `--bundle` is passed * Do not use $options in $nodeModulesBuilder Whenever CLI is required as a library `$options` flags are not set. Hence `$options` should only be used where one knows CLI is truly run as a command-line interface - i.e. in commands. --- lib/definitions/platform.d.ts | 6 ++--- lib/services/platform-service.ts | 5 +++- .../prepare-platform-native-service.ts | 11 +++++++- .../node-modules/node-modules-builder.ts | 27 +++++++++---------- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/lib/definitions/platform.d.ts b/lib/definitions/platform.d.ts index 1e8b0c25ee..e8cf3dd845 100644 --- a/lib/definitions/platform.d.ts +++ b/lib/definitions/platform.d.ts @@ -271,15 +271,15 @@ interface IAppFilesUpdaterOptionsComposition { appFilesUpdaterOptions: IAppFilesUpdaterOptions; } -interface IJsNodeModulesData extends IPlatform, IProjectDataComposition, IAppFilesUpdaterOptionsComposition { +interface INodeModulesData extends IPlatform, IProjectDataComposition, IAppFilesUpdaterOptionsComposition { absoluteOutputPath: string; lastModifiedTime: Date; projectFilesConfig: IProjectFilesConfig; } interface INodeModulesBuilder { - prepareNodeModules(absoluteOutputPath: string, platform: string, lastModifiedTime: Date, projectData: IProjectData, projectFilesConfig: IProjectFilesConfig): Promise; - prepareJSNodeModules(jsNodeModulesData: IJsNodeModulesData): Promise; + prepareNodeModules(nodeModulesData: INodeModulesData): Promise; + prepareJSNodeModules(jsNodeModulesData: INodeModulesData): Promise; cleanNodeModules(absoluteOutputPath: string, platform: string): void; } diff --git a/lib/services/platform-service.ts b/lib/services/platform-service.ts index 53aca6346e..5faea29ec4 100644 --- a/lib/services/platform-service.ts +++ b/lib/services/platform-service.ts @@ -194,7 +194,10 @@ export class PlatformService extends EventEmitter implements IPlatformService { const requiresNativePrepare = (!platformInfo.nativePrepare || !platformInfo.nativePrepare.skipNativePrepare) && changesInfo.nativePlatformStatus === constants.NativePlatformStatus.requiresPrepare; if (changesInfo.hasChanges || platformInfo.appFilesUpdaterOptions.bundle || requiresNativePrepare) { - if (changesInfo.bundleChanged) { + // Always clear up the app directory in platforms if `--bundle` value has changed in between builds or is passed in general + // this is done as user has full control over what goes in platforms when `--bundle` is passed + // and we may end up with duplicate symbols which would fail the build + if (changesInfo.bundleChanged || platformInfo.appFilesUpdaterOptions.bundle) { await this.cleanDestinationApp(platformInfo); } diff --git a/lib/services/prepare-platform-native-service.ts b/lib/services/prepare-platform-native-service.ts index ca73ca73f8..c0a56c2567 100644 --- a/lib/services/prepare-platform-native-service.ts +++ b/lib/services/prepare-platform-native-service.ts @@ -38,8 +38,17 @@ export class PreparePlatformNativeService extends PreparePlatformService impleme const lastModifiedTime = this.$fs.exists(appDestinationDirectoryPath) ? this.$fs.getFsStats(appDestinationDirectoryPath).mtime : null; const tnsModulesDestinationPath = path.join(appDestinationDirectoryPath, constants.TNS_MODULES_FOLDER_NAME); + const nodeModulesData: INodeModulesData = { + absoluteOutputPath: tnsModulesDestinationPath, + appFilesUpdaterOptions: config.appFilesUpdaterOptions, + lastModifiedTime, + platform: config.platform, + projectData: config.projectData, + projectFilesConfig: config.projectFilesConfig + }; + // Process node_modules folder - await this.$nodeModulesBuilder.prepareNodeModules(tnsModulesDestinationPath, config.platform, lastModifiedTime, config.projectData, config.projectFilesConfig); + await this.$nodeModulesBuilder.prepareNodeModules(nodeModulesData); } if (!config.changesInfo || config.changesInfo.configChanged || config.changesInfo.modulesChanged) { diff --git a/lib/tools/node-modules/node-modules-builder.ts b/lib/tools/node-modules/node-modules-builder.ts index f1607da12b..924f8c4082 100644 --- a/lib/tools/node-modules/node-modules-builder.ts +++ b/lib/tools/node-modules/node-modules-builder.ts @@ -4,18 +4,17 @@ import { TnsModulesCopy, NpmPluginPrepare } from "./node-modules-dest-copy"; export class NodeModulesBuilder implements INodeModulesBuilder { constructor(private $fs: IFileSystem, private $injector: IInjector, - private $options: IOptions, private $nodeModulesDependenciesBuilder: INodeModulesDependenciesBuilder ) { } - public async prepareNodeModules(absoluteOutputPath: string, platform: string, lastModifiedTime: Date, projectData: IProjectData, projectFilesConfig: IProjectFilesConfig): Promise { - const productionDependencies = this.initialPrepareNodeModules(absoluteOutputPath, platform, lastModifiedTime, projectData); + public async prepareNodeModules(nodeModulesData: INodeModulesData): Promise { + const productionDependencies = this.initialPrepareNodeModules(nodeModulesData); const npmPluginPrepare: NpmPluginPrepare = this.$injector.resolve(NpmPluginPrepare); - await npmPluginPrepare.preparePlugins(productionDependencies, platform, projectData, projectFilesConfig); + await npmPluginPrepare.preparePlugins(productionDependencies, nodeModulesData.platform, nodeModulesData.projectData, nodeModulesData.projectFilesConfig); } - public async prepareJSNodeModules(jsNodeModulesData: IJsNodeModulesData): Promise { - const productionDependencies = this.initialPrepareNodeModules(jsNodeModulesData.absoluteOutputPath, jsNodeModulesData.platform, jsNodeModulesData.lastModifiedTime, jsNodeModulesData.projectData); + public async prepareJSNodeModules(jsNodeModulesData: INodeModulesData): Promise { + const productionDependencies = this.initialPrepareNodeModules(jsNodeModulesData); const npmPluginPrepare: NpmPluginPrepare = this.$injector.resolve(NpmPluginPrepare); await npmPluginPrepare.prepareJSPlugins(productionDependencies, jsNodeModulesData.platform, jsNodeModulesData.projectData, jsNodeModulesData.projectFilesConfig); } @@ -24,21 +23,21 @@ export class NodeModulesBuilder implements INodeModulesBuilder { shelljs.rm("-rf", absoluteOutputPath); } - private initialPrepareNodeModules(absoluteOutputPath: string, platform: string, lastModifiedTime: Date, projectData: IProjectData, ): IDependencyData[] { - const productionDependencies = this.$nodeModulesDependenciesBuilder.getProductionDependencies(projectData.projectDir); + private initialPrepareNodeModules(nodeModulesData: INodeModulesData): IDependencyData[] { + const productionDependencies = this.$nodeModulesDependenciesBuilder.getProductionDependencies(nodeModulesData.projectData.projectDir); - if (!this.$fs.exists(absoluteOutputPath)) { + if (!this.$fs.exists(nodeModulesData.absoluteOutputPath)) { // Force copying if the destination doesn't exist. - lastModifiedTime = null; + nodeModulesData.lastModifiedTime = null; } - if (!this.$options.bundle) { + if (!nodeModulesData.appFilesUpdaterOptions.bundle) { const tnsModulesCopy = this.$injector.resolve(TnsModulesCopy, { - outputRoot: absoluteOutputPath + outputRoot: nodeModulesData.absoluteOutputPath }); - tnsModulesCopy.copyModules(productionDependencies, platform); + tnsModulesCopy.copyModules(productionDependencies, nodeModulesData.platform); } else { - this.cleanNodeModules(absoluteOutputPath, platform); + this.cleanNodeModules(nodeModulesData.absoluteOutputPath, nodeModulesData.platform); } return productionDependencies;