Capacitor Version: 8.0.0
Thanks Ionic team for the work you do! The root issue that I'm calling out with this issue is that cap run -l ignores server config, but there are a few related issues imo worth solving here. I'm hoping that this issue can be a suitable place to discuss them at a high level before creating small-scope issues.
If preferred, I'm happy to break these out into small-scope tickets now, just lmk.
Current Behavior
cap run -l ignores capacitor.config.{ts|json|etc} server config. Instead, what happens is as follows:
- If
--host cli arg is used, use that value
- If not, resolve to a reasonable external network interface || localhost
- If
--port cli arg is used, use that value
- Concatenate values to form connection string
http://{host}:{port}
Pain points, use cases, solutions
Hardcoded http protocol
Paint point 1: My company's auth provider refuses to work on non-localhost && non-encrypted (http://) connections. I.e. http://localhost is fine, but http://192.168.x.x fails. This of course creates problems for running locally on hardware devices.
Pain point 2: I would like to add tunneling to my app via a --tunnel flag. A standard tunneling setup might use ngrok, and would therefore use a connection string like https://some-endpoint.ngrok.com. In order to do this, I would need to pass that endpoint to cap run -l at runtime. Using just --host and --port this is impossible; I need to be able to control the protocol.
Solutions: Add support for a --https/--protocol/ssl flag to cap run -l.
Bad values imputed when no host/port
Pain point 1: cap run -l auto selects a reasonable network interface to try to load the app from. Oftentimes, a non-peer-accessible network is selected. I regularly experience this behavior:
- I'm at a coffee shop/on a mobile hotspot which blocks peer traffic on e.g. the 10.x.x.x address space
- 169.254.x.x address space is peer-accessible
Pain point 2: cap run -l uses port 3000 when a --port cli arg isn't passed. We cannot reasonably make the assumption that we should use port 3000, especially when one of the dominant bundlers uses 5173 by default.
Solutions: Three distinct behaviors here would constitute a solution:
- If
--host and --port are unset, use server.url
- If
server.url is unset, use reasonable default according to existing strategy
- If
--host is unset, use server.hostname for host
- Add
port to server config
- if
--port is unset, use server.port
- If
server.port is unset, use reasonable default according to existing strategy
Remaining server fields are ignored
I haven't experienced pain points with fields iosScheme, androidScheme, errorPath, appStartPath, clearText. I have however with allowNavigation.
Pain point: As mentioned in the section on http protocol hardcoding, I would like to set up tunneling. In order to do this, I need to add ngrok endpoints to allowNavigation. This is impossible with cap run -l because these config fields get nuked.
Docs Mismatch
I believe that the fixes I've articulated here would make this experience in line with what users expect; it works this way when running via Xcode, why wouldn't it work this way via cap run -l? In addition, the docs for Capacitor configuration and cap run make no mention of these limitations.
Action Items
I'm happy to open PRs to address each fix individually in the proposed order:
- When
--host and --port are unset, use capacitor.config.* server config values. Add port support to server config object here too. If all values unset, use existing strategy for reasonable defaults
- Preserve
server config items when using cap run -l
- Add
--https support to `cap run
Would Ionic welcome PRs to address any of these problems? If so, I will happy open PRs to address whatever work is welcome. In my experience, they would go a long way in reconciling observed behavior with documented behavior, and bettering the DX.
Thanks again for the work you do.
Other API Details
Platforms Affected
Current Behavior
cap run -l ignores capacitor.config.{ts|json|etc} server config. Instead, what happens is as follows:
- If
--host cli arg is used, use that value
- If not, resolve to a reasonable external network interface || localhost
- If
--port cli arg is used, use that value
- Concatenate values to form connection string
http://{host}:{port}
Expected Behavior
cap run -l respects server config object in capacitor.config.*
Project Reproduction
https://github.com/aolsenjazz/fresh-cap-repo
Additional Information
File references:
Capacitor Version: 8.0.0
Thanks Ionic team for the work you do! The root issue that I'm calling out with this issue is that
cap run -lignores server config, but there are a few related issues imo worth solving here. I'm hoping that this issue can be a suitable place to discuss them at a high level before creating small-scope issues.If preferred, I'm happy to break these out into small-scope tickets now, just lmk.
Current Behavior
cap run -lignorescapacitor.config.{ts|json|etc}server config. Instead, what happens is as follows:--hostcli arg is used, use that value--portcli arg is used, use that valuehttp://{host}:{port}Pain points, use cases, solutions
Hardcoded
httpprotocolPaint point 1: My company's auth provider refuses to work on non-localhost && non-encrypted (
http://) connections. I.e.http://localhostis fine, buthttp://192.168.x.xfails. This of course creates problems for running locally on hardware devices.Pain point 2: I would like to add tunneling to my app via a
--tunnelflag. A standard tunneling setup might use ngrok, and would therefore use a connection string likehttps://some-endpoint.ngrok.com. In order to do this, I would need to pass that endpoint tocap run -lat runtime. Using just--hostand--portthis is impossible; I need to be able to control the protocol.Solutions: Add support for a
--https/--protocol/sslflag tocap run -l.Bad values imputed when no
host/portPain point 1:
cap run -lauto selects a reasonable network interface to try to load the app from. Oftentimes, a non-peer-accessible network is selected. I regularly experience this behavior:Pain point 2:
cap run -luses port3000when a--portcli arg isn't passed. We cannot reasonably make the assumption that we should use port3000, especially when one of the dominant bundlers uses5173by default.Solutions: Three distinct behaviors here would constitute a solution:
--hostand--portare unset, useserver.urlserver.urlis unset, use reasonable default according to existing strategy--hostis unset, useserver.hostnamefor hostportto server config--portis unset, useserver.portserver.portis unset, use reasonable default according to existing strategyRemaining
serverfields are ignoredI haven't experienced pain points with fields
iosScheme,androidScheme,errorPath,appStartPath,clearText. I have however withallowNavigation.Pain point: As mentioned in the section on http protocol hardcoding, I would like to set up tunneling. In order to do this, I need to add ngrok endpoints to
allowNavigation. This is impossible withcap run -lbecause these config fields get nuked.Docs Mismatch
I believe that the fixes I've articulated here would make this experience in line with what users expect; it works this way when running via Xcode, why wouldn't it work this way via
cap run -l? In addition, the docs for Capacitor configuration and cap run make no mention of these limitations.Action Items
I'm happy to open PRs to address each fix individually in the proposed order:
--hostand--portare unset, usecapacitor.config.*serverconfig values. Addportsupport toserverconfig object here too. If all values unset, use existing strategy for reasonable defaultsserverconfig items when usingcap run -l--httpssupport to `cap runWould Ionic welcome PRs to address any of these problems? If so, I will happy open PRs to address whatever work is welcome. In my experience, they would go a long way in reconciling observed behavior with documented behavior, and bettering the DX.
Thanks again for the work you do.
Other API Details
Platforms Affected
Current Behavior
cap run -lignorescapacitor.config.{ts|json|etc}server config. Instead, what happens is as follows:--hostcli arg is used, use that value--portcli arg is used, use that valuehttp://{host}:{port}Expected Behavior
cap run -lrespectsserverconfig object incapacitor.config.*Project Reproduction
https://github.com/aolsenjazz/fresh-cap-repo
Additional Information
File references: