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 const relativeGradlePath = path.relative(EXPO_DIR, gradlePath); 35 36 logger.log(' ', `Updating ${yellow('version')} in ${magenta(relativeGradlePath)}`); 37 38 await transformFileAsync(gradlePath, [ 39 { 40 // update version and versionName in android/build.gradle 41 find: /\b(version\s*=\s*|versionName\s+)(['"])(.*?)\2/g, 42 replaceWith: `$1$2${state.releaseVersion}$2`, 43 }, 44 ]); 45 } 46 } 47); 48