@coze-arch/cli 0.1.8-alpha.7654a3 → 0.1.8-alpha.a5ed27

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 (47) hide show
  1. package/README.md +0 -18
  2. package/lib/__templates__/expo/.cozeproj/scripts/prepare-node-modules.sh +10 -178
  3. package/lib/__templates__/nextjs/.coze +1 -1
  4. package/lib/__templates__/nextjs/README.md +0 -18
  5. package/lib/__templates__/nextjs/eslint.config.mjs +1 -1
  6. package/lib/__templates__/nextjs/next.config.ts +9 -0
  7. package/lib/__templates__/nextjs/scripts/build.ps1 +1 -1
  8. package/lib/__templates__/nextjs/scripts/build.sh +2 -2
  9. package/lib/__templates__/nextjs/scripts/dev.ps1 +2 -2
  10. package/lib/__templates__/nextjs/scripts/dev.sh +55 -16
  11. package/lib/__templates__/nextjs/scripts/prepare-node-modules.sh +212 -0
  12. package/lib/__templates__/nextjs/scripts/prepare.sh +2 -10
  13. package/lib/__templates__/nextjs/scripts/validate.sh +1 -11
  14. package/lib/__templates__/nextjs/src/server.ts +1 -1
  15. package/lib/__templates__/nextjs/template.config.js +6 -20
  16. package/lib/__templates__/nextjs/tsconfig.json +1 -0
  17. package/lib/__templates__/nuxt-vue/.coze +1 -1
  18. package/lib/__templates__/nuxt-vue/README.md +2 -20
  19. package/lib/__templates__/nuxt-vue/scripts/build.sh +1 -1
  20. package/lib/__templates__/nuxt-vue/scripts/dev.sh +4 -10
  21. package/lib/__templates__/nuxt-vue/scripts/prepare-node-modules.sh +212 -0
  22. package/lib/__templates__/nuxt-vue/scripts/prepare.sh +2 -10
  23. package/lib/__templates__/nuxt-vue/scripts/validate.sh +1 -11
  24. package/lib/__templates__/taro/.coze +2 -2
  25. package/lib/__templates__/taro/.cozeproj/scripts/build-on-local-disk.sh +194 -0
  26. package/lib/__templates__/taro/.cozeproj/scripts/deploy_build.sh +1 -9
  27. package/lib/__templates__/taro/.cozeproj/scripts/dev_build.sh +1 -10
  28. package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +50 -51
  29. package/lib/__templates__/taro/.cozeproj/scripts/pack.sh +42 -13
  30. package/lib/__templates__/taro/.cozeproj/scripts/prepare-node-modules.sh +10 -178
  31. package/lib/__templates__/taro/.cozeproj/scripts/validate.sh +0 -3
  32. package/lib/__templates__/taro/package.json +5 -5
  33. package/lib/__templates__/vite/.coze +1 -1
  34. package/lib/__templates__/vite/README.md +0 -20
  35. package/lib/__templates__/vite/scripts/build.sh +1 -1
  36. package/lib/__templates__/vite/scripts/dev.sh +4 -10
  37. package/lib/__templates__/vite/scripts/prepare-node-modules.sh +212 -0
  38. package/lib/__templates__/vite/scripts/prepare.sh +2 -10
  39. package/lib/__templates__/vite/scripts/validate.sh +1 -7
  40. package/lib/__templates__/vite/template.config.js +6 -20
  41. package/lib/cli.js +184 -367
  42. package/package.json +1 -2
  43. package/lib/__templates__/nextjs/scripts/local-workspace.cjs +0 -302
  44. package/lib/__templates__/nuxt-vue/scripts/local-workspace.cjs +0 -302
  45. package/lib/__templates__/taro/.cozeproj/scripts/local-workspace.cjs +0 -351
  46. package/lib/__templates__/taro/.cozeproj/scripts/taro-build.cjs +0 -66
  47. package/lib/__templates__/vite/scripts/local-workspace.cjs +0 -302
@@ -8,7 +8,7 @@ build = ["bash", ".cozeproj/scripts/dev_build.sh"]
8
8
  build_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ".cozeproj/scripts/dev_build.ps1"]
9
9
  run = ["bash", ".cozeproj/scripts/dev_run.sh"]
10
10
  run_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ".cozeproj/scripts/dev_run.ps1"]
11
- deps = ["git", "rsync"] # -> apt install git rsync
11
+ deps = ["git"] # -> apt install git
12
12
  pack = ["bash", ".cozeproj/scripts/pack.sh"]
13
13
  pack_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", ".cozeproj/scripts/pack.ps1"]
14
14
  validate = ["bash", ".cozeproj/scripts/validate.sh"]
@@ -17,4 +17,4 @@ validate_win = ["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-
17
17
  [deploy]
18
18
  build = ["bash", ".cozeproj/scripts/deploy_build.sh"]
19
19
  run = ["bash", ".cozeproj/scripts/deploy_run.sh"]
20
- deps = ["git", "rsync"] # -> apt install git rsync
20
+ deps = ["git"] # -> apt install git
@@ -0,0 +1,194 @@
1
+ #!/usr/bin/env bash
2
+ # Run one-shot Taro builds from a local shadow workspace when the project lives
3
+ # on Coze Drive. This avoids repeated compiler stat/read traffic against the
4
+ # network filesystem while keeping final artifacts in the project directory.
5
+ set -Eeuo pipefail
6
+
7
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
8
+ ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd -P)"
9
+ PROJECT_ROOT="$(cd "${COZE_WORKSPACE_PATH:-$ROOT_DIR}" && pwd -P)"
10
+
11
+ if [ "$#" -eq 0 ]; then
12
+ set -- pnpm build
13
+ fi
14
+
15
+ is_under_root() {
16
+ local path="$1"
17
+ local root="$2"
18
+ [ -n "$root" ] || return 1
19
+ case "$path" in
20
+ "$root"|"$root"/*) return 0 ;;
21
+ *) return 1 ;;
22
+ esac
23
+ }
24
+
25
+ is_coze_drive_workspace() {
26
+ local path="$1"
27
+ local root
28
+ local candidates=()
29
+
30
+ if [ -n "${COZE_DRIVE_ROOT:-}" ]; then
31
+ candidates+=("$COZE_DRIVE_ROOT")
32
+ fi
33
+ candidates+=("/Coze/Drive")
34
+
35
+ for root in "${candidates[@]}"; do
36
+ if [ -d "$root" ]; then
37
+ root="$(cd "$root" && pwd -P)"
38
+ else
39
+ root="${root%/}"
40
+ fi
41
+ if is_under_root "$path" "$root"; then
42
+ return 0
43
+ fi
44
+ done
45
+
46
+ return 1
47
+ }
48
+
49
+ prepare_dependencies() {
50
+ if [ "${COZE_SKIP_PREPARE_NODE_MODULES:-0}" = "1" ]; then
51
+ return
52
+ fi
53
+ echo "[local-build] Preparing dependencies..."
54
+ bash "$ROOT_DIR/.cozeproj/scripts/prepare-node-modules.sh" --prefer-frozen-lockfile --prefer-offline
55
+ }
56
+
57
+ if ! is_coze_drive_workspace "$PROJECT_ROOT"; then
58
+ prepare_dependencies
59
+ cd "$PROJECT_ROOT"
60
+ "$@"
61
+ exit $?
62
+ fi
63
+
64
+ command -v rsync >/dev/null 2>&1 || {
65
+ echo "[local-build] rsync is required for Coze Drive local builds" >&2
66
+ exit 1
67
+ }
68
+
69
+ prepare_dependencies
70
+
71
+ BUILD_ROOT="${COZE_LOCAL_BUILD_ROOT:-/tmp/coze-taro-build}"
72
+ PROJECT_ID="$(basename "$PROJECT_ROOT")-$(printf '%s' "$PROJECT_ROOT" | cksum | awk '{print $1}')"
73
+ WORK_DIR="$BUILD_ROOT/$PROJECT_ID"
74
+ LOCAL_WORKSPACE="$WORK_DIR/workspace"
75
+ LOCK_DIR="$WORK_DIR.lock"
76
+
77
+ mkdir -p "$BUILD_ROOT"
78
+ if is_coze_drive_workspace "$(cd "$BUILD_ROOT" && pwd -P)"; then
79
+ echo "[local-build] COZE_LOCAL_BUILD_ROOT must not be on Coze Drive: $BUILD_ROOT" >&2
80
+ exit 1
81
+ fi
82
+
83
+ while ! mkdir "$LOCK_DIR" 2>/dev/null; do
84
+ echo "[local-build] Waiting for another local build for this project..."
85
+ sleep 1
86
+ done
87
+
88
+ cleanup() {
89
+ if [ -n "${SOURCE_SYNC_PID:-}" ]; then
90
+ kill "$SOURCE_SYNC_PID" 2>/dev/null || true
91
+ fi
92
+ rm -rf "$LOCAL_WORKSPACE"
93
+ rmdir "$WORK_DIR" 2>/dev/null || true
94
+ rmdir "$LOCK_DIR" 2>/dev/null || true
95
+ }
96
+ trap cleanup EXIT
97
+
98
+ mkdir -p "$LOCAL_WORKSPACE"
99
+
100
+ sync_source_to_local() {
101
+ rsync -rlgoD --checksum --delete \
102
+ --exclude '/.git/' \
103
+ --exclude '/node_modules/' \
104
+ --exclude '/server/node_modules/' \
105
+ --exclude '/logs/' \
106
+ --exclude '/dist/' \
107
+ --exclude '/dist-web/' \
108
+ --exclude '/dist-tt/' \
109
+ --exclude '/server/dist/' \
110
+ --exclude '/.next/' \
111
+ --exclude '/.nuxt/' \
112
+ --exclude '/.output/' \
113
+ --exclude '/coverage/' \
114
+ "$PROJECT_ROOT/" "$LOCAL_WORKSPACE/"
115
+ }
116
+
117
+ echo "[local-build] Syncing source to $LOCAL_WORKSPACE"
118
+ sync_source_to_local
119
+
120
+ link_node_modules() {
121
+ local source_node_modules="$1"
122
+ local shadow_parent="$2"
123
+ local shadow_node_modules="$shadow_parent/node_modules"
124
+ local target
125
+
126
+ if [ ! -e "$source_node_modules" ] && [ ! -L "$source_node_modules" ]; then
127
+ return
128
+ fi
129
+
130
+ if [ -L "$source_node_modules" ]; then
131
+ target="$(readlink "$source_node_modules")"
132
+ else
133
+ target="$source_node_modules"
134
+ fi
135
+
136
+ mkdir -p "$shadow_parent"
137
+ rm -rf "$shadow_node_modules"
138
+ ln -s "$target" "$shadow_node_modules"
139
+ }
140
+
141
+ link_node_modules "$PROJECT_ROOT/node_modules" "$LOCAL_WORKSPACE"
142
+ for workspace in server; do
143
+ if [ -f "$PROJECT_ROOT/$workspace/package.json" ]; then
144
+ link_node_modules "$PROJECT_ROOT/$workspace/node_modules" "$LOCAL_WORKSPACE/$workspace"
145
+ fi
146
+ done
147
+
148
+ SOURCE_SYNC_PID=""
149
+ if [ "${COZE_SYNC_SOURCE_TO_LOCAL:-0}" = "1" ]; then
150
+ (
151
+ while true; do
152
+ sleep "${COZE_SYNC_INTERVAL_SECONDS:-1}"
153
+ sync_source_to_local
154
+ done
155
+ ) &
156
+ SOURCE_SYNC_PID=$!
157
+ fi
158
+
159
+ rm -rf \
160
+ "$LOCAL_WORKSPACE/dist" \
161
+ "$LOCAL_WORKSPACE/dist-web" \
162
+ "$LOCAL_WORKSPACE/dist-tt" \
163
+ "$LOCAL_WORKSPACE/server/dist"
164
+
165
+ echo "[local-build] Building on local disk..."
166
+ (
167
+ cd "$LOCAL_WORKSPACE"
168
+ export COZE_WORKSPACE_PATH="$LOCAL_WORKSPACE"
169
+ "$@"
170
+ )
171
+
172
+ sync_output_back() {
173
+ local output_name="$1"
174
+ local local_output="$LOCAL_WORKSPACE/$output_name"
175
+ local project_output="$PROJECT_ROOT/$output_name"
176
+
177
+ if [ ! -e "$local_output" ]; then
178
+ return
179
+ fi
180
+
181
+ if [ -L "$project_output" ] || [ -e "$project_output" ]; then
182
+ rm -rf "$project_output"
183
+ fi
184
+
185
+ mkdir -p "$(dirname "$project_output")"
186
+ rsync -a --delete "$local_output/" "$project_output/"
187
+ }
188
+
189
+ echo "[local-build] Syncing build artifacts back to $PROJECT_ROOT"
190
+ sync_output_back dist
191
+ sync_output_back dist-web
192
+ sync_output_back dist-tt
193
+ sync_output_back server/dist
194
+ echo "[local-build] Build artifacts are ready in the project directory"
@@ -2,9 +2,6 @@
2
2
  set -Eeuo pipefail
3
3
 
4
4
  ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
5
- if [[ "${COZE_TARO_LOCAL_ACTIVE:-}" != "${ROOT_DIR}" ]]; then
6
- exec node "$ROOT_DIR/.cozeproj/scripts/local-workspace.cjs" build "$@"
7
- fi
8
5
  COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-${ROOT_DIR}}"
9
6
  export COZE_WORKSPACE_PATH
10
7
 
@@ -17,12 +14,7 @@ else
17
14
  echo "⚠️ Warning: init_env.sh not found, skipping environment init."
18
15
  fi
19
16
  echo "Installing dependencies..."
20
- # 安装所有依赖(包含 Taro 核心和 React)
21
- if [[ "${COZE_TARO_LOCAL_MIRROR:-}" != "1" ]]; then
22
- bash "$ROOT_DIR/.cozeproj/scripts/prepare-node-modules.sh" --prefer-frozen-lockfile --prefer-offline
23
- fi
24
-
25
17
  echo "Building the Taro project..."
26
- pnpm build
18
+ bash "$ROOT_DIR/.cozeproj/scripts/build-on-local-disk.sh" pnpm build
27
19
 
28
20
  echo "Build completed successfully! Assets are in /dist"
@@ -2,13 +2,4 @@
2
2
  set -Eeuo pipefail
3
3
 
4
4
  ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
5
- if [[ "${COZE_TARO_LOCAL_ACTIVE:-}" != "${ROOT_DIR}" ]]; then
6
- exec node "$ROOT_DIR/.cozeproj/scripts/local-workspace.cjs" prepare "$@"
7
- fi
8
- COZE_WORKSPACE_PATH="${ROOT_DIR}"
9
- export COZE_WORKSPACE_PATH
10
-
11
- cd "${COZE_WORKSPACE_PATH}"
12
- if [[ "${COZE_TARO_LOCAL_MIRROR:-}" != "1" ]]; then
13
- bash "$ROOT_DIR/.cozeproj/scripts/prepare-node-modules.sh" --prefer-frozen-lockfile --prefer-offline
14
- fi
5
+ bash "$ROOT_DIR/.cozeproj/scripts/prepare-node-modules.sh" --prefer-frozen-lockfile --prefer-offline
@@ -3,9 +3,6 @@ echo "⚙️ dev_run.sh 开始运行"
3
3
  set -Eeuo pipefail
4
4
 
5
5
  ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
6
- if [[ "${COZE_TARO_LOCAL_ACTIVE:-}" != "${ROOT_DIR}" ]]; then
7
- exec node "$ROOT_DIR/.cozeproj/scripts/local-workspace.cjs" dev "$@"
8
- fi
9
6
  COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-${ROOT_DIR}}"
10
7
  export COZE_WORKSPACE_PATH
11
8
  cd "${COZE_WORKSPACE_PATH}"
@@ -13,7 +10,7 @@ cd "${COZE_WORKSPACE_PATH}"
13
10
  # ---------------------------------------------------------
14
11
  # 项目级日志目录
15
12
  # ---------------------------------------------------------
16
- LOG_DIR="${COZE_LOG_DIR:-${COZE_WORKSPACE_PATH}/logs}"
13
+ LOG_DIR="${COZE_WORKSPACE_PATH}/logs"
17
14
  LOG_FILE="${LOG_DIR}/dev.log"
18
15
  PID_FILE="${LOG_DIR}/dev.pid"
19
16
  DEV_PID=""
@@ -124,9 +121,9 @@ process_belongs_to_workspace() {
124
121
  "${COZE_WORKSPACE_PATH}"|"${COZE_WORKSPACE_PATH}"/*) return 0 ;;
125
122
  esac
126
123
 
127
- if [[ -n "${COZE_TARO_SOURCE_PATH:-}" ]]; then
124
+ if [[ -n "${COZE_LOCAL_WORKSPACE_PATH:-}" ]]; then
128
125
  case "${cwd}" in
129
- "${COZE_TARO_SOURCE_PATH}"|"${COZE_TARO_SOURCE_PATH}"/*) return 0 ;;
126
+ "${COZE_LOCAL_WORKSPACE_PATH}"|"${COZE_LOCAL_WORKSPACE_PATH}"/*) return 0 ;;
130
127
  esac
131
128
  fi
132
129
 
@@ -224,11 +221,54 @@ cleanup_previous_run() {
224
221
  # ---------------------------------------------------------
225
222
  echo "📦 Installing dependencies..."
226
223
  PNPM_BIN="$(command -v pnpm)"
227
- if [[ "${COZE_TARO_LOCAL_MIRROR:-}" != "1" ]]; then
228
- bash "$ROOT_DIR/.cozeproj/scripts/prepare-node-modules.sh" --prefer-frozen-lockfile --prefer-offline
229
- fi
224
+ bash "$ROOT_DIR/.cozeproj/scripts/prepare-node-modules.sh" --prefer-frozen-lockfile --prefer-offline
230
225
  echo "✅ Dependencies installed successfully!"
231
226
 
227
+ is_under_root() {
228
+ local path="$1"
229
+ local root="$2"
230
+ [ -n "$root" ] || return 1
231
+ case "$path" in
232
+ "$root"|"$root"/*) return 0 ;;
233
+ *) return 1 ;;
234
+ esac
235
+ }
236
+
237
+ is_coze_drive_workspace() {
238
+ local path="$1"
239
+ local root
240
+ local candidates=()
241
+
242
+ if [ -n "${COZE_DRIVE_ROOT:-}" ]; then
243
+ candidates+=("$COZE_DRIVE_ROOT")
244
+ fi
245
+ candidates+=("/Coze/Drive")
246
+
247
+ for root in "${candidates[@]}"; do
248
+ if [ -d "$root" ]; then
249
+ root="$(cd "$root" && pwd -P)"
250
+ else
251
+ root="${root%/}"
252
+ fi
253
+ if is_under_root "$path" "$root"; then
254
+ return 0
255
+ fi
256
+ done
257
+
258
+ return 1
259
+ }
260
+
261
+ if is_coze_drive_workspace "${COZE_WORKSPACE_PATH}"; then
262
+ COZE_LOCAL_BUILD_ROOT="${COZE_LOCAL_BUILD_ROOT:-/tmp/coze-taro-build}"
263
+ COZE_LOCAL_WORKSPACE_PATH="${COZE_LOCAL_BUILD_ROOT}/$(basename "$COZE_WORKSPACE_PATH")-$(printf '%s' "$COZE_WORKSPACE_PATH" | cksum | awk '{print $1}')/workspace"
264
+ export COZE_LOCAL_BUILD_ROOT
265
+ export COZE_LOCAL_WORKSPACE_PATH
266
+ DEV_COMMAND=(env COZE_SKIP_PREPARE_NODE_MODULES=1 COZE_SYNC_SOURCE_TO_LOCAL=1 bash "$ROOT_DIR/.cozeproj/scripts/build-on-local-disk.sh" "${PNPM_BIN}" dev)
267
+ echo "📁 Taro dev will run from a local disk workspace."
268
+ else
269
+ DEV_COMMAND=("${PNPM_BIN}" dev)
270
+ fi
271
+
232
272
  # ---------------------------------------------------------
233
273
  # 3. 清理旧进程 + 端口
234
274
  # ---------------------------------------------------------
@@ -260,7 +300,6 @@ start_service() {
260
300
  echo "⚠️ 警告: COZE_PROJECT_DOMAIN_DEFAULT 未设置,使用 .env.local 中的配置"
261
301
  fi
262
302
 
263
- # 启动 Taro H5 和 NestJS Server
264
303
  echo "Starting Taro H5 Dev Server and NestJS Server..."
265
304
 
266
305
  : > "${LOG_FILE}"
@@ -268,7 +307,7 @@ start_service() {
268
307
  DEV_PID="$(spawn_detached \
269
308
  "${COZE_WORKSPACE_PATH}" \
270
309
  "${LOG_FILE}" \
271
- "$(command -v node)" "$ROOT_DIR/.cozeproj/scripts/local-workspace.cjs" watch "${PNPM_BIN}" dev)"
310
+ "${DEV_COMMAND[@]}")"
272
311
  if [[ -z "${DEV_PID}" ]]; then
273
312
  echo "❌ 无法获取 dev 后台进程 PID"
274
313
  return 1
@@ -291,45 +330,5 @@ start_service() {
291
330
  echo "PID file: ${PID_FILE}"
292
331
  }
293
332
 
294
- warmup_preview() {
295
- local base="http://127.0.0.1:${PORT}"
296
- local waited=0
297
-
298
- if ! command -v curl >/dev/null 2>&1; then
299
- echo "Warmup skipped: curl is not available."
300
- return 0
301
- fi
302
-
303
- echo "🔥 Warmup: waiting for web server to accept connections..."
304
- while (( waited < 60 )); do
305
- if curl -s -o /dev/null --max-time 3 "${base}/"; then
306
- break
307
- fi
308
- sleep 2
309
- waited=$(( waited + 2 ))
310
- done
311
-
312
- local app_config="${COZE_WORKSPACE_PATH}/src/app.config.ts"
313
- local pages=""
314
- if [[ -f "${app_config}" ]]; then
315
- pages=$(grep -oE "[\"']pages/[^\"']+[\"']" "${app_config}" | tr -d "\"'" | sort -u || true)
316
- fi
317
-
318
- local p
319
- for p in "/" "/app.config.ts"; do
320
- echo "🔥 Warmup ${p}"
321
- curl -s -o /dev/null --max-time 300 "${base}${p}" || echo "Warmup ${p} timed out or failed (ignored)."
322
- done
323
- for p in ${pages}; do
324
- echo "🔥 Warmup /${p}.tsx"
325
- curl -s -o /dev/null --max-time 300 "${base}/${p}.tsx" || echo "Warmup /${p}.tsx timed out or failed (ignored)."
326
- done
327
- }
328
-
329
333
  echo "Starting HTTP services on port ${PORT} (web) and ${SERVER_PORT} (server)..."
330
334
  start_service
331
-
332
- if [[ "${COZE_TARO_LOCAL_MIRROR:-}" = "1" && "${COZE_DEV_SKIP_WARMUP:-0}" != "1" ]]; then
333
- warmup_preview || true
334
- echo "✅ Warmup finished (or timed out). Preview should load fast now."
335
- fi
@@ -2,17 +2,47 @@
2
2
  set -Eeuo pipefail
3
3
 
4
4
  ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
5
- if [[ "${COZE_TARO_LOCAL_ACTIVE:-}" != "${ROOT_DIR}" ]]; then
6
- exec node "$ROOT_DIR/.cozeproj/scripts/local-workspace.cjs" pack "$@"
7
- fi
8
5
  COZE_WORKSPACE_PATH="${COZE_WORKSPACE_PATH:-${ROOT_DIR}}"
9
6
  export COZE_WORKSPACE_PATH
10
7
 
11
8
  cd "${COZE_WORKSPACE_PATH}"
12
9
 
13
- LOG_DIR="${COZE_LOG_DIR:-/tmp}"
14
- mkdir -p "$LOG_DIR"
15
- PID_FILE="$LOG_DIR/coze-build_weapp.pid"
10
+ is_under_root() {
11
+ local path="$1"
12
+ local root="$2"
13
+ [ -n "$root" ] || return 1
14
+ case "$path" in
15
+ "$root"|"$root"/*) return 0 ;;
16
+ *) return 1 ;;
17
+ esac
18
+ }
19
+
20
+ is_coze_drive_workspace() {
21
+ local path="$1"
22
+ local root
23
+ local candidates=()
24
+
25
+ if [ -n "${COZE_DRIVE_ROOT:-}" ]; then
26
+ candidates+=("$COZE_DRIVE_ROOT")
27
+ fi
28
+ candidates+=("/Coze/Drive")
29
+
30
+ for root in "${candidates[@]}"; do
31
+ if [ -d "$root" ]; then
32
+ root="$(cd "$root" && pwd -P)"
33
+ else
34
+ root="${root%/}"
35
+ fi
36
+ if is_under_root "$path" "$root"; then
37
+ return 0
38
+ fi
39
+ done
40
+
41
+ return 1
42
+ }
43
+
44
+ # build_weapp.sh - 通过 PID 文件精确杀掉自己上次的构建进程
45
+ PID_FILE="/tmp/coze-build_weapp.pid"
16
46
 
17
47
  # 杀掉上次的构建进程组
18
48
  if [ -f "$PID_FILE" ]; then
@@ -26,16 +56,15 @@ if [ -f "$PID_FILE" ]; then
26
56
  rm -f "$PID_FILE"
27
57
  fi
28
58
 
29
- # 用 setsid 创建新的进程组,方便下次整组杀掉;无 setsid 的环境退化为普通后台进程。
30
- if command -v setsid >/dev/null 2>&1; then
31
- setsid pnpm build:pack &
59
+ # 用 setsid 创建新的进程组,方便下次整组杀掉
60
+ if is_coze_drive_workspace "${COZE_WORKSPACE_PATH}"; then
61
+ setsid bash "$ROOT_DIR/.cozeproj/scripts/build-on-local-disk.sh" pnpm build:pack &
32
62
  else
33
- pnpm build:pack &
63
+ setsid pnpm build:pack &
34
64
  fi
35
- BUILD_PID=$!
36
- echo "$BUILD_PID" > "$PID_FILE"
65
+ echo $! > "$PID_FILE"
37
66
 
38
67
  echo "构建已启动 (PID: $(cat $PID_FILE))"
39
68
 
40
- wait "$BUILD_PID"
69
+ wait $!
41
70
  rm -f "$PID_FILE"