feat: add EAS build configuration for local APK builds
- Add eas.json with development, preview, and production profiles - Configure preview profile for APK builds (arm64-v8a only) - Add build:apk npm script for local builds - Update app.json with app name and Android package - Add expo-build-properties dependency - Update CLAUDE.md with build documentation
This commit is contained in:
25
CLAUDE.md
25
CLAUDE.md
@@ -23,6 +23,7 @@ npm run android -w @caldav/client # Start on Android
|
|||||||
npm run ios -w @caldav/client # Start on iOS
|
npm run ios -w @caldav/client # Start on iOS
|
||||||
npm run web -w @caldav/client # Start web version
|
npm run web -w @caldav/client # Start web version
|
||||||
npm run lint -w @caldav/client # Run ESLint
|
npm run lint -w @caldav/client # Run ESLint
|
||||||
|
npm run build:apk -w @caldav/client # Build APK locally with EAS
|
||||||
```
|
```
|
||||||
|
|
||||||
### Server (apps/server) - Express.js backend
|
### Server (apps/server) - Express.js backend
|
||||||
@@ -42,6 +43,7 @@ npm run start -w @caldav/server # Run compiled server (port 3000)
|
|||||||
| | NativeWind | Tailwind CSS for React Native |
|
| | NativeWind | Tailwind CSS for React Native |
|
||||||
| | Zustand | State management |
|
| | Zustand | State management |
|
||||||
| | FlashList | High-performance lists |
|
| | FlashList | High-performance lists |
|
||||||
|
| | EAS Build | Local APK/IPA builds |
|
||||||
| Backend | Express.js | Web framework |
|
| Backend | Express.js | Web framework |
|
||||||
| | MongoDB | Database |
|
| | MongoDB | Database |
|
||||||
| | Mongoose | ODM |
|
| | Mongoose | ODM |
|
||||||
@@ -404,6 +406,29 @@ NODE_ENV=development # development = pretty logs, production = JSON
|
|||||||
- `ChatStore`: Zustand store with addMessage(), addMessages(), updateMessage(), clearMessages() - loads from server on mount and persists across tab switches
|
- `ChatStore`: Zustand store with addMessage(), addMessages(), updateMessage(), clearMessages() - loads from server on mount and persists across tab switches
|
||||||
- Event Detail and Note screens exist as skeletons
|
- Event Detail and Note screens exist as skeletons
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
### Local APK Build with EAS
|
||||||
|
```bash
|
||||||
|
npm run build:apk -w @caldav/client
|
||||||
|
```
|
||||||
|
|
||||||
|
This uses the `preview` profile from `eas.json` which builds an APK with:
|
||||||
|
- `arm64-v8a` architecture only (smaller APK size)
|
||||||
|
- No credentials required (`withoutCredentials: true`)
|
||||||
|
- Internal distribution
|
||||||
|
|
||||||
|
**Requirements:** Android SDK and Java must be installed locally.
|
||||||
|
|
||||||
|
**EAS Configuration:** `apps/client/eas.json` contains build profiles:
|
||||||
|
- `development`: Development client with internal distribution
|
||||||
|
- `preview`: APK build for testing (used by `build:apk`)
|
||||||
|
- `production`: Production build with auto-increment versioning
|
||||||
|
|
||||||
|
**App Identity:**
|
||||||
|
- Package name: `com.gilmour109.calchat`
|
||||||
|
- EAS Project ID: `b722dde6-7d89-48ff-9095-e007e7c7da87`
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
Detailed architecture diagrams are in `docs/`:
|
Detailed architecture diagrams are in `docs/`:
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
{
|
{
|
||||||
"expo": {
|
"expo": {
|
||||||
"jsEngine": "hermes",
|
"jsEngine": "hermes",
|
||||||
"name": "caldav",
|
"name": "CalChat",
|
||||||
"slug": "caldav",
|
"slug": "caldav",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"orientation": "portrait",
|
"orientation": "portrait",
|
||||||
"icon": "./assets/images/icon.png",
|
|
||||||
"scheme": "caldav",
|
"scheme": "caldav",
|
||||||
"userInterfaceStyle": "automatic",
|
"userInterfaceStyle": "automatic",
|
||||||
"newArchEnabled": true,
|
"newArchEnabled": true,
|
||||||
@@ -13,38 +12,26 @@
|
|||||||
"supportsTablet": true
|
"supportsTablet": true
|
||||||
},
|
},
|
||||||
"android": {
|
"android": {
|
||||||
"adaptiveIcon": {
|
"package": "com.gilmour109.calchat",
|
||||||
"backgroundColor": "#E6F4FE",
|
|
||||||
"foregroundImage": "./assets/images/android-icon-foreground.png",
|
|
||||||
"backgroundImage": "./assets/images/android-icon-background.png",
|
|
||||||
"monochromeImage": "./assets/images/android-icon-monochrome.png"
|
|
||||||
},
|
|
||||||
"edgeToEdgeEnabled": true,
|
"edgeToEdgeEnabled": true,
|
||||||
"predictiveBackGestureEnabled": false
|
"predictiveBackGestureEnabled": false
|
||||||
},
|
},
|
||||||
"web": {
|
"web": {
|
||||||
"output": "static",
|
"output": "static",
|
||||||
"favicon": "./assets/images/favicon.png",
|
|
||||||
"bundler": "metro"
|
"bundler": "metro"
|
||||||
},
|
},
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"expo-router",
|
"expo-router"
|
||||||
[
|
|
||||||
"expo-splash-screen",
|
|
||||||
{
|
|
||||||
"image": "./assets/images/splash-icon.png",
|
|
||||||
"imageWidth": 200,
|
|
||||||
"resizeMode": "contain",
|
|
||||||
"backgroundColor": "#ffffff",
|
|
||||||
"dark": {
|
|
||||||
"backgroundColor": "#000000"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
"experiments": {
|
"experiments": {
|
||||||
"typedRoutes": true,
|
"typedRoutes": true,
|
||||||
"reactCompiler": true
|
"reactCompiler": true
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"router": {},
|
||||||
|
"eas": {
|
||||||
|
"projectId": "b722dde6-7d89-48ff-9095-e007e7c7da87"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
28
apps/client/eas.json
Normal file
28
apps/client/eas.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"cli": {
|
||||||
|
"version": ">= 16.28.0",
|
||||||
|
"appVersionSource": "remote"
|
||||||
|
},
|
||||||
|
"build": {
|
||||||
|
"development": {
|
||||||
|
"developmentClient": true,
|
||||||
|
"distribution": "internal"
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"distribution": "internal",
|
||||||
|
"android": {
|
||||||
|
"buildType": "apk",
|
||||||
|
"withoutCredentials": true
|
||||||
|
},
|
||||||
|
"env": {
|
||||||
|
"ORG_GRADLE_PROJECT_reactNativeArchitectures": "arm64-v8a"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"production": {
|
||||||
|
"autoIncrement": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"submit": {
|
||||||
|
"production": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,8 @@
|
|||||||
"android": "expo start --android",
|
"android": "expo start --android",
|
||||||
"ios": "expo start --ios",
|
"ios": "expo start --ios",
|
||||||
"web": "expo start --web",
|
"web": "expo start --web",
|
||||||
"lint": "expo lint"
|
"lint": "expo lint",
|
||||||
|
"build:apk": "eas build --platform android --profile preview --local"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@caldav/shared": "*",
|
"@caldav/shared": "*",
|
||||||
@@ -18,6 +19,7 @@
|
|||||||
"@react-navigation/native": "^7.1.8",
|
"@react-navigation/native": "^7.1.8",
|
||||||
"@shopify/flash-list": "^2.0.2",
|
"@shopify/flash-list": "^2.0.2",
|
||||||
"expo": "~54.0.25",
|
"expo": "~54.0.25",
|
||||||
|
"expo-build-properties": "^1.0.10",
|
||||||
"expo-constants": "~18.0.10",
|
"expo-constants": "~18.0.10",
|
||||||
"expo-font": "~14.0.9",
|
"expo-font": "~14.0.9",
|
||||||
"expo-haptics": "~15.0.7",
|
"expo-haptics": "~15.0.7",
|
||||||
|
|||||||
64
package-lock.json
generated
64
package-lock.json
generated
@@ -28,6 +28,7 @@
|
|||||||
"@react-navigation/native": "^7.1.8",
|
"@react-navigation/native": "^7.1.8",
|
||||||
"@shopify/flash-list": "^2.0.2",
|
"@shopify/flash-list": "^2.0.2",
|
||||||
"expo": "~54.0.25",
|
"expo": "~54.0.25",
|
||||||
|
"expo-build-properties": "^1.0.10",
|
||||||
"expo-constants": "~18.0.10",
|
"expo-constants": "~18.0.10",
|
||||||
"expo-font": "~14.0.9",
|
"expo-font": "~14.0.9",
|
||||||
"expo-haptics": "~15.0.7",
|
"expo-haptics": "~15.0.7",
|
||||||
@@ -7303,6 +7304,53 @@
|
|||||||
"react-native": "*"
|
"react-native": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/expo-build-properties": {
|
||||||
|
"version": "1.0.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/expo-build-properties/-/expo-build-properties-1.0.10.tgz",
|
||||||
|
"integrity": "sha512-mFCZbrbrv0AP5RB151tAoRzwRJelqM7bCJzCkxpu+owOyH+p/rFC/q7H5q8B9EpVWj8etaIuszR+gKwohpmu1Q==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"ajv": "^8.11.0",
|
||||||
|
"semver": "^7.6.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"expo": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/expo-build-properties/node_modules/ajv": {
|
||||||
|
"version": "8.17.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
|
||||||
|
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"fast-deep-equal": "^3.1.3",
|
||||||
|
"fast-uri": "^3.0.1",
|
||||||
|
"json-schema-traverse": "^1.0.0",
|
||||||
|
"require-from-string": "^2.0.2"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/epoberezkin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/expo-build-properties/node_modules/json-schema-traverse": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/expo-build-properties/node_modules/semver": {
|
||||||
|
"version": "7.7.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
|
||||||
|
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
|
||||||
|
"license": "ISC",
|
||||||
|
"bin": {
|
||||||
|
"semver": "bin/semver.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/expo-constants": {
|
"node_modules/expo-constants": {
|
||||||
"version": "18.0.11",
|
"version": "18.0.11",
|
||||||
"resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.11.tgz",
|
"resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.11.tgz",
|
||||||
@@ -8013,6 +8061,22 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/fast-uri": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/fastify"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/fastify"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "BSD-3-Clause"
|
||||||
|
},
|
||||||
"node_modules/fastq": {
|
"node_modules/fastq": {
|
||||||
"version": "1.19.1",
|
"version": "1.19.1",
|
||||||
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
|
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
|
||||||
|
|||||||
Reference in New Issue
Block a user