19 changed files with 800 additions and 74 deletions
@ -0,0 +1,338 @@ |
|||
# Environment Variable Precedence and API Configuration |
|||
|
|||
**Date:** August 4, 2025 |
|||
**Author:** Matthew Raymer |
|||
|
|||
## Overview |
|||
|
|||
This document explains the order of precedence for environment variables in the |
|||
TimeSafari project, how `.env` files are used, and the API configuration scheme |
|||
for different environments. |
|||
|
|||
## Order of Precedence (Highest to Lowest) |
|||
|
|||
### 1. Shell Script Overrides (Highest Priority) |
|||
|
|||
Shell scripts can override environment variables for platform-specific needs: |
|||
|
|||
```bash |
|||
# scripts/common.sh - setup_build_env() |
|||
if [ "$BUILD_MODE" = "development" ]; then |
|||
export VITE_DEFAULT_ENDORSER_API_SERVER="http://localhost:3000" |
|||
export VITE_DEFAULT_PARTNER_API_SERVER="http://localhost:3000" |
|||
fi |
|||
``` |
|||
|
|||
### 2. Platform-Specific Overrides (High Priority) |
|||
|
|||
Platform-specific build scripts can override for mobile development: |
|||
|
|||
```bash |
|||
# scripts/build-android.sh |
|||
if [ "$BUILD_MODE" = "development" ]; then |
|||
export VITE_DEFAULT_ENDORSER_API_SERVER="http://10.0.2.2:3000" |
|||
export VITE_DEFAULT_PARTNER_API_SERVER="http://10.0.2.2:3000" |
|||
fi |
|||
``` |
|||
|
|||
### 3. Environment-Specific .env Files (Medium Priority) |
|||
|
|||
Environment-specific `.env` files provide environment-specific defaults: |
|||
|
|||
```bash |
|||
# .env.development, .env.test, .env.production |
|||
VITE_DEFAULT_ENDORSER_API_SERVER=http://localhost:3000 |
|||
VITE_DEFAULT_PARTNER_API_SERVER=http://localhost:3000 |
|||
``` |
|||
|
|||
### 4. Fallback .env File (Low Priority) |
|||
|
|||
General `.env` file provides project-wide defaults: |
|||
|
|||
```bash |
|||
# .env (if exists) |
|||
VITE_DEFAULT_ENDORSER_API_SERVER=http://localhost:3000 |
|||
``` |
|||
|
|||
### 5. app.ts Constants (Lowest Priority - Fallback) |
|||
|
|||
Hardcoded constants in `src/constants/app.ts` provide safety nets: |
|||
|
|||
```typescript |
|||
export const DEFAULT_ENDORSER_API_SERVER = |
|||
import.meta.env.VITE_DEFAULT_ENDORSER_API_SERVER || |
|||
AppString.PROD_ENDORSER_API_SERVER; |
|||
``` |
|||
|
|||
## Build Process Flow |
|||
|
|||
### 1. Shell Scripts Set Base Values |
|||
|
|||
```bash |
|||
# scripts/common.sh |
|||
setup_build_env() { |
|||
if [ "$BUILD_MODE" = "development" ]; then |
|||
export VITE_DEFAULT_ENDORSER_API_SERVER="http://localhost:3000" |
|||
export VITE_DEFAULT_PARTNER_API_SERVER="http://localhost:3000" |
|||
fi |
|||
} |
|||
``` |
|||
|
|||
### 2. Platform-Specific Overrides |
|||
|
|||
```bash |
|||
# scripts/build-android.sh |
|||
if [ "$BUILD_MODE" = "development" ]; then |
|||
export VITE_DEFAULT_ENDORSER_API_SERVER="http://10.0.2.2:3000" |
|||
export VITE_DEFAULT_PARTNER_API_SERVER="http://10.0.2.2:3000" |
|||
fi |
|||
``` |
|||
|
|||
### 3. Load .env Files |
|||
|
|||
```bash |
|||
# scripts/build-web.sh |
|||
local env_file=".env.$BUILD_MODE" # .env.development, .env.test, .env.production |
|||
if [ -f "$env_file" ]; then |
|||
load_env_file "$env_file" |
|||
fi |
|||
|
|||
# Fallback to .env |
|||
if [ -f ".env" ]; then |
|||
load_env_file ".env" |
|||
fi |
|||
``` |
|||
|
|||
### 4. Vite Processes Environment |
|||
|
|||
```typescript |
|||
// vite.config.common.mts |
|||
dotenv.config(); // Loads .env files |
|||
``` |
|||
|
|||
### 5. Application Uses Values |
|||
|
|||
```typescript |
|||
// src/constants/app.ts |
|||
export const DEFAULT_ENDORSER_API_SERVER = |
|||
import.meta.env.VITE_DEFAULT_ENDORSER_API_SERVER || |
|||
AppString.PROD_ENDORSER_API_SERVER; |
|||
``` |
|||
|
|||
## API Configuration Scheme |
|||
|
|||
### Environment Configuration Summary |
|||
|
|||
| Environment | Endorser API (Claims) | Partner API | Image API | |
|||
|-------------|----------------------|-------------|-----------| |
|||
| **Development** | `http://localhost:3000` | `http://localhost:3000` | `https://image-api.timesafari.app` | |
|||
| **Test** | `https://test-api.endorser.ch` | `https://test-partner-api.endorser.ch` | `https://image-api.timesafari.app` | |
|||
| **Production** | `https://api.endorser.ch` | `https://partner-api.endorser.ch` | `https://image-api.timesafari.app` | |
|||
|
|||
### Mobile Development Overrides |
|||
|
|||
#### Android Development |
|||
|
|||
- **Emulator**: `http://10.0.2.2:3000` (Android emulator default) |
|||
- **Physical Device**: `http://{CUSTOM_IP}:3000` (Custom IP for physical device) |
|||
|
|||
#### iOS Development |
|||
|
|||
- **Simulator**: `http://localhost:3000` (iOS simulator default) |
|||
- **Physical Device**: `http://{CUSTOM_IP}:3000` (Custom IP for physical device) |
|||
|
|||
## .env File Structure |
|||
|
|||
### .env.development |
|||
```bash |
|||
# ========================================== |
|||
# DEVELOPMENT ENVIRONMENT CONFIGURATION |
|||
# ========================================== |
|||
# API Server Configuration: |
|||
# - Endorser API (Claims): Local development server |
|||
# - Partner API: Local development server (aligned with claims) |
|||
# - Image API: Test server (shared for development) |
|||
# ========================================== |
|||
|
|||
# Only the variables that start with VITE_ are seen in the application import.meta.env in Vue. |
|||
|
|||
# iOS doesn't like spaces in the app title. |
|||
TIME_SAFARI_APP_TITLE="TimeSafari_Dev" |
|||
VITE_APP_SERVER=http://localhost:8080 |
|||
|
|||
# This is the claim ID for actions in the BVC project, with the JWT ID on this environment (not production). |
|||
VITE_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorser.ch/entity/01HWE8FWHQ1YGP7GFZYYPS272F |
|||
|
|||
# API Servers (Development - Local) |
|||
VITE_DEFAULT_ENDORSER_API_SERVER=http://localhost:3000 |
|||
VITE_DEFAULT_PARTNER_API_SERVER=http://localhost:3000 |
|||
|
|||
# Image API (Test server for development) |
|||
VITE_DEFAULT_IMAGE_API_SERVER=https://test-image-api.timesafari.app |
|||
|
|||
# Push Server (disabled for localhost) |
|||
#VITE_DEFAULT_PUSH_SERVER... can't be set up with localhost domain |
|||
|
|||
# Feature Flags |
|||
VITE_PASSKEYS_ENABLED=true |
|||
``` |
|||
|
|||
### .env.test |
|||
```bash |
|||
# ========================================== |
|||
# TEST ENVIRONMENT CONFIGURATION |
|||
# ========================================== |
|||
# API Server Configuration: |
|||
# - Endorser API (Claims): Test server |
|||
# - Partner API: Test server (aligned with claims) |
|||
# - Image API: Test server |
|||
# ========================================== |
|||
|
|||
# Only the variables that start with VITE_ are seen in the application import.meta.env in Vue. |
|||
|
|||
# iOS doesn't like spaces in the app title. |
|||
TIME_SAFARI_APP_TITLE="TimeSafari_Test" |
|||
VITE_APP_SERVER=https://test.timesafari.app |
|||
|
|||
# This is the claim ID for actions in the BVC project, with the JWT ID on this environment (not production). |
|||
VITE_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorser.ch/entity/01HWE8FWHQ1YGP7GFZYYPS272F |
|||
|
|||
# API Servers (Test Environment) |
|||
VITE_DEFAULT_ENDORSER_API_SERVER=https://test-api.endorser.ch |
|||
VITE_DEFAULT_PARTNER_API_SERVER=https://test-partner-api.endorser.ch |
|||
|
|||
# Image API (Test server) |
|||
VITE_DEFAULT_IMAGE_API_SERVER=https://test-image-api.timesafari.app |
|||
|
|||
# Push Server (Test) |
|||
VITE_DEFAULT_PUSH_SERVER=https://test.timesafari.app |
|||
|
|||
# Feature Flags |
|||
VITE_PASSKEYS_ENABLED=true |
|||
``` |
|||
|
|||
### .env.production |
|||
```bash |
|||
# ========================================== |
|||
# PRODUCTION ENVIRONMENT CONFIGURATION |
|||
# ========================================== |
|||
# API Server Configuration: |
|||
# - Endorser API (Claims): Production server |
|||
# - Partner API: Production server (aligned with claims) |
|||
# - Image API: Production server |
|||
# ========================================== |
|||
|
|||
# Only the variables that start with VITE_ are seen in the application import.meta.env in Vue. |
|||
|
|||
# App Server |
|||
VITE_APP_SERVER=https://timesafari.app |
|||
|
|||
# This is the claim ID for actions in the BVC project. |
|||
VITE_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorser.ch/entity/01GXYPFF7FA03NXKPYY142PY4H |
|||
|
|||
# API Servers (Production Environment) |
|||
VITE_DEFAULT_ENDORSER_API_SERVER=https://api.endorser.ch |
|||
VITE_DEFAULT_PARTNER_API_SERVER=https://partner-api.endorser.ch |
|||
|
|||
# Image API (Production server) |
|||
VITE_DEFAULT_IMAGE_API_SERVER=https://image-api.timesafari.app |
|||
|
|||
# Push Server (Production) |
|||
VITE_DEFAULT_PUSH_SERVER=https://timesafari.app |
|||
``` |
|||
|
|||
## Key Principles |
|||
|
|||
### 1. API Alignment |
|||
- **Partner API** values follow the same pattern as **Claim API** (Endorser API) |
|||
- Both APIs use the same environment-specific endpoints |
|||
- This ensures consistency across the application |
|||
|
|||
### 2. Platform Flexibility |
|||
- Shell scripts can override for platform-specific needs |
|||
- Android emulator uses `10.0.2.2:3000` |
|||
- iOS simulator uses `localhost:3000` |
|||
- Physical devices use custom IP addresses |
|||
|
|||
### 3. Environment Isolation |
|||
- Each environment has its own `.env` file |
|||
- Test environment uses test APIs |
|||
- Development environment uses local APIs |
|||
- Production environment uses production APIs |
|||
|
|||
### 4. Safety Nets |
|||
- Hardcoded constants in `app.ts` provide fallbacks |
|||
- Multiple layers of configuration prevent failures |
|||
- Clear precedence order ensures predictable behavior |
|||
|
|||
## Usage Examples |
|||
|
|||
### Development Build |
|||
```bash |
|||
# Uses .env.development + shell script overrides |
|||
npm run build:web -- --mode development |
|||
``` |
|||
|
|||
### Test Build |
|||
```bash |
|||
# Uses .env.test + shell script overrides |
|||
npm run build:web -- --mode test |
|||
``` |
|||
|
|||
### Production Build |
|||
```bash |
|||
# Uses .env.production + shell script overrides |
|||
npm run build:web -- --mode production |
|||
``` |
|||
|
|||
### Android Development |
|||
```bash |
|||
# Uses .env.development + Android-specific overrides |
|||
./scripts/build-android.sh --dev |
|||
``` |
|||
|
|||
### iOS Development |
|||
```bash |
|||
# Uses .env.development + iOS-specific overrides |
|||
./scripts/build-ios.sh --dev |
|||
``` |
|||
|
|||
## Troubleshooting |
|||
|
|||
### Environment Variable Debugging |
|||
```bash |
|||
# Show current environment variables |
|||
./scripts/build-web.sh --env |
|||
|
|||
# Check specific variable |
|||
echo $VITE_DEFAULT_ENDORSER_API_SERVER |
|||
``` |
|||
|
|||
### Common Issues |
|||
|
|||
1. **Wrong API Server**: Check if shell script overrides are correct |
|||
2. **Missing .env File**: Ensure environment-specific .env file exists |
|||
3. **Platform-Specific Issues**: Verify platform overrides in build scripts |
|||
4. **Vite Not Loading**: Check if `dotenv.config()` is called |
|||
|
|||
### Validation |
|||
```bash |
|||
# Validate environment configuration |
|||
npm run test-env |
|||
``` |
|||
|
|||
## Best Practices |
|||
|
|||
1. **Always use environment-specific .env files** for different environments |
|||
2. **Keep shell script overrides minimal** and platform-specific |
|||
3. **Document API alignment** in .env file headers |
|||
4. **Use hardcoded fallbacks** in `app.ts` for safety |
|||
5. **Test all environments** before deployment |
|||
6. **Validate configuration** with test scripts |
|||
|
|||
## Related Documentation |
|||
|
|||
- [Build System Overview](../build-system/README.md) |
|||
- [Android Custom API IP](../platforms/android-custom-api-ip.md) |
|||
- [API Configuration](../api-configuration.md) |
|||
- [Environment Setup](../environment-setup.md) |
@ -0,0 +1,322 @@ |
|||
# Mobile Custom API IP Configuration |
|||
|
|||
**Author**: Matthew Raymer |
|||
**Date**: 2025-01-27 |
|||
**Status**: ✅ **COMPLETE** - Custom API IP support for physical device development |
|||
|
|||
## Overview |
|||
|
|||
When deploying TimeSafari to physical Android devices during development, you may need to specify a custom IP address for the claim API server. This is necessary because physical devices cannot access `localhost` or `10.0.2.2` (Android emulator IP) to reach your local development server. |
|||
|
|||
## Problem |
|||
|
|||
During mobile development: |
|||
- **Android Emulator**: Uses `10.0.2.2:3000` to access host machine's localhost (Android emulator default) |
|||
- **iOS Simulator**: Uses `localhost:3000` to access host machine's localhost (iOS simulator default) |
|||
- **Physical Devices**: Cannot access `localhost` or `10.0.2.2` - needs actual IP address for network access |
|||
|
|||
## Solution |
|||
|
|||
The mobile build system uses platform-appropriate defaults and supports specifying a custom IP address for the claim API server when building for physical devices: |
|||
- **Android**: Defaults to `10.0.2.2:3000` for emulator development |
|||
- **iOS**: Uses Capacitor default (`localhost:3000`) for simulator development |
|||
|
|||
## Usage |
|||
|
|||
### Command Line Usage |
|||
|
|||
```bash |
|||
# Android - Default behavior (uses 10.0.2.2 for emulator) |
|||
./scripts/build-android.sh --dev |
|||
|
|||
# Android - Custom IP for physical device |
|||
./scripts/build-android.sh --dev --api-ip 192.168.1.100 |
|||
|
|||
# iOS - Default behavior (uses localhost for simulator) |
|||
./scripts/build-ios.sh --dev |
|||
|
|||
# iOS - Custom IP for physical device |
|||
./scripts/build-ios.sh --dev --api-ip 192.168.1.100 |
|||
|
|||
# Test environment with custom IP |
|||
./scripts/build-android.sh --test --api-ip 192.168.1.100 |
|||
./scripts/build-ios.sh --test --api-ip 192.168.1.100 |
|||
|
|||
# Build and auto-run with custom IP |
|||
./scripts/build-android.sh --dev --api-ip 192.168.1.100 --auto-run |
|||
./scripts/build-ios.sh --dev --api-ip 192.168.1.100 --auto-run |
|||
``` |
|||
|
|||
### NPM Scripts |
|||
|
|||
```bash |
|||
# Android - Default development build (uses 10.0.2.2 for emulator) |
|||
npm run build:android:dev |
|||
|
|||
# Android - Development build with custom IP (requires IP parameter) |
|||
npm run build:android:dev:custom 192.168.1.100 |
|||
|
|||
# iOS - Default development build (uses localhost for simulator) |
|||
npm run build:ios:dev |
|||
|
|||
# iOS - Development build with custom IP (requires IP parameter) |
|||
npm run build:ios:dev:custom 192.168.1.100 |
|||
|
|||
# Test builds with custom IP (requires IP parameter) |
|||
npm run build:android:test:custom 192.168.1.100 |
|||
npm run build:ios:test:custom 192.168.1.100 |
|||
|
|||
# Development build + auto-run with custom IP |
|||
npm run build:android:dev:run:custom 192.168.1.100 |
|||
npm run build:ios:dev:run:custom 192.168.1.100 |
|||
|
|||
# Test build + auto-run with custom IP |
|||
npm run build:android:test:run:custom 192.168.1.100 |
|||
npm run build:ios:test:run:custom 192.168.1.100 |
|||
``` |
|||
|
|||
## Examples |
|||
|
|||
### Scenario 1: Development on Simulator/Emulator (Default) |
|||
|
|||
```bash |
|||
# Android - Default behavior - uses 10.0.2.2 for emulator |
|||
npm run build:android:dev |
|||
|
|||
# iOS - Default behavior - uses localhost for simulator |
|||
npm run build:ios:dev |
|||
|
|||
# Build and immediately run on simulator/emulator |
|||
npm run build:android:dev:run |
|||
npm run build:ios:dev:run |
|||
``` |
|||
|
|||
### Scenario 2: Development on Physical Device |
|||
|
|||
```bash |
|||
# Your development server is running on 192.168.1.50:3000 |
|||
npm run build:android:dev:custom 192.168.1.50 |
|||
npm run build:ios:dev:custom 192.168.1.50 |
|||
|
|||
# Build and immediately run on device |
|||
npm run build:android:dev:run:custom 192.168.1.50 |
|||
npm run build:ios:dev:run:custom 192.168.1.50 |
|||
``` |
|||
|
|||
### Scenario 3: Testing on Physical Device |
|||
|
|||
```bash |
|||
# Your test server is running on 192.168.1.75:3000 |
|||
npm run build:android:test:custom 192.168.1.75 |
|||
npm run build:ios:test:custom 192.168.1.75 |
|||
|
|||
# Build and immediately run on device |
|||
npm run build:android:test:run:custom 192.168.1.75 |
|||
npm run build:ios:test:run:custom 192.168.1.75 |
|||
``` |
|||
|
|||
### Scenario 4: Direct Script Usage |
|||
|
|||
```bash |
|||
# Default behavior (uses platform-appropriate defaults) |
|||
./scripts/build-android.sh --dev --studio |
|||
./scripts/build-ios.sh --dev --studio |
|||
|
|||
# Custom IP for physical device |
|||
./scripts/build-android.sh --dev --api-ip 192.168.1.100 --studio |
|||
./scripts/build-ios.sh --dev --api-ip 192.168.1.100 --studio |
|||
``` |
|||
|
|||
## How It Works |
|||
|
|||
### Environment Variable Override |
|||
|
|||
The build system handles API server configuration as follows: |
|||
|
|||
1. **Android default**: Uses Android emulator default (`http://10.0.2.2:3000`) |
|||
2. **iOS default**: Uses Capacitor default (`http://localhost:3000`) |
|||
3. **Custom IP specified**: Overrides with `http://<custom-ip>:3000` for physical device development |
|||
4. **Maintains other APIs**: Image and Partner APIs remain at production URLs |
|||
5. **Logs the configuration**: Shows which IP is being used in build logs |
|||
|
|||
### Build Process |
|||
|
|||
```bash |
|||
# Development mode with Android emulator default (10.0.2.2) |
|||
export VITE_DEFAULT_ENDORSER_API_SERVER="http://10.0.2.2:3000" |
|||
export VITE_DEFAULT_PARTNER_API_SERVER="http://10.0.2.2:3000" |
|||
npm run build:capacitor -- --mode development |
|||
|
|||
# Development mode with iOS simulator default (localhost) |
|||
export VITE_DEFAULT_ENDORSER_API_SERVER="http://localhost:3000" |
|||
export VITE_DEFAULT_PARTNER_API_SERVER="http://localhost:3000" |
|||
npm run build:capacitor -- --mode development |
|||
|
|||
# Development mode with custom IP |
|||
export VITE_DEFAULT_ENDORSER_API_SERVER="http://192.168.1.100:3000" |
|||
export VITE_DEFAULT_PARTNER_API_SERVER="http://192.168.1.100:3000" |
|||
npm run build:capacitor -- --mode development |
|||
``` |
|||
|
|||
### Default Behavior |
|||
|
|||
- **Android (no `--api-ip`)**: Uses Android emulator default (`10.0.2.2:3000`) |
|||
- **iOS (no `--api-ip`)**: Uses Capacitor default (`localhost:3000`) |
|||
- **Custom IP specified**: Uses provided IP address for physical device development |
|||
- **Invalid IP format**: Build will fail with clear error message |
|||
- **Network unreachable**: App will show connection errors at runtime |
|||
|
|||
## Finding Your IP Address |
|||
|
|||
### On Linux/macOS |
|||
|
|||
```bash |
|||
# Find your local IP address |
|||
ifconfig | grep "inet " | grep -v 127.0.0.1 |
|||
# or |
|||
ip addr show | grep "inet " | grep -v 127.0.0.1 |
|||
``` |
|||
|
|||
### On Windows |
|||
|
|||
```bash |
|||
# Find your local IP address |
|||
ipconfig | findstr "IPv4" |
|||
``` |
|||
|
|||
### Common Network Patterns |
|||
|
|||
- **Home WiFi**: Usually `192.168.1.x` or `192.168.0.x` |
|||
- **Office Network**: May be `10.x.x.x` or `172.16.x.x` |
|||
- **Mobile Hotspot**: Often `192.168.43.x` |
|||
|
|||
## Troubleshooting |
|||
|
|||
### Common Issues |
|||
|
|||
#### 1. Device Cannot Connect to API |
|||
|
|||
```bash |
|||
# Check if your IP is accessible |
|||
ping 192.168.1.100 |
|||
|
|||
# Check if port 3000 is open |
|||
telnet 192.168.1.100 3000 |
|||
``` |
|||
|
|||
#### 2. Build Fails with Invalid IP |
|||
|
|||
```bash |
|||
# Ensure IP format is correct |
|||
./scripts/build-android.sh --dev --api-ip 192.168.1.100 # ✅ Correct |
|||
./scripts/build-android.sh --dev --api-ip localhost # ❌ Wrong |
|||
``` |
|||
|
|||
#### 3. Firewall Blocking Connection |
|||
|
|||
```bash |
|||
# Check firewall settings |
|||
sudo ufw status # Ubuntu/Debian |
|||
sudo firewall-cmd --list-all # CentOS/RHEL |
|||
``` |
|||
|
|||
### Debug Mode |
|||
|
|||
```bash |
|||
# Enable verbose logging |
|||
./scripts/build-android.sh --dev --api-ip 192.168.1.100 --verbose |
|||
``` |
|||
|
|||
## Best Practices |
|||
|
|||
### 1. Use Consistent IP Addresses |
|||
|
|||
```bash |
|||
# Create aliases for common development scenarios |
|||
alias build-dev="npm run build:android:dev:custom 192.168.1.100" |
|||
alias build-test="npm run build:android:test:custom 192.168.1.100" |
|||
``` |
|||
|
|||
### 2. Document Your Setup |
|||
|
|||
```bash |
|||
# Create a development setup file |
|||
echo "DEV_API_IP=192.168.1.100" > .env.development |
|||
echo "TEST_API_IP=192.168.1.100" >> .env.development |
|||
``` |
|||
|
|||
### 3. Network Security |
|||
|
|||
- Ensure your development server is only accessible on your local network |
|||
- Use HTTPS in production environments |
|||
- Consider VPN for remote development scenarios |
|||
|
|||
### 4. Team Development |
|||
|
|||
```bash |
|||
# Share IP configuration with team |
|||
# Add to .env.example |
|||
DEV_API_IP=192.168.1.100 |
|||
TEST_API_IP=192.168.1.100 |
|||
``` |
|||
|
|||
## Integration with CI/CD |
|||
|
|||
### Environment Variables |
|||
|
|||
```yaml |
|||
# Example CI/CD configuration |
|||
variables: |
|||
DEV_API_IP: "192.168.1.100" |
|||
TEST_API_IP: "192.168.1.100" |
|||
|
|||
build: |
|||
script: |
|||
- npm run build:android:dev:custom $DEV_API_IP |
|||
``` |
|||
|
|||
### Automated Testing |
|||
|
|||
```bash |
|||
# Test with different IP configurations |
|||
npm run build:android:test:custom 192.168.1.100 |
|||
npm run build:android:test:custom 10.0.0.100 |
|||
``` |
|||
|
|||
## Migration from Legacy |
|||
|
|||
### Previous Workarounds |
|||
|
|||
Before this feature, developers had to: |
|||
1. Manually edit environment files |
|||
2. Use different build configurations |
|||
3. Modify source code for IP addresses |
|||
|
|||
### New Approach |
|||
|
|||
```bash |
|||
# Simple one-liner |
|||
npm run build:android:dev:custom 192.168.1.100 |
|||
``` |
|||
|
|||
## Future Enhancements |
|||
|
|||
### Planned Features |
|||
|
|||
1. **IP Validation**: Automatic IP format validation |
|||
2. **Network Discovery**: Auto-detect available IP addresses |
|||
3. **Port Configuration**: Support for custom ports |
|||
4. **Multiple APIs**: Support for custom IPs for all API endpoints |
|||
|
|||
### Integration Opportunities |
|||
|
|||
1. **Docker Integration**: Automatic IP detection in containerized environments |
|||
2. **Network Profiles**: Save and reuse common network configurations |
|||
3. **Hot Reload**: Automatic rebuild when IP changes |
|||
|
|||
--- |
|||
|
|||
**Status**: Complete and ready for production use |
|||
**Last Updated**: 2025-01-27 |
|||
**Version**: 1.0 |
|||
**Maintainer**: Matthew Raymer |
Loading…
Reference in new issue