feat(cap-vite): use platform-specific device id (#1458)

---------

Co-authored-by-agent: Cursor Agent <cursoragent@cursor.com>
Co-authored-by-agent: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
This commit is contained in:
LemonNeko
2026-03-23 21:23:15 +08:00
committed by GitHub
parent 3156b82aff
commit 5ba6f4cbf3
6 changed files with 38 additions and 13 deletions
+1 -1
View File
@@ -298,7 +298,7 @@ Start the development server for the capacitor:
```shell
pnpm dev:pocket:ios --target <DEVICE_ID_OR_SIMULATOR_NAME>
# Or
CAPACITOR_DEVICE_ID=<DEVICE_ID_OR_SIMULATOR_NAME> pnpm dev:pocket:ios
CAPACITOR_DEVICE_ID_IOS=<DEVICE_ID_OR_SIMULATOR_NAME> pnpm dev:pocket:ios
```
You can see the list of available devices and simulators by running `pnpm exec cap run ios --list`.
+1 -1
View File
@@ -38,7 +38,7 @@ Open the project in Android Studio:
```bash
pnpm dev:android -- target <CAPACITOR_DEVICE_ID>
# Or
CAPACITOR_DEVICE_ID=<CAPACITOR_DEVICE_ID> pnpm dev:android
CAPACITOR_DEVICE_ID_ANDROID=<CAPACITOR_DEVICE_ID> pnpm dev:android
```
+2 -2
View File
@@ -13,13 +13,13 @@ Examples:
```bash
pnpm exec cap-vite -- ios --target <DEVICE_ID_OR_SIMULATOR_NAME>
pnpm exec cap-vite -- --host 0.0.0.0 --port 5173 -- android --target <DEVICE_ID_OR_SIMULATOR_NAME> --flavor release
CAPACITOR_DEVICE_ID=<DEVICE_ID_OR_SIMULATOR_NAME> pnpm exec cap-vite -- ios
CAPACITOR_DEVICE_ID_IOS=<DEVICE_ID_OR_SIMULATOR_NAME> pnpm exec cap-vite -- ios
pnpm -F @proj-airi/stage-pocket run dev:ios -- --target <DEVICE_ID_OR_SIMULATOR_NAME>
```
- Arguments before `--` are forwarded to `vite`.
- Arguments after `--` are forwarded to `cap run`.
- If `CAPACITOR_DEVICE_ID` is set and `cap run` args do not contain `--target`, `cap-vite` injects `--target <CAPACITOR_DEVICE_ID>` automatically.
- If the platform-specific env is set (`CAPACITOR_DEVICE_ID_IOS` or `CAPACITOR_DEVICE_ID_ANDROID`) and `cap run` args do not contain `--target`, `cap-vite` injects `--target` with that value automatically.
- `cap-vite` always launches the Vite dev server. Do not pass `vite dev` or `vite serve` as extra args.
- After the dev server starts, press `R` in the terminal to re-run `cap run` without restarting Vite.
+5
View File
@@ -29,6 +29,11 @@ export function getCapViteCliUsage(): string {
return usage
}
// TODO: CLI and `cap run` argument handling are hand-rolled (see also `resolveCapRunArgs` /
// `hasCapacitorTargetArg` in native.ts). If parsing rules keep growing, adopt a dedicated argv
// library (cac is already a dependency—consider subcommands or a small wrapper) so flags like
// `--target` / `--target=`, env-based defaults, and validation stay in one maintainable layer.
export function parseCapViteCliArgs(argv: string[]): ParsedCapViteCliArgs | null {
if (argv.length === 1 && (argv[0] === '--help' || argv[0] === '-h')) {
return null
+18 -4
View File
@@ -46,22 +46,36 @@ describe('resolveCapRunArgs', () => {
it('keeps an explicit --target argument untouched', () => {
expect(resolveCapRunArgs(
['ios', '--target', 'iPhone 16 Pro', '--scheme', 'AIRI'],
{ CAPACITOR_DEVICE_ID: 'ignored-device' },
{ CAPACITOR_DEVICE_ID_IOS: 'ignored-device' },
)).toEqual(['ios', '--target', 'iPhone 16 Pro', '--scheme', 'AIRI'])
})
it('injects --target from CAPACITOR_DEVICE_ID when it is missing', () => {
it('injects --target from CAPACITOR_DEVICE_ID_ANDROID when it is missing', () => {
expect(resolveCapRunArgs(
['android', '--flavor', 'release'],
{ CAPACITOR_DEVICE_ID: 'emulator-5554' },
{ CAPACITOR_DEVICE_ID_ANDROID: 'emulator-5554' },
)).toEqual(['android', '--target', 'emulator-5554', '--flavor', 'release'])
})
it('injects --target from CAPACITOR_DEVICE_ID_IOS when it is missing', () => {
expect(resolveCapRunArgs(
['ios', '--scheme', 'AIRI'],
{ CAPACITOR_DEVICE_ID_IOS: 'iPhone 16 Pro' },
)).toEqual(['ios', '--target', 'iPhone 16 Pro', '--scheme', 'AIRI'])
})
it('does not use the other platform device id', () => {
expect(resolveCapRunArgs(
['ios'],
{ CAPACITOR_DEVICE_ID_ANDROID: 'emulator-5554' },
)).toEqual(['ios'])
})
it('supports the --target=value form when checking existing args', () => {
expect(hasCapacitorTargetArg(['android', '--target=emulator-5554'])).toBe(true)
expect(resolveCapRunArgs(
['android', '--target=emulator-5554', '--flavor', 'release'],
{ CAPACITOR_DEVICE_ID: 'ignored-device' },
{ CAPACITOR_DEVICE_ID_ANDROID: 'ignored-device' },
)).toEqual(['android', '--target=emulator-5554', '--flavor', 'release'])
})
})
+11 -5
View File
@@ -89,14 +89,20 @@ export function resolveCapRunArgs(capArgs: string[], env: NodeJS.ProcessEnv = pr
return capArgs
}
const target = env.CAPACITOR_DEVICE_ID
if (!target) {
return capArgs
const [platformArg, ...rest] = capArgs
const platform = parseCapacitorPlatform(platformArg)
let target: string | undefined;
if (platform === 'ios') {
target = env.CAPACITOR_DEVICE_ID_IOS;
} else if (platform === 'android') {
target = env.CAPACITOR_DEVICE_ID_ANDROID;
}
const [platform, ...rest] = capArgs
if (!target) {
return capArgs;
}
return [platform, '--target', target, ...rest]
return [platformArg, '--target', target, ...rest]
}
export function pickServerUrl(server: Pick<ViteDevServer, 'resolvedUrls'>): URL {