diff --git a/lib/definitions/ios.d.ts b/lib/definitions/ios.d.ts index 248b25b7b4..7b83af2bc6 100644 --- a/lib/definitions/ios.d.ts +++ b/lib/definitions/ios.d.ts @@ -42,7 +42,15 @@ declare global { } interface ISPMService { - applySPMPackages(platformData: IPlatformData, projectData: IProjectData); + applySPMPackages( + platformData: IPlatformData, + projectData: IProjectData, + pluginSpmPackages?: IosSPMPackageDefinition[] + ); + getSPMPackages( + projectData: IProjectData, + platform: string + ): IosSPMPackageDefinition[]; } interface IXcodebuildArgsService { diff --git a/lib/services/ios-project-service.ts b/lib/services/ios-project-service.ts index 63ffa26703..3f5c1bc214 100644 --- a/lib/services/ios-project-service.ts +++ b/lib/services/ios-project-service.ts @@ -32,6 +32,7 @@ import { IIOSWatchAppService, IIOSNativeTargetService, IValidatePlatformOutput, + IProjectConfigService, } from "../definitions/project"; import { IBuildData } from "../definitions/build"; @@ -121,7 +122,8 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ private $sysInfo: ISysInfo, private $tempService: ITempService, private $spmService: ISPMService, - private $mobileHelper: Mobile.IMobileHelper + private $mobileHelper: Mobile.IMobileHelper, + private $projectConfigService: IProjectConfigService ) { super($fs, $projectDataService); } @@ -1175,7 +1177,30 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ ); } - await this.$spmService.applySPMPackages(platformData, projectData); + const pluginSpmPackages = []; + for (const plugin of pluginsData) { + const pluginConfigPath = path.join( + plugin.fullPath, + constants.CONFIG_FILE_NAME_TS + ); + if (this.$fs.exists(pluginConfigPath)) { + const config = this.$projectConfigService.readConfig(plugin.fullPath); + const packages = _.get( + config, + `${platformData.platformNameLowerCase}.SPMPackages`, + [] + ); + if (packages.length) { + pluginSpmPackages.push(...packages); + } + } + } + + await this.$spmService.applySPMPackages( + platformData, + projectData, + pluginSpmPackages + ); } public beforePrepareAllPlugins( diff --git a/lib/services/ios/spm-service.ts b/lib/services/ios/spm-service.ts index 9965549ce4..6f19203934 100644 --- a/lib/services/ios/spm-service.ts +++ b/lib/services/ios/spm-service.ts @@ -34,7 +34,8 @@ export class SPMService implements ISPMService { public async applySPMPackages( platformData: IPlatformData, - projectData: IProjectData + projectData: IProjectData, + pluginSpmPackages?: IosSPMPackageDefinition[] ) { try { const spmPackages = this.getSPMPackages( @@ -42,6 +43,11 @@ export class SPMService implements ISPMService { platformData.platformNameLowerCase ); + if (pluginSpmPackages?.length) { + // include swift packages from plugin configs + spmPackages.push(...pluginSpmPackages); + } + if (!spmPackages.length) { this.$logger.trace("SPM: no SPM packages to apply."); return;