diff --git a/packages/cli-platform-apple/src/commands/buildCommand/createBuild.ts b/packages/cli-platform-apple/src/commands/buildCommand/createBuild.ts index 3e06b6c10..795c6bb07 100644 --- a/packages/cli-platform-apple/src/commands/buildCommand/createBuild.ts +++ b/packages/cli-platform-apple/src/commands/buildCommand/createBuild.ts @@ -27,10 +27,16 @@ const createBuild = ? await getArchitecture(platformConfig.sourceDir) : undefined; - await resolvePods(ctx.root, ctx.dependencies, platformName, { - forceInstall: args.forcePods, - newArchEnabled: isAppRunningNewArchitecture, - }); + await resolvePods( + ctx.root, + platformConfig.sourceDir, + ctx.dependencies, + platformName, + { + forceInstall: args.forcePods, + newArchEnabled: isAppRunningNewArchitecture, + }, + ); installedPods = true; } diff --git a/packages/cli-platform-apple/src/commands/runCommand/createRun.ts b/packages/cli-platform-apple/src/commands/runCommand/createRun.ts index 486b9ebf5..62525725b 100644 --- a/packages/cli-platform-apple/src/commands/runCommand/createRun.ts +++ b/packages/cli-platform-apple/src/commands/runCommand/createRun.ts @@ -72,10 +72,16 @@ const createRun = ? await getArchitecture(platformConfig.sourceDir) : undefined; - await resolvePods(ctx.root, ctx.dependencies, platformName, { - forceInstall: args.forcePods, - newArchEnabled: isAppRunningNewArchitecture, - }); + await resolvePods( + ctx.root, + platformConfig.sourceDir, + ctx.dependencies, + platformName, + { + forceInstall: args.forcePods, + newArchEnabled: isAppRunningNewArchitecture, + }, + ); installedPods = true; } diff --git a/packages/cli-platform-apple/src/tools/pods.ts b/packages/cli-platform-apple/src/tools/pods.ts index 2895c3d9f..16239eb3a 100644 --- a/packages/cli-platform-apple/src/tools/pods.ts +++ b/packages/cli-platform-apple/src/tools/pods.ts @@ -8,7 +8,6 @@ import { getLoader, } from '@react-native-community/cli-tools'; import installPods from './installPods'; -import findPodfilePath from '../config/findPodfilePath'; import { DependencyConfig, IOSDependencyConfig, @@ -61,7 +60,7 @@ export function generateMd5Hash(text: string) { return createHash('md5').update(text).digest('hex'); } -export function compareMd5Hashes(hash1: string, hash2: string) { +export function compareMd5Hashes(hash1?: string, hash2?: string) { return hash1 === hash2; } @@ -91,12 +90,15 @@ async function install( export default async function resolvePods( root: string, + sourceDir: string, nativeDependencies: NativeDependencies, platformName: ApplePlatform, options?: ResolvePodsOptions, ) { const packageJson = getPackageJson(root); - const podfilePath = findPodfilePath(root, platformName); + const podfilePath = path.join(sourceDir, 'Podfile'); // sourceDir is calculated based on Podfile location, see getProjectConfig() + + const podfileLockPath = path.join(sourceDir, 'Podfile.lock'); const platformFolderPath = podfilePath ? podfilePath.slice(0, podfilePath.lastIndexOf('/')) : path.join(root, platformName); @@ -108,11 +110,30 @@ export default async function resolvePods( ); const dependenciesString = dependenciesToString(platformDependencies); const currentDependenciesHash = generateMd5Hash(dependenciesString); + // Users can manually add dependencies to Podfile, so we can entirely rely on `dependencies` from `config`'s output. + const currentPodfileHash = fs.existsSync(podfilePath) + ? generateMd5Hash(fs.readFileSync(podfilePath, 'utf8')) + : undefined; + const currentPodfileLockHash = fs.existsSync(podfileLockPath) + ? generateMd5Hash(fs.readFileSync(podfileLockPath, 'utf8')) + : undefined; + + const cachedPodfileHash = cacheManager.get(packageJson.name, 'podfile'); + const cachedPodfileLockHash = cacheManager.get( + packageJson.name, + 'podfileLock', + ); + const cachedDependenciesHash = cacheManager.get( packageJson.name, 'dependencies', ); + const isCacheValid = + cachedDependenciesHash === undefined && + cachedPodfileHash === undefined && + cachedPodfileLockHash === undefined; + if (options?.forceInstall) { await install( packageJson, @@ -120,11 +141,13 @@ export default async function resolvePods( currentDependenciesHash, platformFolderPath, ); - } else if (arePodsInstalled && cachedDependenciesHash === undefined) { + } else if (arePodsInstalled && isCacheValid) { cacheManager.set(packageJson.name, 'dependencies', currentDependenciesHash); } else if ( - !cachedDependenciesHash || + !isCacheValid || !compareMd5Hashes(currentDependenciesHash, cachedDependenciesHash) || + !compareMd5Hashes(currentPodfileHash, cachedPodfileHash) || + !compareMd5Hashes(currentPodfileLockHash, cachedPodfileLockHash) || !arePodsInstalled ) { const loader = getLoader('Installing CocoaPods...'); diff --git a/packages/cli-tools/src/cacheManager.ts b/packages/cli-tools/src/cacheManager.ts index 227eb674a..dbcf48afe 100644 --- a/packages/cli-tools/src/cacheManager.ts +++ b/packages/cli-tools/src/cacheManager.ts @@ -10,6 +10,8 @@ type CacheKey = | 'lastChecked' | 'latestVersion' | 'dependencies' + | 'podfile' + | 'podfileLock' | 'lastUsedIOSDeviceId'; type Cache = {[key in CacheKey]?: string};