Skip to content

Commit 19ac71f

Browse files
authored
feat(android): add appName; deprecate root, appFolder, appId (#1029)
* feat: add appName; deprecate root, appFolder, appId * add deprecation warnings
1 parent e7d6946 commit 19ac71f

File tree

14 files changed

+345
-251
lines changed

14 files changed

+345
-251
lines changed

docs/commands.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,8 @@ Builds your app and starts it on a connected Android emulator or device.
305305

306306
#### `--root [string]`
307307

308+
> **DEPRECATED** – root is discovered automatically
309+
308310
Override the root directory for the Android build (which contains the android directory)'.
309311

310312
#### `--variant [string]`
@@ -315,12 +317,16 @@ Specify your app's build variant.
315317

316318
#### `--appFolder [string]`
317319

320+
> **DEPRECATED** – use "platforms.android.appName" in react-native.config.js
321+
318322
> default: 'app'
319323
320324
Specify a different application folder name for the Android source. If not, we assume is "app".
321325

322326
#### `--appId [string]`
323327

328+
> **DEPRECATED** – use "platforms.android.appName" in react-native.config.js
329+
324330
Specify an `applicationId` to launch after build.
325331

326332
#### `--appIdSuffix [string]`

docs/dependencies.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ An array of iOS script phases to add to the project. Specifying a `path` propert
9191
module.exports = {
9292
dependency: {
9393
platforms: {
94-
ios: {
94+
ios: {
9595
scriptPhases: [
9696
{
9797
name: '[MY DEPENDENCY] My Script',
@@ -109,7 +109,11 @@ See [`script_phase` options](https://www.rubydoc.info/gems/cocoapods-core/Pod/Po
109109

110110
#### platforms.android.sourceDir
111111

112-
A relative path to a folder with source files. E.g. `custom-android`, or `custom-android/app`. By default, CLI searches for `android` and `android/app` as source dirs.
112+
A relative path to a folder with Android project (Gradle root project), e.g. `./path/to/custom-android`. By default, CLI searches for `./android` as source dir.
113+
114+
#### platforms.android.appName
115+
116+
A name of the app in the Android `sourceDir`, equivalent to Gradle project name. By default it's `app`.
113117

114118
#### platforms.android.manifestPath
115119

packages/cli-types/src/android.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,20 @@ export interface AndroidProjectConfig {
99
assetsPath: string;
1010
mainFilePath: string;
1111
packageName: string;
12+
packageFolder: string;
13+
appName: string;
1214
}
1315

14-
export interface AndroidProjectParams {
15-
sourceDir?: string;
16-
manifestPath?: string;
17-
packageName?: string;
18-
packageFolder?: string;
19-
mainFilePath?: string;
20-
stringsPath?: string;
21-
settingsGradlePath?: string;
22-
assetsPath?: string;
23-
buildGradlePath?: string;
24-
}
16+
export type AndroidProjectParams = Partial<AndroidProjectConfig>;
2517

2618
export interface AndroidDependencyConfig {
2719
sourceDir: string;
2820
folder: string;
2921
packageImportPath: string;
3022
packageInstance: string;
23+
appName: string;
24+
manifestPath: string;
25+
packageName: string;
3126
}
3227

33-
export interface AndroidDependencyParams {
34-
packageName?: string;
35-
sourceDir?: string;
36-
manifestPath?: string;
37-
packageImportPath?: string;
38-
packageInstance?: string;
39-
}
28+
export type AndroidDependencyParams = Partial<AndroidDependencyConfig>;

packages/cli/src/tools/config/schema.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export const dependencyConfig = t
5959
manifestPath: t.string(),
6060
packageImportPath: t.string(),
6161
packageInstance: t.string(),
62+
appName: t.string(),
6263
})
6364
.default({}),
6465
})
@@ -126,6 +127,7 @@ export const projectConfig = t
126127
folder: t.string(),
127128
packageImportPath: t.string(),
128129
packageInstance: t.string(),
130+
appName: t.string(),
129131
})
130132
.allow(null),
131133
}),

packages/platform-android/src/commands/runAndroid/__tests__/runOnAllDevices.test.ts

Lines changed: 131 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -7,83 +7,169 @@
77
*/
88

99
import runOnAllDevices from '../runOnAllDevices';
10+
import execa from 'execa';
1011

11-
jest.mock('child_process', () => ({
12-
execFileSync: jest.fn(),
13-
spawnSync: jest.fn(),
14-
}));
15-
12+
jest.mock('execa');
1613
jest.mock('../getAdbPath');
1714
jest.mock('../tryLaunchEmulator');
18-
const {execFileSync} = require('child_process');
1915

2016
describe('--appFolder', () => {
17+
const args = {
18+
root: '/root',
19+
appFolder: undefined,
20+
appId: '',
21+
tasks: undefined,
22+
variant: 'debug',
23+
appIdSuffix: '',
24+
mainActivity: 'MainActivity',
25+
deviceId: undefined,
26+
packager: true,
27+
port: 8081,
28+
terminal: 'iTerm2',
29+
jetifier: true,
30+
};
31+
const androidProject = {
32+
manifestPath: '/android/app/src/main/AndroidManifest.xml',
33+
appName: 'app',
34+
packageName: 'com.test',
35+
sourceDir: '/android',
36+
isFlat: false,
37+
folder: '',
38+
stringsPath: '',
39+
buildGradlePath: '',
40+
settingsGradlePath: '',
41+
assetsPath: '',
42+
mainFilePath: '',
43+
packageFolder: '',
44+
};
2145
beforeEach(() => {
2246
jest.clearAllMocks();
2347
});
2448

2549
it('uses task "install[Variant]" as default task', async () => {
26-
// @ts-ignore
27-
await runOnAllDevices({
28-
variant: 'debug',
29-
});
30-
expect(execFileSync.mock.calls[0][1]).toContain('installDebug');
50+
await runOnAllDevices(
51+
{...args, variant: 'debug'},
52+
'./gradlew',
53+
'com.testapp',
54+
'adb',
55+
androidProject,
56+
);
57+
expect(((execa as unknown) as jest.Mock).mock.calls[0][1]).toContain(
58+
'app:installDebug',
59+
);
60+
});
61+
62+
it('uses appName and default variant', async () => {
63+
await runOnAllDevices(
64+
{...args, variant: 'debug'},
65+
'./gradlew',
66+
'com.testapp',
67+
'adb',
68+
{...androidProject, appName: 'someApp'},
69+
);
70+
71+
expect(((execa as unknown) as jest.Mock).mock.calls[0][1]).toContain(
72+
'someApp:installDebug',
73+
);
74+
});
75+
76+
it('uses appName and custom variant', async () => {
77+
await runOnAllDevices(
78+
{...args, variant: 'staging'},
79+
'./gradlew',
80+
'com.testapp',
81+
'adb',
82+
{...androidProject, appName: 'anotherApp'},
83+
);
84+
85+
expect(((execa as unknown) as jest.Mock).mock.calls[0][1]).toContain(
86+
'anotherApp:installStaging',
87+
);
3188
});
3289

3390
it('uses appFolder and default variant', async () => {
34-
// @ts-ignore
35-
await runOnAllDevices({
36-
appFolder: 'someApp',
37-
variant: 'debug',
38-
});
91+
await runOnAllDevices(
92+
{...args, appFolder: 'someApp', variant: 'debug'},
93+
'./gradlew',
94+
'com.testapp',
95+
'adb',
96+
androidProject,
97+
);
3998

40-
expect(execFileSync.mock.calls[0][1]).toContain('someApp:installDebug');
99+
expect(((execa as unknown) as jest.Mock).mock.calls[0][1]).toContain(
100+
'someApp:installDebug',
101+
);
41102
});
42103

43104
it('uses appFolder and custom variant', async () => {
44-
// @ts-ignore
45-
await runOnAllDevices({
46-
appFolder: 'anotherApp',
47-
variant: 'staging',
48-
});
105+
await runOnAllDevices(
106+
{...args, appFolder: 'anotherApp', variant: 'staging'},
107+
'./gradlew',
108+
'com.testapp',
109+
'adb',
110+
androidProject,
111+
);
49112

50-
expect(execFileSync.mock.calls[0][1]).toContain(
113+
expect(((execa as unknown) as jest.Mock).mock.calls[0][1]).toContain(
51114
'anotherApp:installStaging',
52115
);
53116
});
54117

55118
it('uses only task argument', async () => {
56-
// @ts-ignore
57-
await runOnAllDevices({
58-
tasks: ['someTask'],
59-
variant: 'debug',
60-
});
119+
await runOnAllDevices(
120+
{...args, tasks: ['someTask']},
121+
'./gradlew',
122+
'com.testapp',
123+
'adb',
124+
androidProject,
125+
);
61126

62-
expect(execFileSync.mock.calls[0][1]).toContain('someTask');
127+
expect(((execa as unknown) as jest.Mock).mock.calls[0][1]).toContain(
128+
'app:someTask',
129+
);
130+
});
131+
132+
it('uses appName and custom task argument', async () => {
133+
await runOnAllDevices(
134+
{...args, tasks: ['someTask']},
135+
'./gradlew',
136+
'com.testapp',
137+
'adb',
138+
{...androidProject, appName: 'anotherApp'},
139+
);
140+
141+
expect(((execa as unknown) as jest.Mock).mock.calls[0][1]).toContain(
142+
'anotherApp:someTask',
143+
);
63144
});
64145

65146
it('uses appFolder and custom task argument', async () => {
66-
// @ts-ignore
67-
await runOnAllDevices({
68-
appFolder: 'anotherApp',
69-
tasks: ['someTask'],
70-
variant: 'debug',
71-
});
72-
73-
expect(execFileSync.mock.calls[0][1]).toContain('anotherApp:someTask');
147+
await runOnAllDevices(
148+
{...args, appFolder: 'anotherApp', tasks: ['someTask'], variant: 'debug'},
149+
'./gradlew',
150+
'com.testapp',
151+
'adb',
152+
{...androidProject, appName: 'anotherApp'},
153+
);
154+
155+
expect(((execa as unknown) as jest.Mock).mock.calls[0][1]).toContain(
156+
'anotherApp:someTask',
157+
);
74158
});
75159

76160
it('uses multiple tasks', async () => {
77-
// @ts-ignore
78-
await runOnAllDevices({
79-
appFolder: 'app',
80-
tasks: ['clean', 'someTask'],
81-
});
161+
await runOnAllDevices(
162+
{...args, tasks: ['clean', 'someTask']},
163+
'./gradlew',
164+
'com.testapp',
165+
'adb',
166+
androidProject,
167+
);
82168

83-
expect(execFileSync.mock.calls[0][1]).toContain(
169+
expect(((execa as unknown) as jest.Mock).mock.calls[0][1]).toEqual([
84170
'app:clean',
85-
// @ts-ignore
86171
'app:someTask',
87-
);
172+
'-PreactNativeDevServerPort=8081',
173+
]);
88174
});
89175
});

0 commit comments

Comments
 (0)