Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(cli): ability to specify custom platform directories #3565

Merged
merged 12 commits into from
Sep 23, 2020
9 changes: 4 additions & 5 deletions cli/src/android/add.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
import { homedir } from 'os';
import { join, relative } from 'path';
import { join } from 'path';

import c from '../colors';
import { copyTemplate, runCommand, runTask } from '../common';
import type { Config } from '../definitions';
import { existsAsync, writeFileAsync } from '../util/fs';

export async function addAndroid(config: Config): Promise<void> {
const nativeRelDir = relative(config.app.rootDir, config.android.platformDir);
await runTask(
`Adding native android project in ${c.strong(nativeRelDir)}`,
`Adding native android project in ${c.strong(config.android.platformDir)}`,
async () => {
return copyTemplate(
config.android.assets.templateDir,
config.android.platformDir,
config.android.platformDirAbs,
);
},
);

await runTask('Syncing Gradle', async () => {
return createLocalProperties(config.android.platformDir);
return createLocalProperties(config.android.platformDirAbs);
});
}

Expand Down
27 changes: 8 additions & 19 deletions cli/src/android/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,11 @@ export async function editProjectSettingsAndroid(
const appName = config.app.appName;

const manifestPath = resolve(
config.app.rootDir,
config.android.platformDir,
config.android.platformDirAbs,
'app/src/main/AndroidManifest.xml',
);
const buildGradlePath = resolve(
config.app.rootDir,
config.android.platformDir,
config.android.platformDirAbs,
'app/build.gradle',
);

Expand All @@ -92,8 +90,7 @@ export async function editProjectSettingsAndroid(
const domainPath = appId.split('.').join('/');
// Make the package source path to the new plugin Java file
const newJavaPath = resolve(
config.app.rootDir,
config.android.platformDir,
config.android.platformDirAbs,
`app/src/main/java/${domainPath}`,
);

Expand All @@ -103,8 +100,7 @@ export async function editProjectSettingsAndroid(

await copyAsync(
resolve(
config.app.rootDir,
config.android.platformDir,
config.android.platformDirAbs,
'app/src/main/java/com/getcapacitor/myapp/MainActivity.java',
),
resolve(newJavaPath, 'MainActivity.java'),
Expand All @@ -113,8 +109,7 @@ export async function editProjectSettingsAndroid(
if (appId.split('.')[1] !== 'getcapacitor') {
await removeAsync(
resolve(
config.app.rootDir,
config.android.platformDir,
config.android.platformDirAbs,
'app/src/main/java/com/getcapacitor',
),
);
Expand All @@ -123,18 +118,13 @@ export async function editProjectSettingsAndroid(
// Remove our template 'com' folder if their ID doesn't have it
if (appId.split('.')[0] !== 'com') {
await removeAsync(
resolve(
config.app.rootDir,
config.android.platformDir,
'app/src/main/java/com/',
),
resolve(config.android.platformDirAbs, 'app/src/main/java/com/'),
);
}

// Update the package in the MainActivity java file
const activityPath = resolve(
config.app.rootDir,
config.android.platformDir,
config.android.platformDirAbs,
newJavaPath,
'MainActivity.java',
);
Expand All @@ -157,8 +147,7 @@ export async function editProjectSettingsAndroid(

// Update the settings in res/values/strings.xml
const stringsPath = resolve(
config.app.rootDir,
config.android.platformDir,
config.android.platformDirAbs,
'app/src/main/res/values/strings.xml',
);
let stringsContent = await readFileAsync(stringsPath, 'utf8');
Expand Down
6 changes: 3 additions & 3 deletions cli/src/android/doctor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export async function doctorAndroid(config: Config): Promise<void> {
}

async function checkAppSrcDirs(config: Config) {
const appDir = join(config.android.platformDir, 'app');
const appDir = join(config.android.platformDirAbs, 'app');
if (!(await existsAsync(appDir))) {
return `${c.strong('app')} directory is missing in ${
config.android.platformDir
Expand Down Expand Up @@ -216,7 +216,7 @@ async function checkPackage(
}

async function checkBuildGradle(config: Config, packageId: string) {
const appDir = join(config.android.platformDir, 'app');
const appDir = join(config.android.platformDirAbs, 'app');
const fileName = 'build.gradle';
const filePath = join(appDir, fileName);

Expand All @@ -241,7 +241,7 @@ async function checkBuildGradle(config: Config, packageId: string) {

async function checkGradlew(config: Config) {
const fileName = 'gradlew';
const filePath = join(config.android.platformDir, fileName);
const filePath = join(config.android.platformDirAbs, fileName);

if (!(await existsAsync(filePath))) {
return `${c.strong(fileName)} file is missing in ${
Expand Down
2 changes: 1 addition & 1 deletion cli/src/android/open.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { existsSync } from '../util/fs';
export async function openAndroid(config: Config): Promise<void> {
logger.info(`Opening Android project at ${config.android.platformDir}.`);

const dir = config.android.platformDir;
const dir = config.android.platformDirAbs;

switch (config.cli.os) {
case OS.Mac: {
Expand Down
16 changes: 6 additions & 10 deletions cli/src/android/update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,8 @@ export async function installGradlePlugins(
'capacitor',
);

const settingsPath = join(config.app.rootDir, 'android');
const dependencyPath = join(config.app.rootDir, 'android', 'app');
const settingsPath = config.android.platformDirAbs;
const dependencyPath = join(config.android.platformDirAbs, 'app');
const relativeCapcitorAndroidPath = convertToUnixPath(
relative(settingsPath, capacitorAndroidPath),
);
Expand Down Expand Up @@ -184,8 +184,7 @@ export async function handleCordovaPluginsGradle(
cordovaPlugins: Plugin[],
): Promise<void> {
const pluginsFolder = resolve(
config.app.rootDir,
'android',
config.android.platformDirAbs,
config.android.assets.pluginsFolderName,
);
const pluginsGradlePath = join(pluginsFolder, 'build.gradle');
Expand Down Expand Up @@ -249,8 +248,7 @@ ext {

function copyPluginsNativeFiles(config: Config, cordovaPlugins: Plugin[]) {
const pluginsRoot = resolve(
config.app.rootDir,
'android',
config.android.platformDirAbs,
config.android.assets.pluginsFolderName,
);
const pluginsPath = join(pluginsRoot, 'src', 'main');
Expand Down Expand Up @@ -304,8 +302,7 @@ function copyPluginsNativeFiles(config: Config, cordovaPlugins: Plugin[]) {

function removePluginsNativeFiles(config: Config) {
const pluginsRoot = resolve(
config.app.rootDir,
'android',
config.android.platformDirAbs,
config.android.assets.pluginsFolderName,
);
removeSync(pluginsRoot);
Expand All @@ -326,8 +323,7 @@ async function replaceFrameworkVariables(
frameworkString: string,
) {
const variablesFile = resolve(
config.app.rootDir,
'android',
config.android.platformDirAbs,
'variables.gradle',
);
let variablesGradle = '';
Expand Down
26 changes: 19 additions & 7 deletions cli/src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -393,14 +393,26 @@ export async function getCLIVersion(config: Config): Promise<string> {
return getCapacitorPackageVersion(config, 'cli');
}

export async function getPlatformDirectory(
function getPlatformDirectory(config: Config, platform: string): string | null {
switch (platform) {
case 'android':
return config.android.platformDirAbs;
case 'ios':
return config.ios.platformDirAbs;
case 'web':
return config.web.platformDirAbs;
}

return null;
}

export async function getProjectPlatformDirectory(
config: Config,
platform: string,
): Promise<string | null> {
const platformDir = platform === 'web' ? config.app.webDir : platform;
const platformPath = join(config.app.rootDir, platformDir);
const platformPath = getPlatformDirectory(config, platform);

if (await existsAsync(platformPath)) {
if (platformPath && (await existsAsync(platformPath))) {
return platformPath;
}

Expand All @@ -417,7 +429,7 @@ export async function selectPlatforms(

if (!(await isValidPlatform(platformName))) {
logFatal(`Invalid platform: ${c.input(platformName)}`);
} else if (!(await getPlatformDirectory(config, platformName))) {
} else if (!(await getProjectPlatformDirectory(config, platformName))) {
if (platformName === 'web') {
logFatal(
`Could not find the web platform directory.\n` +
Expand Down Expand Up @@ -496,11 +508,11 @@ export async function promptForPlatform(
export async function getAddedPlatforms(config: Config): Promise<string[]> {
const platforms: string[] = [];

if (await getPlatformDirectory(config, config.android.name)) {
if (await getProjectPlatformDirectory(config, config.android.name)) {
platforms.push(config.android.name);
}

if (await getPlatformDirectory(config, config.ios.name)) {
if (await getProjectPlatformDirectory(config, config.ios.name)) {
platforms.push(config.ios.name);
}

Expand Down
33 changes: 26 additions & 7 deletions cli/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import type {
AndroidConfig,
IOSConfig,
PackageJson,
WebConfig,
} from './definitions';
import { OS } from './definitions';

Expand Down Expand Up @@ -36,11 +37,9 @@ export async function loadConfig(): Promise<Config> {
extConfig.linuxAndroidStudioPath ??
'/usr/local/android-studio/bin/studio.sh',
},
android: await loadAndroidConfig(appRootDir, cli.assetsDir),
ios: await loadIOSConfig(appRootDir, cli.assetsDir),
web: {
name: 'web',
},
android: await loadAndroidConfig(appRootDir, extConfig, cli.assetsDir),
ios: await loadIOSConfig(appRootDir, extConfig, cli.assetsDir),
web: await loadWebConfig(appRootDir, webDir),
cli,
app: {
rootDir: appRootDir,
Expand Down Expand Up @@ -74,10 +73,12 @@ async function loadCLIConfig(rootDir: string): Promise<CLIConfig> {

async function loadAndroidConfig(
rootDir: string,
extConfig: ExternalConfig,
assetDir: string,
): Promise<AndroidConfig> {
const name = 'android';
const platformDir = resolve(rootDir, name);
const platformDir = extConfig.android?.path ?? 'android';
const platformDirAbs = resolve(rootDir, platformDir);
const webDir = 'app/src/main/assets/public';
const resDir = 'app/src/main/res';

Expand All @@ -88,6 +89,7 @@ async function loadAndroidConfig(
name,
minVersion: '21',
platformDir,
platformDirAbs,
webDir,
webDirAbs: resolve(platformDir, webDir),
resDir,
Expand All @@ -103,10 +105,12 @@ async function loadAndroidConfig(

async function loadIOSConfig(
rootDir: string,
extConfig: ExternalConfig,
assetDir: string,
): Promise<IOSConfig> {
const name = 'ios';
const platformDir = resolve(rootDir, name);
const platformDir = extConfig.ios?.path ?? 'ios';
const platformDirAbs = resolve(rootDir, platformDir);
const webDir = 'public';
const nativeProjectName = 'App';
const templateName = 'ios-template';
Expand All @@ -117,6 +121,7 @@ async function loadIOSConfig(
minVersion: '11.0',
cordovaSwiftVersion: '5.1',
platformDir,
platformDirAbs,
webDir,
webDirAbs: resolve(platformDir, nativeProjectName, webDir),
nativeProjectName,
Expand All @@ -129,6 +134,20 @@ async function loadIOSConfig(
};
}

async function loadWebConfig(
rootDir: string,
webDir: string,
): Promise<WebConfig> {
const platformDir = webDir;
const platformDirAbs = resolve(rootDir, platformDir);

return {
name: 'web',
platformDir,
platformDirAbs,
};
}

function determineOS(os: NodeJS.Platform): OS {
switch (os) {
case 'darwin':
Expand Down
7 changes: 3 additions & 4 deletions cli/src/cordova.ts
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ export async function autoGenerateConfig(
const fileName = 'config.xml';
if (platform === 'ios') {
xmlDir = join(
config.ios.platformDir,
config.ios.platformDirAbs,
config.ios.nativeProjectName,
config.ios.nativeProjectName,
);
Expand Down Expand Up @@ -343,7 +343,7 @@ export async function logCordovaManualSteps(

async function logiOSPlist(configElement: any, config: Config, plugin: Plugin) {
const plistPath = resolve(
config.ios.platformDir,
config.ios.platformDirAbs,
config.ios.nativeProjectName,
config.ios.nativeProjectName,
'Info.plist',
Expand Down Expand Up @@ -573,8 +573,7 @@ export async function writeCordovaAndroidManifest(
platform: string,
): Promise<void> {
const pluginsFolder = resolve(
config.app.rootDir,
'android',
config.android.platformDirAbs,
config.android.assets.pluginsFolderName,
);
const manifestPath = join(
Expand Down
Loading