@coze-arch/cli 0.0.1-alpha.de6c14 → 0.0.1-alpha.deaedf

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/README.md +1 -0
  2. package/lib/__templates__/expo/.coze +1 -1
  3. package/lib/__templates__/expo/.cozeproj/scripts/dev_build.sh +19 -82
  4. package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +82 -88
  5. package/lib/__templates__/expo/.cozeproj/scripts/prod_build.sh +2 -2
  6. package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +3 -4
  7. package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +46 -0
  8. package/lib/__templates__/expo/README.md +68 -7
  9. package/lib/__templates__/expo/_gitignore +1 -1
  10. package/lib/__templates__/expo/_npmrc +2 -4
  11. package/lib/__templates__/expo/client/app/+not-found.tsx +15 -64
  12. package/lib/__templates__/expo/client/app/_layout.tsx +15 -12
  13. package/lib/__templates__/expo/client/app/index.tsx +1 -0
  14. package/lib/__templates__/expo/client/app.config.ts +76 -0
  15. package/lib/__templates__/expo/client/components/Screen.tsx +3 -19
  16. package/lib/__templates__/expo/client/components/ThemedText.tsx +33 -0
  17. package/lib/__templates__/expo/client/components/ThemedView.tsx +37 -0
  18. package/lib/__templates__/expo/client/constants/theme.ts +116 -67
  19. package/lib/__templates__/expo/client/declarations.d.ts +5 -0
  20. package/lib/__templates__/expo/{eslint.config.mjs → client/eslint.config.mjs} +40 -10
  21. package/lib/__templates__/expo/client/hooks/useColorScheme.tsx +48 -0
  22. package/lib/__templates__/expo/client/hooks/useSafeRouter.ts +152 -0
  23. package/lib/__templates__/expo/client/hooks/useTheme.ts +26 -6
  24. package/lib/__templates__/expo/client/metro.config.js +124 -0
  25. package/lib/__templates__/expo/client/package.json +95 -0
  26. package/lib/__templates__/expo/client/screens/demo/index.tsx +25 -0
  27. package/lib/__templates__/expo/client/screens/demo/styles.ts +28 -0
  28. package/lib/__templates__/expo/client/scripts/install-missing-deps.js +11 -10
  29. package/lib/__templates__/expo/client/tsconfig.json +24 -0
  30. package/lib/__templates__/expo/client/utils/index.ts +22 -0
  31. package/lib/__templates__/expo/eslint-plugins/fontawesome6/index.js +9 -0
  32. package/lib/__templates__/expo/eslint-plugins/fontawesome6/names.js +1889 -0
  33. package/lib/__templates__/expo/eslint-plugins/fontawesome6/rule.js +174 -0
  34. package/lib/__templates__/expo/eslint-plugins/fontawesome6/v5-only-names.js +388 -0
  35. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/index.js +9 -0
  36. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/rule.js +112 -0
  37. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/tech.md +94 -0
  38. package/lib/__templates__/expo/eslint-plugins/react-native/index.js +9 -0
  39. package/lib/__templates__/expo/eslint-plugins/react-native/rule.js +64 -0
  40. package/lib/__templates__/expo/eslint-plugins/reanimated/index.js +9 -0
  41. package/lib/__templates__/expo/eslint-plugins/reanimated/rule.js +88 -0
  42. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/index.js +9 -0
  43. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/rule.js +120 -0
  44. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/tech.md +58 -0
  45. package/lib/__templates__/expo/package.json +11 -107
  46. package/lib/__templates__/expo/patches/expo@54.0.33.patch +45 -0
  47. package/lib/__templates__/expo/pnpm-lock.yaml +1437 -3171
  48. package/lib/__templates__/expo/pnpm-workspace.yaml +3 -0
  49. package/lib/__templates__/expo/server/build.js +21 -0
  50. package/lib/__templates__/expo/server/package.json +34 -0
  51. package/lib/__templates__/expo/server/src/index.ts +20 -0
  52. package/lib/__templates__/expo/server/tsconfig.json +24 -0
  53. package/lib/__templates__/expo/template.config.js +57 -0
  54. package/lib/__templates__/expo/tsconfig.json +1 -24
  55. package/lib/__templates__/native-static/.coze +11 -0
  56. package/lib/__templates__/native-static/index.html +33 -0
  57. package/lib/__templates__/native-static/styles/main.css +136 -0
  58. package/lib/__templates__/native-static/template.config.js +22 -0
  59. package/lib/__templates__/nextjs/.babelrc +15 -0
  60. package/lib/__templates__/nextjs/.coze +1 -0
  61. package/lib/__templates__/nextjs/README.md +5 -0
  62. package/lib/__templates__/nextjs/_npmrc +1 -0
  63. package/lib/__templates__/nextjs/eslint.config.mjs +5 -0
  64. package/lib/__templates__/nextjs/next.config.ts +11 -0
  65. package/lib/__templates__/nextjs/package.json +10 -2
  66. package/lib/__templates__/nextjs/pnpm-lock.yaml +3488 -1569
  67. package/lib/__templates__/nextjs/scripts/build.sh +4 -1
  68. package/lib/__templates__/nextjs/scripts/dev.sh +8 -2
  69. package/lib/__templates__/nextjs/scripts/prepare.sh +9 -0
  70. package/lib/__templates__/nextjs/scripts/start.sh +7 -1
  71. package/lib/__templates__/nextjs/src/app/globals.css +10 -2
  72. package/lib/__templates__/nextjs/src/app/layout.tsx +5 -14
  73. package/lib/__templates__/nextjs/src/app/page.tsx +18 -49
  74. package/lib/__templates__/nextjs/src/components/ui/resizable.tsx +29 -22
  75. package/lib/__templates__/nextjs/src/components/ui/sidebar.tsx +228 -230
  76. package/lib/__templates__/nextjs/src/server.ts +35 -0
  77. package/lib/__templates__/nextjs/template.config.js +67 -2
  78. package/lib/__templates__/nextjs/tsconfig.json +1 -1
  79. package/lib/__templates__/nuxt-vue/.coze +12 -0
  80. package/lib/__templates__/nuxt-vue/README.md +73 -0
  81. package/lib/__templates__/nuxt-vue/_gitignore +24 -0
  82. package/lib/__templates__/nuxt-vue/_npmrc +23 -0
  83. package/lib/__templates__/nuxt-vue/app/app.vue +6 -0
  84. package/lib/__templates__/nuxt-vue/app/pages/index.vue +23 -0
  85. package/lib/__templates__/nuxt-vue/assets/css/main.css +24 -0
  86. package/lib/__templates__/nuxt-vue/nuxt.config.ts +116 -0
  87. package/lib/__templates__/nuxt-vue/package.json +35 -0
  88. package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +8759 -0
  89. package/lib/__templates__/nuxt-vue/postcss.config.mjs +8 -0
  90. package/lib/__templates__/nuxt-vue/public/favicon.ico +0 -0
  91. package/lib/__templates__/nuxt-vue/public/robots.txt +2 -0
  92. package/lib/__templates__/nuxt-vue/scripts/build.sh +14 -0
  93. package/lib/__templates__/nuxt-vue/scripts/dev.sh +39 -0
  94. package/lib/__templates__/nuxt-vue/scripts/prepare.sh +14 -0
  95. package/lib/__templates__/nuxt-vue/scripts/start.sh +21 -0
  96. package/lib/__templates__/nuxt-vue/server/api/hello.ts +10 -0
  97. package/lib/__templates__/nuxt-vue/server/middleware/logger.ts +10 -0
  98. package/lib/__templates__/nuxt-vue/server/routes/health.ts +10 -0
  99. package/lib/__templates__/nuxt-vue/tailwind.config.js +13 -0
  100. package/lib/__templates__/nuxt-vue/template.config.js +87 -0
  101. package/lib/__templates__/nuxt-vue/tsconfig.json +18 -0
  102. package/lib/__templates__/taro/.coze +14 -0
  103. package/lib/__templates__/taro/.cozeproj/scripts/deploy_build.sh +19 -0
  104. package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.sh +14 -0
  105. package/lib/__templates__/taro/.cozeproj/scripts/dev_build.sh +2 -0
  106. package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +151 -0
  107. package/lib/__templates__/taro/.cozeproj/scripts/init_env.sh +5 -0
  108. package/lib/__templates__/taro/.cozeproj/scripts/pack.sh +24 -0
  109. package/lib/__templates__/taro/README.md +763 -0
  110. package/lib/__templates__/taro/_gitignore +40 -0
  111. package/lib/__templates__/taro/_npmrc +18 -0
  112. package/lib/__templates__/taro/babel.config.js +12 -0
  113. package/lib/__templates__/taro/config/dev.ts +9 -0
  114. package/lib/__templates__/taro/config/index.ts +237 -0
  115. package/lib/__templates__/taro/config/prod.ts +34 -0
  116. package/lib/__templates__/taro/eslint.config.mjs +135 -0
  117. package/lib/__templates__/taro/key/private.appid.key +0 -0
  118. package/lib/__templates__/taro/package.json +112 -0
  119. package/lib/__templates__/taro/patches/@tarojs__plugin-mini-ci@4.1.9.patch +30 -0
  120. package/lib/__templates__/taro/pnpm-lock.yaml +23412 -0
  121. package/lib/__templates__/taro/pnpm-workspace.yaml +2 -0
  122. package/lib/__templates__/taro/project.config.json +15 -0
  123. package/lib/__templates__/taro/server/nest-cli.json +10 -0
  124. package/lib/__templates__/taro/server/package.json +40 -0
  125. package/lib/__templates__/taro/server/src/app.controller.ts +23 -0
  126. package/lib/__templates__/taro/server/src/app.module.ts +10 -0
  127. package/lib/__templates__/taro/server/src/app.service.ts +8 -0
  128. package/lib/__templates__/taro/server/src/interceptors/http-status.interceptor.ts +23 -0
  129. package/lib/__templates__/taro/server/src/main.ts +49 -0
  130. package/lib/__templates__/taro/server/tsconfig.json +24 -0
  131. package/lib/__templates__/taro/src/app.config.ts +11 -0
  132. package/lib/__templates__/taro/src/app.css +156 -0
  133. package/lib/__templates__/taro/src/app.tsx +9 -0
  134. package/lib/__templates__/taro/src/components/ui/accordion.tsx +159 -0
  135. package/lib/__templates__/taro/src/components/ui/alert-dialog.tsx +260 -0
  136. package/lib/__templates__/taro/src/components/ui/alert.tsx +60 -0
  137. package/lib/__templates__/taro/src/components/ui/aspect-ratio.tsx +36 -0
  138. package/lib/__templates__/taro/src/components/ui/avatar.tsx +84 -0
  139. package/lib/__templates__/taro/src/components/ui/badge.tsx +37 -0
  140. package/lib/__templates__/taro/src/components/ui/breadcrumb.tsx +117 -0
  141. package/lib/__templates__/taro/src/components/ui/button-group.tsx +83 -0
  142. package/lib/__templates__/taro/src/components/ui/button.tsx +67 -0
  143. package/lib/__templates__/taro/src/components/ui/calendar.tsx +394 -0
  144. package/lib/__templates__/taro/src/components/ui/card.tsx +108 -0
  145. package/lib/__templates__/taro/src/components/ui/carousel.tsx +228 -0
  146. package/lib/__templates__/taro/src/components/ui/checkbox.tsx +58 -0
  147. package/lib/__templates__/taro/src/components/ui/code-block.tsx +169 -0
  148. package/lib/__templates__/taro/src/components/ui/collapsible.tsx +71 -0
  149. package/lib/__templates__/taro/src/components/ui/command.tsx +385 -0
  150. package/lib/__templates__/taro/src/components/ui/context-menu.tsx +614 -0
  151. package/lib/__templates__/taro/src/components/ui/dialog.tsx +256 -0
  152. package/lib/__templates__/taro/src/components/ui/drawer.tsx +192 -0
  153. package/lib/__templates__/taro/src/components/ui/dropdown-menu.tsx +561 -0
  154. package/lib/__templates__/taro/src/components/ui/field.tsx +228 -0
  155. package/lib/__templates__/taro/src/components/ui/hover-card.tsx +282 -0
  156. package/lib/__templates__/taro/src/components/ui/input-group.tsx +197 -0
  157. package/lib/__templates__/taro/src/components/ui/input-otp.tsx +136 -0
  158. package/lib/__templates__/taro/src/components/ui/input.tsx +56 -0
  159. package/lib/__templates__/taro/src/components/ui/label.tsx +24 -0
  160. package/lib/__templates__/taro/src/components/ui/menubar.tsx +595 -0
  161. package/lib/__templates__/taro/src/components/ui/navigation-menu.tsx +264 -0
  162. package/lib/__templates__/taro/src/components/ui/pagination.tsx +118 -0
  163. package/lib/__templates__/taro/src/components/ui/popover.tsx +291 -0
  164. package/lib/__templates__/taro/src/components/ui/portal.tsx +19 -0
  165. package/lib/__templates__/taro/src/components/ui/progress.tsx +28 -0
  166. package/lib/__templates__/taro/src/components/ui/radio-group.tsx +64 -0
  167. package/lib/__templates__/taro/src/components/ui/resizable.tsx +346 -0
  168. package/lib/__templates__/taro/src/components/ui/scroll-area.tsx +34 -0
  169. package/lib/__templates__/taro/src/components/ui/select.tsx +438 -0
  170. package/lib/__templates__/taro/src/components/ui/separator.tsx +30 -0
  171. package/lib/__templates__/taro/src/components/ui/sheet.tsx +262 -0
  172. package/lib/__templates__/taro/src/components/ui/skeleton.tsx +17 -0
  173. package/lib/__templates__/taro/src/components/ui/slider.tsx +203 -0
  174. package/lib/__templates__/taro/src/components/ui/sonner.tsx +1 -0
  175. package/lib/__templates__/taro/src/components/ui/switch.tsx +55 -0
  176. package/lib/__templates__/taro/src/components/ui/table.tsx +142 -0
  177. package/lib/__templates__/taro/src/components/ui/tabs.tsx +114 -0
  178. package/lib/__templates__/taro/src/components/ui/textarea.tsx +54 -0
  179. package/lib/__templates__/taro/src/components/ui/toast.tsx +517 -0
  180. package/lib/__templates__/taro/src/components/ui/toggle-group.tsx +120 -0
  181. package/lib/__templates__/taro/src/components/ui/toggle.tsx +77 -0
  182. package/lib/__templates__/taro/src/components/ui/tooltip.tsx +455 -0
  183. package/lib/__templates__/taro/src/index.html +39 -0
  184. package/lib/__templates__/taro/src/lib/hooks/use-keyboard-offset.ts +37 -0
  185. package/lib/__templates__/taro/src/lib/measure.ts +115 -0
  186. package/lib/__templates__/taro/src/lib/platform.ts +12 -0
  187. package/lib/__templates__/taro/src/lib/utils.ts +6 -0
  188. package/lib/__templates__/taro/src/network.ts +39 -0
  189. package/lib/__templates__/taro/src/pages/index/index.config.ts +3 -0
  190. package/lib/__templates__/taro/src/pages/index/index.css +1 -0
  191. package/lib/__templates__/taro/src/pages/index/index.tsx +33 -0
  192. package/lib/__templates__/taro/src/presets/dev-debug.ts +23 -0
  193. package/lib/__templates__/taro/src/presets/h5-container.tsx +15 -0
  194. package/lib/__templates__/taro/src/presets/h5-navbar.tsx +238 -0
  195. package/lib/__templates__/taro/src/presets/h5-styles.ts +220 -0
  196. package/lib/__templates__/taro/src/presets/index.tsx +18 -0
  197. package/lib/__templates__/taro/stylelint.config.mjs +4 -0
  198. package/lib/__templates__/taro/template.config.js +68 -0
  199. package/lib/__templates__/taro/tsconfig.json +29 -0
  200. package/lib/__templates__/taro/types/global.d.ts +32 -0
  201. package/lib/__templates__/templates.json +136 -43
  202. package/lib/__templates__/vite/.coze +1 -0
  203. package/lib/__templates__/vite/README.md +190 -11
  204. package/lib/__templates__/vite/_gitignore +1 -0
  205. package/lib/__templates__/vite/_npmrc +1 -0
  206. package/lib/__templates__/vite/eslint.config.mjs +14 -0
  207. package/lib/__templates__/vite/package.json +22 -2
  208. package/lib/__templates__/vite/pnpm-lock.yaml +2398 -182
  209. package/lib/__templates__/vite/scripts/build.sh +4 -1
  210. package/lib/__templates__/vite/scripts/dev.sh +9 -2
  211. package/lib/__templates__/vite/scripts/prepare.sh +9 -0
  212. package/lib/__templates__/vite/scripts/start.sh +9 -3
  213. package/lib/__templates__/vite/server/routes/index.ts +31 -0
  214. package/lib/__templates__/vite/server/server.ts +65 -0
  215. package/lib/__templates__/vite/server/vite.ts +67 -0
  216. package/lib/__templates__/vite/src/main.ts +17 -48
  217. package/lib/__templates__/vite/template.config.js +67 -6
  218. package/lib/__templates__/vite/tsconfig.json +4 -3
  219. package/lib/__templates__/vite/vite.config.ts +5 -0
  220. package/lib/cli.js +1084 -225
  221. package/package.json +12 -4
  222. package/lib/__templates__/expo/app.json +0 -63
  223. package/lib/__templates__/expo/babel.config.js +0 -19
  224. package/lib/__templates__/expo/client/app/(tabs)/_layout.tsx +0 -43
  225. package/lib/__templates__/expo/client/app/(tabs)/home.tsx +0 -1
  226. package/lib/__templates__/expo/client/app/(tabs)/index.tsx +0 -7
  227. package/lib/__templates__/expo/client/hooks/useColorScheme.ts +0 -1
  228. package/lib/__templates__/expo/client/index.js +0 -12
  229. package/lib/__templates__/expo/client/screens/home/index.tsx +0 -51
  230. package/lib/__templates__/expo/client/screens/home/styles.ts +0 -60
  231. package/lib/__templates__/expo/metro.config.js +0 -51
  232. package/lib/__templates__/expo/src/index.ts +0 -12
  233. package/lib/__templates__/nextjs/.vscode/settings.json +0 -121
  234. package/lib/__templates__/vite/.vscode/settings.json +0 -7
  235. /package/lib/__templates__/expo/{eslint-formatter-simple.mjs → client/eslint-formatter-simple.mjs} +0 -0
package/README.md CHANGED
@@ -14,6 +14,7 @@ Coze Coding 的项目模板引擎,提供基于前端技术栈的项目初始
14
14
 
15
15
  ```bash
16
16
  rush update
17
+
17
18
  ```
18
19
 
19
20
  ## 使用
@@ -9,4 +9,4 @@ run = ["bash", ".cozeproj/scripts/dev_run.sh"]
9
9
  [deploy]
10
10
  build = ["bash", ".cozeproj/scripts/prod_build.sh"]
11
11
  run = ["bash", ".cozeproj/scripts/prod_run.sh"]
12
- build_app_dir = "."
12
+ build_app_dir = "./client"
@@ -2,108 +2,45 @@
2
2
  if [ -z "${BASH_VERSION:-}" ]; then exec /usr/bin/env bash "$0" "$@"; fi
3
3
  set -euo pipefail
4
4
  ROOT_DIR="$(pwd)"
5
- PREVIEW_DIR="${COZE_PREVIEW_DIR:-$ROOT_DIR}"
6
- LOG_DIR="${COZE_LOG_DIR:-$ROOT_DIR/logs}"
7
- LOG_FILE="$LOG_DIR/app.log"
8
- mkdir -p "$LOG_DIR"
5
+ PREVIEW_DIR="${COZE_PREVIEW_DIR:-/source/preview}"
9
6
 
10
7
  # ==================== 配置项 ====================
11
8
  SERVER_DIR="app"
12
9
  EXPO_DIR="expo"
13
10
  CHECK_HASH_SCRIPT="$ROOT_DIR/check_hash.py"
14
- # ==================== 工具函数 ====================
15
- info() {
16
- echo -e "\033[32m[INFO] $1\033[0m"
17
- }
18
- warn() {
19
- echo -e "\033[33m[WARN] $1\033[0m"
20
- }
21
- error() {
22
- echo -e "\033[31m[ERROR] $1\033[0m"
23
- exit 1
24
- }
11
+
25
12
  check_command() {
26
13
  if ! command -v "$1" &> /dev/null; then
27
- error "命令 $1 未找到,请先安装"
14
+ echo "error:命令 $1 未找到,请先安装"
28
15
  fi
29
16
  }
30
- write_log() {
31
- local level="${1:-INFO}"
32
- local msg="${2:-}"
33
- node -e '
34
- const fs=require("fs");
35
- const path=process.argv[1];
36
- const level=(process.argv[2]||"").toUpperCase();
37
- let msg=String(process.argv[3]||"");
38
- const ts=Date.now();
39
- const dt=new Date();
40
- const parts=new Intl.DateTimeFormat("en-GB",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:false}).formatToParts(dt);
41
- const o={};
42
- for(const p of parts){o[p.type]=p.value}
43
- const dt_str=`${o.year}-${o.month}-${o.day} ${o.hour}:${o.minute}:${o.second}`;
44
- msg=msg.replace(/\\n/g,"\n");
45
- msg=`${dt_str} [${level}] ${msg}`;
46
- const record=JSON.stringify({level, message: msg, timestamp: ts},null,0);
47
- const fd=fs.openSync(path,"a");
48
- fs.writeSync(fd, record+"\n", null, "utf8");
49
- fs.fsyncSync(fd);
50
- fs.closeSync(fd);
51
- ' "$LOG_FILE" "$level" "$msg"
52
- }
53
17
 
54
- # ==================== 前置检查 ====================
55
- write_log "INFO" "==================== 开始构建 ===================="
18
+ echo "==================== 开始构建 ===================="
56
19
 
57
- write_log "INFO" "检查根目录 pre_install.py"
20
+ echo "检查根目录 pre_install.py"
58
21
  if [ -f "$PREVIEW_DIR/pre_install.py" ]; then
59
- write_log "INFO" "执行:python $PREVIEW_DIR/pre_install.py"
60
- python "$PREVIEW_DIR/pre_install.py" || write_log "ERROR" "pre_install.py 执行失败"
22
+ echo "执行:python $PREVIEW_DIR/pre_install.py"
23
+ python "$PREVIEW_DIR/pre_install.py" || echo "pre_install.py 执行失败"
61
24
  fi
62
25
 
63
- write_log "INFO" "开始执行构建脚本(build_dev.sh)..."
64
- write_log "INFO" "正在检查依赖命令是否存在..."
26
+ echo "开始执行构建脚本(build_dev.sh)..."
27
+ echo "正在检查依赖命令是否存在..."
65
28
  # 检查核心命令
66
- # check_command "pip"
67
- # check_command "python"
68
29
  check_command "pnpm"
69
30
  check_command "npm"
70
31
 
71
- # ==================== 步骤 1:安装项目依赖 ====================
72
- write_log "INFO" "==================== 安装项目依赖 ===================="
32
+ echo "==================== 安装项目依赖 ===================="
73
33
  if [ ! -f "package.json" ]; then
74
- write_log "ERROR" "项目目录下无 package.json,不是合法的 Node.js 项目"
75
- fi
76
- # 步骤 2.1/2.2:安装 Expo 项目依赖(按哈希变化执行)
77
- if [ -f "$CHECK_HASH_SCRIPT" ]; then
78
- write_log "INFO" "检测 package.json 哈希是否变化"
79
- set +e
80
- python "$CHECK_HASH_SCRIPT" --config "package.json" --check
81
- rc_node=$?
82
- set -e
83
- if [ $rc_node -eq 1 ]; then
84
- write_log "INFO" "依赖哈希已变化,执行:pnpm install"
85
- pnpm install --registry=https://registry.npmmirror.com || write_log "ERROR" "Expo 项目依赖安装失败(pnpm 执行出错)"
86
-
87
- write_log "INFO" "依赖哈希已变化,执行:npm run install-missing"
88
- npm run install-missing || write_log "ERROR" "npm run install-missing 执行失败,请检查 package.json 中的脚本配置"
89
-
90
- set +e
91
- python "$CHECK_HASH_SCRIPT" --config "package.json" --update
92
- set -e
93
- else
94
- write_log "INFO" "跳过 pnpm install 与 npm run install-missing"
95
- fi
96
- else
97
- write_log "WARN" "未找到 check_hash.py,默认执行:pnpm install 与 npm run install-missing"
98
- pnpm install --registry=https://registry.npmmirror.com || write_log "ERROR" "Expo 项目依赖安装失败(pnpm 执行出错)"
99
- npm run install-missing || write_log "ERROR" "npm run install-missing 执行失败,请检查 package.json 中的脚本配置"
34
+ echo "项目目录下无 package.json,不是合法的 Node.js 项目"
100
35
  fi
36
+ # 步骤 2.1/2.2:安装项目依赖
37
+ pnpm install --registry=https://registry.npmmirror.com || echo "Expo 项目依赖安装失败(pnpm 执行出错)"
101
38
 
102
- write_log "INFO" "检查根目录 post_install.py"
103
- if [ -f "$ROOT_DIR/post_install.py" ]; then
104
- write_log "INFO" "执行:python $ROOT_DIR/post_install.py"
105
- python "$ROOT_DIR/post_install.py" || write_log "ERROR" "post_install.py 执行失败"
39
+ echo "检查根目录 post_install.py"
40
+ if [ -f "$PREVIEW_DIR/post_install.py" ]; then
41
+ echo "执行:python $PREVIEW_DIR/post_install.py"
42
+ python "$PREVIEW_DIR/post_install.py" || echo "post_install.py 执行失败"
106
43
  fi
107
44
 
108
- write_log "INFO" "==================== 依赖安装完成!====================\n"
109
- write_log "INFO" "下一步:执行 ./deploy_run.sh 启动服务"
45
+ echo "==================== 依赖安装完成!====================\n"
46
+ echo "下一步:执行 ./deploy_run.sh 启动服务"
@@ -1,7 +1,7 @@
1
- ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
2
- PREVIEW_DIR="${COZE_PREVIEW_DIR:-$ROOT_DIR}"
1
+ ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
2
+ PREVIEW_DIR="${COZE_PREVIEW_DIR:-/source/preview}"
3
3
  LOG_DIR="${COZE_LOG_DIR:-$ROOT_DIR/logs}"
4
- LOG_FILE="$LOG_DIR/app.log"
4
+ LOG_CLIENT_FILE="$LOG_DIR/client.log"
5
5
  mkdir -p "$LOG_DIR"
6
6
 
7
7
  # ==================== 配置项 ====================
@@ -15,27 +15,18 @@ EXPO_PORT="5000"
15
15
  WEB_URL="${COZE_PROJECT_DOMAIN_DEFAULT:-http://127.0.0.1:${SERVER_PORT}}"
16
16
  ASSUME_YES="1"
17
17
  EXPO_PUBLIC_BACKEND_BASE_URL="${EXPO_PUBLIC_BACKEND_BASE_URL:-$WEB_URL}"
18
-
18
+ EXPO_PUBLIC_COZE_PROJECT_ID="${COZE_PROJECT_ID:-}"
19
19
 
20
20
  EXPO_PACKAGER_PROXY_URL="${EXPO_PUBLIC_BACKEND_BASE_URL}"
21
- export EXPO_PUBLIC_BACKEND_BASE_URL EXPO_PACKAGER_PROXY_URL
21
+ export EXPO_PUBLIC_BACKEND_BASE_URL EXPO_PACKAGER_PROXY_URL EXPO_PUBLIC_COZE_PROJECT_ID
22
22
  # 运行时变量(为避免 set -u 的未绑定错误,预置为空)
23
23
  SERVER_PID=""
24
24
  EXPO_PID=""
25
+
25
26
  # ==================== 工具函数 ====================
26
- info() {
27
- echo -e "\033[32m[INFO] $1\033[0m"
28
- }
29
- warn() {
30
- echo -e "\033[33m[WARN] $1\033[0m"
31
- }
32
- error() {
33
- echo -e "\033[31m[ERROR] $1\033[0m"
34
- exit 1
35
- }
36
27
  check_command() {
37
28
  if ! command -v "$1" &> /dev/null; then
38
- error "命令 $1 未找到,请先安装"
29
+ echo "error:命令 $1 未找到,请先安装"
39
30
  fi
40
31
  }
41
32
  while [ $# -gt 0 ]; do
@@ -64,10 +55,10 @@ ensure_port() {
64
55
  local var_name=$1
65
56
  local port_val=$2
66
57
  if is_port_free "$port_val"; then
67
- info "端口未占用:$port_val"
58
+ echo "端口未占用:$port_val"
68
59
  eval "$var_name=$port_val"
69
60
  else
70
- warn "端口已占用:$port_val"
61
+ echo "端口已占用:$port_val"
71
62
  local choice
72
63
  if [ "$ASSUME_YES" = "1" ]; then choice="Y"; else read -r -p "是否关闭该端口的进程?[Y/n] " choice || choice="Y"; fi
73
64
  if [ -z "$choice" ] || [ "$choice" = "y" ] || [ "$choice" = "Y" ]; then
@@ -75,15 +66,15 @@ ensure_port() {
75
66
  local pids
76
67
  pids=$(lsof -t -i tcp:"$port_val" -sTCP:LISTEN 2>/dev/null || true)
77
68
  if [ -n "$pids" ]; then
78
- info "正在关闭进程:$pids"
79
- kill -9 $pids 2>/dev/null || warn "关闭进程失败:$pids"
69
+ echo "正在关闭进程:$pids"
70
+ kill -9 $pids 2>/dev/null || echo "关闭进程失败:$pids"
80
71
  eval "$var_name=$port_val"
81
72
  else
82
- warn "未获取到占用该端口的进程"
73
+ echo "未获取到占用该端口的进程"
83
74
  eval "$var_name=$port_val"
84
75
  fi
85
76
  else
86
- warn "缺少 lsof,无法自动关闭进程"
77
+ echo "缺少 lsof,无法自动关闭进程"
87
78
  eval "$var_name=$port_val"
88
79
  fi
89
80
  else
@@ -95,28 +86,21 @@ ensure_port() {
95
86
  fi
96
87
  }
97
88
 
98
- write_log() {
99
- local level="${1:-INFO}"
100
- local msg="${2:-}"
101
- node -e '
102
- const fs=require("fs");
103
- const path=process.argv[1];
104
- const level=(process.argv[2]||"").toUpperCase();
105
- let msg=String(process.argv[3]||"");
106
- const ts=Date.now();
107
- msg=msg.replace(/\\n/g,"\n");
108
- const dt=new Date();
109
- const parts=new Intl.DateTimeFormat("en-GB",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:false}).formatToParts(dt);
110
- const o={};
111
- for(const p of parts){o[p.type]=p.value}
112
- const dt_str=`${o.year}-${o.month}-${o.day} ${o.hour}:${o.minute}:${o.second}`;
113
- msg=`${dt_str} [${level}] ${msg}`;
114
- const record=JSON.stringify({level, message: msg, timestamp: ts},null,0);
115
- const fd=fs.openSync(path,"a");
116
- fs.writeSync(fd, record+"\n", null, "utf8");
117
- fs.fsyncSync(fd);
118
- fs.closeSync(fd);
119
- ' "$LOG_FILE" "$level" "$msg"
89
+ pipe_to_log() {
90
+ local source="${1:-CLIENT}"
91
+ local raw_log="${2:-}"
92
+ local line clean_line timestamp
93
+ while IFS= read -r line || [ -n "$line" ]; do
94
+ clean_line=$(printf '%s' "$line" | sed 's/\x1b\[[0-9;]*[mA-Za-z]//g')
95
+ if echo "$clean_line" | grep -qE '(^(Web|iOS|Android) node_modules/.*expo-router.*entry\.js.*%|^(Web|iOS|Android) Bundled [0-9]+ms node_modules/.*expo-router.*entry\.js|Logs will appear in the browser)'; then
96
+ continue
97
+ fi
98
+ if [ -n "$raw_log" ]; then
99
+ timestamp=$(date '+%Y-%m-%d %H:%M:%S')
100
+ echo "[$timestamp] $clean_line" >> "$raw_log"
101
+ fi
102
+ printf '[%s] %s\n' "$source" "$clean_line"
103
+ done
120
104
  }
121
105
 
122
106
  wait_port_connectable() {
@@ -130,21 +114,28 @@ wait_port_connectable() {
130
114
 
131
115
  start_expo() {
132
116
  local offline="${1:-0}"
117
+
118
+ pushd "$ROOT_DIR/client"
119
+
133
120
  if [ "$offline" = "1" ]; then
134
- EXPO_OFFLINE=1 EXPO_NO_DOCTOR=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" nohup npx expo start --port "$EXPO_PORT" > logs/expo.log 2>&1 &
121
+ ( EXPO_OFFLINE=1 EXPO_NO_DEPENDENCY_VALIDATION=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" EXPO_PUBLIC_COZE_PROJECT_ID="$EXPO_PUBLIC_COZE_PROJECT_ID" \
122
+ nohup npx expo start --clear --port "$EXPO_PORT" 2>&1 | pipe_to_log "CLIENT" "$LOG_CLIENT_FILE" ) &
135
123
  else
136
- EXPO_NO_DOCTOR=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" nohup npx expo start --port "$EXPO_PORT" > logs/expo.log 2>&1 &
124
+ ( EXPO_NO_DEPENDENCY_VALIDATION=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" EXPO_PUBLIC_COZE_PROJECT_ID="$EXPO_PUBLIC_COZE_PROJECT_ID" \
125
+ nohup npx expo start --clear --port "$EXPO_PORT" 2>&1 | pipe_to_log "CLIENT" "$LOG_CLIENT_FILE" ) &
137
126
  fi
138
127
  EXPO_PID=$!
139
- echo "$EXPO_PID"
128
+ disown $EXPO_PID 2>/dev/null || true
129
+
130
+ popd
140
131
  }
141
132
 
142
133
  detect_expo_fetch_failed() {
143
134
  local timeout="${1:-8}"
144
135
  local waited=0
145
- local log_file="logs/expo.log"
136
+ local log_file="$LOG_CLIENT_FILE"
146
137
  while [ "$waited" -lt "$timeout" ]; do
147
- if [ -f "$log_file" ] && grep -q "TypeError: fetch failed" "$log_file" 2>/dev/null; then
138
+ if [ -f "$log_file" ] && tail -n 100 "$log_file" 2>/dev/null | grep -q "TypeError: fetch failed"; then
148
139
  return 0
149
140
  fi
150
141
  sleep 1
@@ -157,79 +148,82 @@ detect_expo_fetch_failed() {
157
148
  # 关掉nginx进程
158
149
  ps -ef | grep nginx | grep -v grep | awk '{print $2}' | xargs -r kill -9
159
150
 
160
- write_log "INFO" "检查根目录 pre_install.py"
151
+ echo "检查根目录 pre_install.py"
161
152
  if [ -f "$PREVIEW_DIR/pre_install.py" ]; then
162
- write_log "INFO" "执行:python $PREVIEW_DIR/pre_install.py"
163
- python "$PREVIEW_DIR/pre_install.py" || write_log "ERROR" "pre_install.py 执行失败"
153
+ echo "执行:python $PREVIEW_DIR/pre_install.py"
154
+ python "$PREVIEW_DIR/pre_install.py" || echo "pre_install.py 执行失败"
155
+ fi
156
+
157
+ echo "检查根目录 post_install.py"
158
+ if [ -f "$PREVIEW_DIR/post_install.py" ]; then
159
+ echo "执行:python $PREVIEW_DIR/post_install.py"
160
+ python "$PREVIEW_DIR/post_install.py" || echo "post_install.py 执行失败"
164
161
  fi
165
162
 
166
- write_log "INFO" "==================== 开始启动 ===================="
167
- write_log "INFO" "开始执行服务启动脚本(start_dev.sh)..."
168
- write_log "INFO" "正在检查依赖命令和目录是否存在..."
163
+ echo "==================== 开始启动 ===================="
164
+ echo "开始执行服务启动脚本(start_dev.sh)..."
165
+ echo "正在检查依赖命令和目录是否存在..."
169
166
  # 检查核心命令
170
- # check_command "python"
171
167
  check_command "npm"
172
168
  check_command "pnpm"
173
169
  check_command "lsof"
174
170
  check_command "bash"
175
171
 
176
- info "准备日志目录:logs"
177
- mkdir -p logs
178
172
  # 端口占用预检查与处理
179
173
  ensure_port SERVER_PORT "$SERVER_PORT"
180
174
  ensure_port EXPO_PORT "$EXPO_PORT"
181
175
 
182
- # ==================== 启动 Server 服务 ====================
183
- write_log "INFO" "==================== 启动 server 服务 ===================="
184
- write_log "INFO" "正在执行:npm run server"
185
- PORT="$SERVER_PORT" nohup npm run server > logs/app.log 2>&1 &
176
+ echo "==================== 启动 server 服务 ===================="
177
+ echo "正在执行:pnpm run dev (server)"
178
+ ( pushd "$ROOT_DIR/server" > /dev/null && SERVER_PORT="$SERVER_PORT" nohup pnpm run dev; popd > /dev/null ) &
186
179
  SERVER_PID=$!
180
+ disown $SERVER_PID 2>/dev/null || true
187
181
  if [ -z "${SERVER_PID}" ]; then
188
- write_log "ERROR" "无法获取 server 后台进程 PID"
182
+ echo "无法获取 server 后台进程 PID"
189
183
  fi
190
- write_log "INFO" "server 服务已启动,进程 ID:${SERVER_PID:-unknown}"
184
+ echo "server 服务已启动,进程 ID:${SERVER_PID:-unknown}"
191
185
 
192
- write_log "INFO" "==================== 启动 Expo 项目 ===================="
193
- write_log "INFO" "正在执行:npx expo start --port ${EXPO_PORT}"
194
- write_log "INFO" "开始启动 Expo 服务"
195
- EXPO_PID=$(start_expo 0)
186
+ echo "==================== 启动 Expo 项目 ===================="
187
+ echo "开始启动 Expo 服务,端口 ${EXPO_PORT}"
188
+ start_expo 0
196
189
  if detect_expo_fetch_failed 8; then
197
- write_log "WARN" "Expo 启动检测到网络错误:TypeError: fetch failed,启用离线模式重试"
190
+ echo "Expo 启动检测到网络错误:TypeError: fetch failed,启用离线模式重试"
198
191
  if [ -n "${EXPO_PID}" ]; then kill -9 "$EXPO_PID" 2>/dev/null || true; fi
199
- : > logs/expo.log
200
- EXPO_PID=$(start_expo 1)
192
+ : > "$ROOT_DIR/logs/client.log"
193
+ start_expo 1
201
194
  fi
202
195
  # 输出以下环境变量,确保 Expo 项目能正确连接到 Server 服务
203
- write_log "INFO" "Expo 环境变量配置:"
204
- write_log "INFO" "EXPO_PUBLIC_BACKEND_BASE_URL=${EXPO_PUBLIC_BACKEND_BASE_URL}"
205
- write_log "INFO" "EXPO_PACKAGER_PROXY_URL=${EXPO_PACKAGER_PROXY_URL}"
196
+ echo "Expo 环境变量配置:"
197
+ echo "EXPO_PUBLIC_BACKEND_BASE_URL=${EXPO_PUBLIC_BACKEND_BASE_URL}"
198
+ echo "EXPO_PACKAGER_PROXY_URL=${EXPO_PACKAGER_PROXY_URL}"
199
+ echo "EXPO_PUBLIC_COZE_PROJECT_ID=${EXPO_PUBLIC_COZE_PROJECT_ID}"
206
200
  if [ -z "${EXPO_PID}" ]; then
207
- write_log "ERROR" "无法获取 Expo 后台进程 PID"
201
+ echo "无法获取 Expo 后台进程 PID"
208
202
  fi
209
203
 
210
- write_log "INFO" "所有服务已启动。Server PID: ${SERVER_PID}, Expo PID: ${EXPO_PID}"
204
+ echo "所有服务已启动。Server PID: ${SERVER_PID}, Expo PID: ${EXPO_PID}"
211
205
 
212
- write_log "INFO" "检查 Server 服务端口:$SERVER_HOST:$SERVER_PORT"
206
+ echo "检查 Server 服务端口:$SERVER_HOST:$SERVER_PORT"
213
207
  if wait_port_connectable "$SERVER_HOST" "$SERVER_PORT" 10 2; then
214
- write_log "INFO" "端口可连接:$SERVER_HOST:$SERVER_PORT"
208
+ echo "端口可连接:$SERVER_HOST:$SERVER_PORT"
215
209
  else
216
- write_log "WARN" "端口不可连接:$SERVER_HOST:$SERVER_PORT 10 次)"
210
+ echo "端口不可连接:$SERVER_HOST:$SERVER_PORT 10 次)"
217
211
  fi
218
212
 
219
- write_log "INFO" "检查 Expo 服务端口:$EXPO_HOST:$EXPO_PORT"
213
+ echo "检查 Expo 服务端口:$EXPO_HOST:$EXPO_PORT"
220
214
  if wait_port_connectable "$EXPO_HOST" "$EXPO_PORT" 10 2; then
221
- write_log "INFO" "端口可连接:$EXPO_HOST:$EXPO_PORT"
215
+ echo "端口可连接:$EXPO_HOST:$EXPO_PORT"
222
216
  else
223
- write_log "WARN" "端口不可连接:$EXPO_HOST:$EXPO_PORT(已尝试 10 次)"
217
+ echo "端口不可连接:$EXPO_HOST:$EXPO_PORT(已尝试 10 次)"
224
218
  fi
225
219
 
226
- write_log "INFO" "服务端口检查完成"
220
+ echo "服务端口检查完成"
227
221
 
228
- write_log "INFO" "检查根目录 post_run.py"
222
+ echo "检查根目录 post_run.py"
229
223
  if [ -f "$ROOT_DIR/post_run.py" ]; then
230
- write_log "INFO" "启动检查中"
231
- python "$ROOT_DIR/post_run.py" --port "$EXPO_PORT" || write_log "ERROR" "post_run.py 执行失败"
232
- write_log "INFO" "启动检查结束"
224
+ echo "启动检查中"
225
+ python "$ROOT_DIR/post_run.py" --port "$EXPO_PORT" || echo "post_run.py 执行失败"
226
+ echo "启动检查结束"
233
227
  fi
234
228
 
235
- write_log "INFO" "==================== 服务启动完成 ===================="
229
+ echo "==================== 服务启动完成 ===================="
@@ -40,8 +40,8 @@ fi
40
40
  info "==================== 依赖安装完成!====================\n"
41
41
 
42
42
  info "==================== dist打包 ===================="
43
- info "开始执行:pnpm run server:build"
44
- (cd "$ROOT_DIR" && pnpm run server:build) || error "dist打包失败"
43
+ info "开始执行:pnpm run build (server)"
44
+ (pushd "$ROOT_DIR/server" > /dev/null && pnpm run build; popd > /dev/null) || error "dist打包失败"
45
45
  info "==================== dist打包完成!====================\n"
46
46
 
47
47
  info "下一步:执行 ./prod_run.sh 启动服务"
@@ -2,8 +2,7 @@
2
2
  # 产物部署使用
3
3
  set -euo pipefail
4
4
 
5
- ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
6
-
5
+ ROOT_DIR="$(pwd)"
7
6
 
8
7
  HOST="${HOST:-0.0.0.0}"
9
8
  PORT="${PORT:-5000}"
@@ -30,6 +29,6 @@ check_command() {
30
29
  check_command "pnpm"
31
30
  check_command "npm"
32
31
 
33
- info "开始执行:pnpm run server:prod"
34
- (cd "$ROOT_DIR" && PORT="$PORT" pnpm run server:prod) || error "服务启动失败"
32
+ info "开始执行:pnpm run start (server)"
33
+ (pushd "$ROOT_DIR/server" > /dev/null && PORT="$PORT" pnpm run start; popd > /dev/null) || error "服务启动失败"
35
34
  info "服务启动完成!\n"
@@ -0,0 +1,46 @@
1
+ #!/bin/bash
2
+
3
+ ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
4
+ SERVER_DIR="$ROOT_DIR/server"
5
+ LOG_DIR="${COZE_LOG_DIR:-$ROOT_DIR/logs}"
6
+ LOG_SERVER_FILE="$LOG_DIR/server.log"
7
+ SERVER_PORT="${SERVER_PORT:-9091}"
8
+
9
+ mkdir -p "$LOG_DIR"
10
+
11
+ pipe_to_log() {
12
+ local source="${1:-SERVER}"
13
+ local raw_log="${2:-}"
14
+ local line clean_line timestamp
15
+ while IFS= read -r line || [ -n "$line" ]; do
16
+ clean_line=$(printf '%s' "$line" | sed 's/\x1b\[[0-9;]*[mA-Za-z]//g')
17
+ if [ -n "$raw_log" ]; then
18
+ timestamp=$(date '+%Y-%m-%d %H:%M:%S')
19
+ echo "[$timestamp] $clean_line" >> "$raw_log"
20
+ fi
21
+ printf '[%s] %s\n' "$source" "$clean_line"
22
+ done
23
+ }
24
+
25
+ kill_old_server() {
26
+ if command -v lsof &> /dev/null; then
27
+ local pids
28
+ pids=$(lsof -t -i tcp:"$SERVER_PORT" -sTCP:LISTEN 2>/dev/null || true)
29
+ if [ -n "$pids" ]; then
30
+ echo "正在关闭旧的 server 进程:$pids"
31
+ kill -9 $pids 2>/dev/null || echo "关闭进程失败:$pids"
32
+ sleep 1
33
+ fi
34
+ fi
35
+ }
36
+
37
+ echo "==================== Server Dev Run ===================="
38
+ echo "Server 目录:$SERVER_DIR"
39
+ echo "Server 端口:$SERVER_PORT"
40
+ echo "日志文件:$LOG_SERVER_FILE"
41
+
42
+ kill_old_server
43
+
44
+ echo "启动 server 服务..."
45
+ cd "$SERVER_DIR"
46
+ NODE_ENV=development PORT="$SERVER_PORT" npx tsx watch ./src/index.ts 2>&1 | pipe_to_log "SERVER" "$LOG_SERVER_FILE"
@@ -1,13 +1,74 @@
1
- # Expo App Template
1
+ # Expo App + Express.js
2
+
3
+ ## 目录结构规范(严格遵循)
4
+
5
+ 当前仓库是一个 monorepo(基于 pnpm 的 workspace)
6
+
7
+ - Expo 代码在 client 目录,Express.js 代码在 server 目录
8
+ - 本模板默认无 Tab Bar,可按需改造
9
+
10
+ 目录结构说明
11
+
12
+ ├── server/ # 服务端代码根目录 (Express.js)
13
+ | ├── src/
14
+ │ │ └── index.ts # Express 入口文件
15
+ | └── package.json # 服务端 package.json
16
+ ├── client/ # React Native 前端代码
17
+ │ ├── app/ # Expo Router 路由目录(仅路由配置)
18
+ │ │ ├── _layout.tsx # 根布局文件(必需,务必阅读)
19
+ │ │ ├── home.tsx # 首页
20
+ │ │ └── index.tsx # re-export home.tsx
21
+ │ ├── screens/ # 页面实现目录(与 app/ 路由对应)
22
+ │ │ └── demo/ # demo 示例页面
23
+ │ │ ├── index.tsx # 页面组件实现
24
+ │ │ └── styles.ts # 页面样式
25
+ │ ├── components/ # 可复用组件
26
+ │ │ └── Screen.tsx # 页面容器组件(必用)
27
+ │ ├── hooks/ # 自定义 Hooks
28
+ │ ├── contexts/ # React Context 代码
29
+ │ ├── constants/ # 常量定义(如主题配置)
30
+ │ ├── utils/ # 工具函数
31
+ │ ├── assets/ # 静态资源
32
+ | └── package.json # Expo 应用 package.json
33
+ ├── package.json
34
+ ├── .cozeproj # 预置脚手架脚本(禁止修改)
35
+ └── .coze # 配置文件(禁止修改)
36
+
2
37
  ## 安装依赖
38
+
39
+ ### 命令
40
+
3
41
  ```bash
4
- pnpm install
42
+ pnpm i
5
43
  ```
6
- ## 启动 Metro 服务
7
- ```bash
8
- npx expo start
44
+
45
+ ### 新增依赖约束
46
+
47
+ 如果需要新增依赖,需在 client 和 server 各自的目录添加(原因:隔离前后端的依赖),禁止在根目录直接安装依赖
48
+
49
+ ### 新增依赖标准流程
50
+
51
+ - 编辑 `client/package.json` 或 `server/package.json`
52
+ - 在根目录执行 `pnpm i`
53
+
54
+ ## Expo 开发规范
55
+
56
+ ### 路径别名
57
+
58
+ Expo 配置了 `@/` 路径别名指向 `client/` 目录:
59
+
60
+ ```tsx
61
+ // 正确
62
+ import { Screen } from '@/components/Screen';
63
+
64
+ // 避免相对路径
65
+ import { Screen } from '../../../components/Screen';
9
66
  ```
10
- ## 启动 Node 服务器
67
+
68
+ ## 本地开发
69
+
70
+ 运行 coze dev 可以同时启动前端和后端服务,如果端口已占用,该命令会先杀掉占用端口的进程再启动,也可以用来重启前端和后端服务
71
+
11
72
  ```bash
12
- npm run server
73
+ coze dev
13
74
  ```
@@ -8,4 +8,4 @@ expo/expo-env.d.ts
8
8
  expo-env.d.ts
9
9
  .DS_Store
10
10
  logs/
11
- tsconfig.tsbuildinfo
11
+ *.tsbuildinfo
@@ -8,15 +8,13 @@ network-concurrency=16
8
8
  fetch-retries=3
9
9
  fetch-timeout=60000
10
10
 
11
- # 严格使用 peer dependencies
11
+ # peerDependencies
12
12
  strict-peer-dependencies=false
13
-
14
- # 自动生成 lockfile
15
13
  auto-install-peers=true
16
14
 
17
15
  # lockfile 配置
18
16
  lockfile=true
19
17
  prefer-frozen-lockfile=true
20
18
 
21
- # 如果 lockfile 存在但过期,更新而不是失败
19
+ # semver 选择最高版本
22
20
  resolution-mode=highest