1import chalk from 'chalk'; 2import fs from 'fs-extra'; 3import path from 'path'; 4 5import { EXPO_DIR } from '../../Constants'; 6import logger from '../../Logger'; 7import { Task } from '../../TasksRunner'; 8import { transformFileAsync } from '../../Transforms'; 9import { Parcel, TaskArgs } from '../types'; 10import { selectPackagesToPublish } from './selectPackagesToPublish'; 11 12const { yellow, magenta } = chalk; 13 14/** 15 * Updates version props in packages containing Android's native code. 16 */ 17export const updateAndroidProjects = new Task<TaskArgs>( 18 { 19 name: 'updateAndroidProjects', 20 dependsOn: [selectPackagesToPublish], 21 filesToStage: ['packages/**/android/build.gradle'], 22 }, 23 async (parcels: Parcel[]) => { 24 logger.info('\n Updating Android projects...'); 25 26 for (const { pkg, state } of parcels) { 27 const gradlePath = path.join(pkg.path, 'android/build.gradle'); 28 29 // Some packages don't have android code. 30 if (!(await fs.pathExists(gradlePath))) { 31 continue; 32 } 33 34 // skip updating versions in the template project 35 if (pkg.packageName === 'expo-module-template') { 36 continue; 37 } 38 39 const relativeGradlePath = path.relative(EXPO_DIR, gradlePath); 40 41 logger.log(' ', `Updating ${yellow('version')} in ${magenta(relativeGradlePath)}`); 42 43 await transformFileAsync(gradlePath, [ 44 { 45 // update version and versionName in android/build.gradle 46 find: /\b(version\s*=\s*|versionName\s+)(['"])(.*?)\2/g, 47 replaceWith: `$1$2${state.releaseVersion}$2`, 48 }, 49 ]); 50 } 51 } 52); 53