Initial commit: expo-popcore project

This commit is contained in:
imeepos
2025-12-25 16:31:17 +08:00
commit 0cbb74e03a
188 changed files with 20796 additions and 0 deletions

126
.devcontainer/Dockerfile Normal file
View File

@@ -0,0 +1,126 @@
# Ubuntu 20.04 from GitHub mirror
FROM ubuntu:20.04
LABEL maintainer="vitor.roberto3022@gmail.com"
ENV DEBIAN_FRONTEND=noninteractive
# Use Alibaba Cloud mirror for Ubuntu packages
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# Update the package list and install dependencies
RUN apt-get update && \
apt-get install -y \
curl \
gnupg \
wget \
unzip \
make \
sudo \
git \
build-essential
# Add NodeSource APT repository for Node.js (keep for compatibility)
RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
# Install Node.js (include for some tools that still require it)
RUN apt-get install -y nodejs
# Install Bun using official installation script
RUN curl -fsSL https://bun.sh/install | bash
# Set Bun environment variables (official installation location)
ENV BUN_INSTALL="/root/.bun"
ENV PATH="$BUN_INSTALL/bin:$PATH"
# Install expo dependencies with Bun
RUN bun install -g eas-cli
RUN bun install -g sharp-cli
# Setup folder to store the expo apps
RUN mkdir -p /home/expo_apps/
# Install android studio and java dependencies
RUN dpkg --add-architecture i386
RUN apt-get update && apt-get install -y \
libc6:i386 \
libncurses5:i386 \
libstdc++6:i386 \
lib32z1 \
libbz2-1.0:i386 \
libxrender1 \
libxtst6 \
libxi6 \
libfreetype6 \
libxft2 \
xz-utils \
qemu \
qemu-kvm \
libvirt-daemon-system \
libvirt-clients \
bridge-utils \
libnotify4 \
libglu1-mesa \
libqt5widgets5 \
openjdk-17-jdk \
xvfb
# Get Android SDK command line tools from official Google source
RUN wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
RUN unzip commandlinetools-linux-11076708_latest.zip
RUN mkdir -p /android-sdk-linux/cmdline-tools
RUN mv cmdline-tools /android-sdk-linux/cmdline-tools/latest
# Get NDK version 27.1.12297006 from official Google source
RUN wget https://dl.google.com/android/repository/android-ndk-r27-linux.zip
RUN unzip android-ndk-r27-linux.zip
# Set environment variables
ENV ANDROID_HOME=/android-sdk-linux
ENV ANDROID_SDK_ROOT=/android-sdk-linux
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
ENV ANDROID_NDK_HOME=/android-ndk-r27
ENV PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools
# Accept Android SDK licenses
RUN yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses
# Install required Android SDK components for minSDK 24, targetSDK 36
RUN $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager \
"platform-tools" \
"platforms;android-36" \
"platforms;android-24" \
"build-tools;36.0.0" \
"build-tools;24.0.3"
# Create workspace directory
WORKDIR /workspace
# Configure Gradle for better performance
RUN mkdir -p ~/.gradle
RUN echo 'org.gradle.daemon=true' >> ~/.gradle/gradle.properties
RUN echo 'org.gradle.parallel=true' >> ~/.gradle/gradle.properties
RUN echo 'org.gradle.configureondemand=true' >> ~/.gradle/gradle.properties
# Set environment variables for root user
ENV ANDROID_HOME=/android-sdk-linux
ENV ANDROID_SDK_ROOT=/android-sdk-linux
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
ENV ANDROID_NDK_HOME=/android-ndk-r27
ENV BUN_INSTALL="/root/.bun"
ENV PATH="$BUN_INSTALL/bin:$JAVA_HOME/bin:$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools"
# Verify installations
RUN java -version
RUN node --version
RUN npm --version
RUN bun --version
RUN eas --version
RUN $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --list
# Expose default ports
EXPOSE 8081 19000 19001 19002
# Default command
CMD ["sleep", "infinity"]

156
.devcontainer/README.md Normal file
View File

@@ -0,0 +1,156 @@
# Expo EAS Android Dev Container
这个开发容器环境专门为 Expo EAS 本地构建 Android APK 而设计,支持 VS Code 和 JetBrains WebStorm IDE。
## 功能特性
- **Linux Docker 环境**: 基于 Ubuntu 22.04
- **Android SDK**: 预装 Android SDK 34 和构建工具
- **Java 17**: 支持 Android 开发的 Java 环境
- **Node.js 20 LTS**: 最新稳定版本的 Node.js
- **Expo CLI**: 最新版本的 Expo 命令行工具
- **EAS CLI**: 用于本地构建的 EAS 工具
- **IDE 支持**: 同时支持 VS Code 和 WebStorm
## 使用方法
### WebStorm IDE 使用
1. **安装 Docker 插件**
- 打开 WebStorm
- 进入 `File``Settings``Plugins`
- 搜索并安装 `Docker` 插件
2. **配置 Docker 连接**
- 进入 `File``Settings``Build, Execution, Deployment``Docker`
- 点击 `+` 添加 Docker 连接
- 选择 `Docker for Windows``Docker for Mac`
3. **启动开发容器**
```bash
# 在项目根目录运行
cd .devcontainer
docker-compose -f docker-compose.webstorm.yml up -d
```
4. **在 WebStorm 中连接到容器**
- 进入 `File` → `Settings` → `Build, Execution, Deployment` → `Docker`
- 右键点击运行的容器,选择 `Create...` → `Node.js Remote Interpreter`
- 配置远程 Node.js 解释器
5. **配置项目 SDK**
- 进入 `File` → `Settings` → `Languages & Frameworks` → `Node.js and NPM`
- 选择容器中的 Node.js 解释器
- 设置 package.json 为项目配置文件
### VS Code 使用(原有方式)
1. 确保已安装 [Dev Containers 扩展](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
2. 在 VS Code 中打开此项目
3. 按 `F1` 或 `Ctrl+Shift+P` 打开命令面板
4. 选择 "Dev Containers: Reopen in Container"
### 本地构建 Android APK
容器启动后,你可以使用以下命令进行本地构建:
```bash
# 安装依赖
npm install
# 预览版本构建
npm run build:android:preview
# 或者直接使用 EAS CLI
eas build --platform android --profile preview --local
```
### 开发服务器
```bash
# 启动 Expo 开发服务器
npm start
# Android 运行
npm run android
```
## WebStorm 特殊配置
### 远程调试配置
1. **配置运行/调试配置**
- 进入 `Run` → `Edit Configurations...`
- 点击 `+` 添加 `Node.js` 配置
- 设置 JavaScript file 为 `node_modules/.bin/expo`
- 设置 Application parameters 为 `start`
- 选择容器中的 Node.js 解释器
2. **端口映射**
- 确保 Docker 容器端口已正确映射
- 8081: Metro Bundler
- 19000-19002: Expo Dev Server
### 文件同步
WebStorm 会自动同步文件到容器,如遇到同步问题:
1. 检查 Docker 挂载点配置
2. 确保文件权限正确
3. 重启 Docker 服务
## 端口映射
- `8081`: Metro Bundler
- `19000`: Expo Dev Server
- `19001`: Expo Dev Server (HTTPS)
- `19002`: Expo Dev Server (Alternate)
## 环境变量
容器已配置以下环境变量:
- `ANDROID_HOME=/opt/android-sdk`
- `JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64`
- `GRADLE_USER_HOME=/root/.gradle`
- `EXPO_NO_DOTENV=1`
- `EXPO_DEBUG=1`
## 数据持久化
以下目录已挂载为 Docker 卷,确保数据持久化:
- `/root/.gradle`: Gradle 缓存
- `/root/.android`: Android SDK 配置
## 故障排除
### 构建失败
1. 检查 EAS 配置文件 `eas.json`
2. 确保已正确设置 Android SDK 路径
3. 验证 Java 版本是否为 17
### 权限问题
如果遇到权限问题,可能需要:
```bash
sudo chown -R node:node /workspace
```
### 清理缓存
```bash
# 清理 Expo 缓存
expo r -c
# 清理 EAS 缓存
eas build:clean
```
## 注意事项
- 首次构建可能需要较长时间下载依赖
- 建议使用 VPN 访问 Google 服务以加快 Android SDK 下载
- 容器需要 privileged 模式以支持 Android 模拟器(如需要)

View File

@@ -0,0 +1,76 @@
{
"name": "Expo EAS Android Build",
"dockerComposeFile": "docker-compose.yml",
"service": "expo-android",
"workspaceFolder": "/workspace",
"shutdownAction": "stopCompose",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers/features/git:1": {}
},
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.vscode-typescript-next",
"expo.vscode-expo-tools",
"ms-vscode.vscode-json",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"ms-vscode.vscode-eslint"
],
"settings": {
"typescript.preferences.importModuleSpecifier": "relative",
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"eslint.workingDirectories": ["."],
"files.exclude": {
"**/node_modules": true,
"**/.git": true,
"**/.DS_Store": true,
"**/Thumbs.db": true
}
}
},
"jetbrains": {
"ide": "WebStorm",
"plugins": [
"NodeJS",
"TypeScript",
"JavaScript",
"Docker",
"Git"
],
"settings": {
"nodejs.package_manager": "npm",
"typescript.compiler.module": "commonjs",
"editor.format.on.save": true,
"editor.code.inspection.on.the.fly": true,
"javascript.nodejs.core.library.use.typings": true
}
}
},
"forwardPorts": [8081, 19000, 19001, 19002],
"portsAttributes": {
"8081": {
"label": "Metro Bundler",
"onAutoForward": "notify"
},
"19000": {
"label": "Expo Dev Server",
"onAutoForward": "notify"
},
"19001": {
"label": "Expo Dev Server (HTTPS)",
"onAutoForward": "notify"
},
"19002": {
"label": "Expo Dev Server (Alternate)",
"onAutoForward": "notify"
}
},
"postCreateCommand": "npm install",
"remoteUser": "root",
"mounts": [
"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"
]
}

View File

@@ -0,0 +1,55 @@
version: '3.8'
services:
expo-android:
build:
context: .
dockerfile: Dockerfile
container_name: expo-eas-android-webstorm
volumes:
- ../../../:/workspace
- android_gradle:/root/.gradle
- android_sdk:/root/.android
# Additional volumes for WebStorm
- webstorm_config:/root/.config/JetBrains
- webstorm_system:/root/.local/share/JetBrains
ports:
- "8081:8081" # Metro bundler
- "19000:19000" # Expo dev server
- "19001:19001" # Expo dev server HTTPS
- "19002:19002" # Expo dev server alternate
environment:
- NODE_ENV=development
- ANDROID_HOME=/opt/android-sdk
- JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
- GRADLE_USER_HOME=/root/.gradle
- EXPO_NO_DOTENV=1
- EXPO_DEBUG=1
# WebStorm specific environment variables
- DISPLAY=${DISPLAY:-:0}
- XDG_RUNTIME_DIR=/tmp/runtime-root
working_dir: /workspace
command: sleep infinity
privileged: true # Required for Android emulator if needed
devices:
- /dev/kvm # For Android emulator acceleration
# Network configuration for better IDE connectivity
networks:
- expo-network
# Health check for IDE connectivity
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8081"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
volumes:
android_gradle:
android_sdk:
webstorm_config:
webstorm_system:
networks:
expo-network:
driver: bridge

View File

@@ -0,0 +1,33 @@
version: '3.8'
services:
expo-android:
build:
context: .
dockerfile: Dockerfile
container_name: expo-eas-android
volumes:
- ../../../:/workspace
- android_gradle:/root/.gradle
- android_sdk:/root/.android
ports:
- "8081:8081" # Metro bundler
- "19000:19000" # Expo dev server
- "19001:19001" # Expo dev server HTTPS
- "19002:19002" # Expo dev server alternate
environment:
- NODE_ENV=development
- ANDROID_HOME=/android-sdk-linux
- JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
- GRADLE_USER_HOME=/root/.gradle
- EXPO_NO_DOTENV=1
- EXPO_DEBUG=1
working_dir: /workspace
command: sleep infinity
privileged: true # Required for Android emulator if needed
devices:
- /dev/kvm # For Android emulator acceleration
volumes:
android_gradle:
android_sdk:

View File

@@ -0,0 +1,149 @@
# WebStorm Docker 开发环境设置指南
## 快速开始
### 1. 启动容器
```bash
# 进入项目目录
cd C:\Users\bwkj\WebstormProjects\loomart\apps\expo
# 启动 WebStorm 专用容器
docker-compose -f .devcontainer/docker-compose.webstorm.yml up -d
```
### 2. 在 WebStorm 中配置
#### 步骤 1: 配置 Docker 连接
1. 打开 WebStorm
2. `File``Settings``Build, Execution, Deployment``Docker`
3. 点击 `+` 添加新的 Docker 配置
4. 选择 `Docker for Windows`
5. 点击 `Test Connection` 确认连接成功
#### 步骤 2: 配置远程 Node.js 解释器
1. 在 Docker 设置中,找到运行的 `expo-eas-android-webstorm` 容器
2. 右键点击容器 → `Create...``Node.js Remote Interpreter`
3. 等待 IDE 配置完成
#### 步骤 3: 设置项目 SDK
1. `File``Settings``Languages & Frameworks``Node.js and NPM`
2. 选择刚创建的远程 Node.js 解释器
3. 点击 `Add...` 选择 `package.json` 作为项目配置
#### 步骤 4: 配置运行/调试
1. `Run``Edit Configurations...`
2. 点击 `+``Node.js`
3. 配置如下:
- **Name**: `Expo Start`
- **Node interpreter**: 选择容器中的解释器
- **JavaScript file**: `node_modules/.bin/expo`
- **Application parameters**: `start`
- **Working directory**: `/workspace`
### 3. 开始开发
#### 启动开发服务器
1. 选择刚创建的 `Expo Start` 运行配置
2. 点击绿色运行按钮或按 `Shift+F10`
3. 等待 Metro bundler 启动
#### 本地构建 APK
```bash
# 在 WebStorm 终端中运行(确保使用容器终端)
eas build --platform android --profile preview --local
```
## 常见问题解决
### 问题 1: 无法连接到 Docker 容器
**解决方案:**
1. 确保 Docker Desktop 正在运行
2. 检查防火墙设置
3. 重启 Docker Desktop
### 问题 2: Node.js 解释器无法识别
**解决方案:**
1. 确保容器正在运行
2. 检查容器中 Node.js 是否正确安装
3. 重新创建远程解释器配置
### 问题 3: 文件同步延迟
**解决方案:**
1. 检查 Docker 挂载点配置
2. 确保项目文件权限正确
3. 尝试重启容器
### 问题 4: 端口冲突
**解决方案:**
1. 检查端口是否被其他程序占用
2. 修改 `docker-compose.webstorm.yml` 中的端口映射
3. 重启容器
## 高级配置
### 自定义环境变量
`docker-compose.webstorm.yml` 中添加自定义环境变量:
```yaml
environment:
- MY_CUSTOM_VAR=value
- ANOTHER_VAR=another_value
```
### 添加额外的端口映射
```yaml
ports:
- "8081:8081"
- "19000:19000"
- "3000:3000" # 添加自定义端口
```
### 挂载额外的目录
```yaml
volumes:
- ..:/workspace:cached
- D:/my-projects:/external-projects # 添加外部目录
```
## 性能优化
### 1. 使用 Docker Desktop 的资源限制
- 分配足够的内存(建议 8GB+
- 设置合理的 CPU 核心数
### 2. 优化文件同步
- 使用 `.dockerignore` 排除不必要的文件
- 考虑使用 Docker volumes 进行缓存
### 3. 网络优化
- 使用 bridge 网络模式
- 配置合适的 DNS 设置
## 调试技巧
### 1. 查看容器日志
```bash
docker-compose -f .devcontainer/docker-compose.webstorm.yml logs -f
```
### 2. 进入容器调试
```bash
docker exec -it expo-eas-android-webstorm bash
```
### 3. 检查容器状态
```bash
docker-compose -f .devcontainer/docker-compose.webstorm.yml ps
```
## 备份和恢复
### 备份配置
- 保存 `.devcontainer` 目录
- 导出 WebStorm 配置
### 恢复环境
1. 克隆项目
2. 运行 `docker-compose up -d`
3. 重新配置 WebStorm 连接