From fb2505d379006ecac0b0315c459d5f175427da9b Mon Sep 17 00:00:00 2001 From: Lyda <1829913225@qq.com> Date: Mon, 13 Oct 2025 10:41:09 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=AE=80=E5=8C=96=20pnpm=20store?= =?UTF-8?q?=20=E8=B7=AF=E5=BE=84=E6=A3=80=E6=B5=8B=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8=20pnpm=20store=20?= =?UTF-8?q?path=20=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-install/README.md | 8 ++--- pnpm-install/action.yml | 70 +++++++---------------------------------- 2 files changed, 13 insertions(+), 65 deletions(-) diff --git a/pnpm-install/README.md b/pnpm-install/README.md index 91f11f7..2c8daae 100644 --- a/pnpm-install/README.md +++ b/pnpm-install/README.md @@ -44,13 +44,9 @@ ## 🔁 缓存路径 -Action 会根据以下优先级自动识别 pnpm store: +Action 会通过执行 `pnpm store path --silent` 获取当前 pnpm store 目录,并将结果写入日志与 `PNPM_STORE_DIR` 环境变量。 -- 显式的 `PNPM_STORE_DIR` 或 `npm_config_store_dir` 环境变量 -- 项目/全局 `.npmrc` 中的 `store-dir=` 配置(支持相对路径自动展开) -- 若以上均不存在,退回 `${{ runner.temp }}/.pnpm-store` - -解析完成后会打印 `pnpm store path: ...`,并将路径写入环境变量 `PNPM_STORE_DIR` 供后续步骤使用。 +若命令未返回有效路径,可在调用前手动设置 `PNPM_STORE_DIR=/path/to/store` 以确保后续步骤正常运行。 ## ⚙️ 进阶配置 diff --git a/pnpm-install/action.yml b/pnpm-install/action.yml index 1f64656..c784ca0 100644 --- a/pnpm-install/action.yml +++ b/pnpm-install/action.yml @@ -102,70 +102,22 @@ runs: shell: bash run: | set -euo pipefail - DEFAULT_STORE="${RUNNER_TEMP:-$HOME}/.pnpm-store" - STORE_DIR_CANDIDATE="${PNPM_STORE_DIR:-${npm_config_store_dir:-}}" - - probe_config () { - local file="$1" - if [[ -n "$STORE_DIR_CANDIDATE" || -z "$file" || ! -f "$file" ]]; then - return - fi - local raw - raw=$(grep -E '^[[:space:]]*store-dir[[:space:]]*=' "$file" | tail -n1 | cut -d= -f2- || true) - if [[ -z "$raw" ]]; then - return - fi - raw=$(echo "$raw" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') - if [[ -z "$raw" ]]; then - return - fi - if [[ "$raw" == /* || "$raw" =~ ^[A-Za-z]:[\\/] ]]; then - STORE_DIR_CANDIDATE="$raw" - else - local base - base=$(cd "$(dirname "$file")" && pwd) - STORE_DIR_CANDIDATE="$base/$raw" - fi - } - - probe_config "${NPM_CONFIG_USERCONFIG:-}" - echo "ℹ️ Checked userconfig: ${NPM_CONFIG_USERCONFIG:-} -> ${STORE_DIR_CANDIDATE:-}" - probe_config ".npmrc" - echo "ℹ️ Checked project .npmrc -> ${STORE_DIR_CANDIDATE:-}" - probe_config "$HOME/.npmrc" - echo "ℹ️ Checked home .npmrc -> ${STORE_DIR_CANDIDATE:-}" - - if [[ -z "$STORE_DIR_CANDIDATE" ]]; then - STORE_DIR_CANDIDATE=$(pnpm store path --silent 2>/dev/null || true) - STORE_DIR_CANDIDATE=$(echo "$STORE_DIR_CANDIDATE" | tail -n1 | tr -d '\r') + if ! command -v pnpm >/dev/null 2>&1; then + echo "❌ 未找到 pnpm,请先通过 pnpm/action-setup 安装" >&2 + exit 1 fi + STORE_DIR_CANDIDATE=$(pnpm store path --silent 2>/dev/null || true) + STORE_DIR_CANDIDATE=$(echo "$STORE_DIR_CANDIDATE" | tail -n1 | tr -d '\r') + if [[ -z "$STORE_DIR_CANDIDATE" ]]; then - STORE_DIR_CANDIDATE="$DEFAULT_STORE" + echo "❌ pnpm store path 未返回有效路径。可在运行前设置 PNPM_STORE_DIR=/path/to/store 或检查 pnpm 配置" >&2 + exit 1 fi - echo "ℹ️ Final store candidate: $STORE_DIR_CANDIDATE" - - mkdir -p "$STORE_DIR_CANDIDATE" - - case "$STORE_DIR_CANDIDATE" in - /*) - CACHE_PATH="$STORE_DIR_CANDIDATE" - ;; - ~*) - CACHE_PATH="$(eval echo "$STORE_DIR_CANDIDATE")" - ;; - *) - CACHE_PATH="$(cd "$STORE_DIR_CANDIDATE" 2>/dev/null && pwd)" - if [[ -z "$CACHE_PATH" ]]; then - CACHE_PATH="$STORE_DIR_CANDIDATE" - fi - ;; - esac - - echo "pnpm store path: $CACHE_PATH" - echo "PNPM_STORE_DIR=${CACHE_PATH}" >> "$GITHUB_ENV" - echo "path=${CACHE_PATH}" >> "$GITHUB_OUTPUT" + echo "pnpm store path: $STORE_DIR_CANDIDATE" + echo "PNPM_STORE_DIR=${STORE_DIR_CANDIDATE}" >> "$GITHUB_ENV" + echo "path=${STORE_DIR_CANDIDATE}" >> "$GITHUB_OUTPUT" - name: 拉取缓存 id: cache