mirror of
https://git.bjxgj.com/xgj/xgj-actions.git
synced 2025-10-14 16:53:37 +08:00
feat: 添加pnpm自动安装和store缓存模式支持
This commit is contained in:
@@ -10,6 +10,16 @@ inputs:
|
||||
required: false
|
||||
default: 'npm'
|
||||
|
||||
pnpm-version:
|
||||
description: 'pnpm 版本(当 package-manager=pnpm 时生效)'
|
||||
required: false
|
||||
default: '10'
|
||||
|
||||
cache-mode:
|
||||
description: '缓存模式:node_modules 或 store'
|
||||
required: false
|
||||
default: 'store'
|
||||
|
||||
|
||||
cache-prefix:
|
||||
description: '缓存前缀名称'
|
||||
@@ -35,6 +45,11 @@ inputs:
|
||||
description: '自定义安装命令(可选,会覆盖默认命令)'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
install-args:
|
||||
description: '附加到默认安装命令的参数(当未提供 install-command 时生效)'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
cache-hash:
|
||||
description: '缓存hash值(推荐使用hashFiles计算)'
|
||||
@@ -50,6 +65,10 @@ outputs:
|
||||
description: '使用的缓存key'
|
||||
value: ${{ steps.cache-key.outputs.key }}
|
||||
|
||||
cache-path:
|
||||
description: '缓存路径(用于调试与复用)'
|
||||
value: ${{ steps.cache-path.outputs.path }}
|
||||
|
||||
runs:
|
||||
using: 'composite'
|
||||
steps:
|
||||
@@ -80,19 +99,78 @@ runs:
|
||||
echo "⚠️ 使用默认hash值: ${CACHE_HASH_SHORT}"
|
||||
fi
|
||||
|
||||
CACHE_KEY="${{ runner.os }}-${{ inputs.cache-prefix }}-${CACHE_HASH_SHORT}"
|
||||
# 生成包管理器后缀,避免不同包管理器/版本的缓存互相污染
|
||||
MANAGER="${{ inputs.package-manager }}"
|
||||
MANAGER_SUFFIX="$MANAGER"
|
||||
if [[ "$MANAGER" == "pnpm" && -n "${{ inputs.pnpm-version }}" && "${{ inputs.pnpm-version }}" != "" ]]; then
|
||||
MANAGER_SUFFIX="${MANAGER}-v${{ inputs.pnpm-version }}"
|
||||
fi
|
||||
|
||||
# 模式后缀,隔离不同缓存模式(node_modules vs store)
|
||||
MODE_SUFFIX="${{ inputs.cache-mode }}"
|
||||
if [[ -z "$MODE_SUFFIX" ]]; then MODE_SUFFIX="node_modules"; fi
|
||||
|
||||
# 构建缓存key:<OS>-<manager[-vX]>-<mode>-<prefix>-<hash>
|
||||
CACHE_KEY="${{ runner.os }}-${MANAGER_SUFFIX}-${MODE_SUFFIX}-${{ inputs.cache-prefix }}-${CACHE_HASH_SHORT}"
|
||||
# 恢复前缀:用于 restore-keys,防止不同包管理器/模式的回退误命中
|
||||
RESTORE_PREFIX="${{ runner.os }}-${MANAGER_SUFFIX}-${MODE_SUFFIX}-${{ inputs.cache-prefix }}-"
|
||||
echo "key=${CACHE_KEY}" >> $GITHUB_OUTPUT
|
||||
echo "restore-prefix=${RESTORE_PREFIX}" >> $GITHUB_OUTPUT
|
||||
echo "使用hash: ${CACHE_HASH}"
|
||||
echo "缓存key: ${CACHE_KEY}"
|
||||
|
||||
- name: 确保 pnpm 可用(用于计算 store 路径)
|
||||
if: inputs.package-manager == 'pnpm' && inputs.cache-mode == 'store'
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: ${{ inputs.pnpm-version }}
|
||||
run_install: false
|
||||
|
||||
- name: 确定缓存路径
|
||||
id: cache-path
|
||||
shell: bash
|
||||
run: |
|
||||
MODE="${{ inputs.cache-mode }}"
|
||||
MANAGER="${{ inputs.package-manager }}"
|
||||
if [[ -z "$MODE" ]]; then MODE="node_modules"; fi
|
||||
|
||||
if [[ "$MODE" == "node_modules" ]]; then
|
||||
CACHE_PATH="${{ inputs.node-modules-path }}"
|
||||
else
|
||||
case "$MANAGER" in
|
||||
"npm")
|
||||
# npm 的全局缓存目录
|
||||
CACHE_PATH="$HOME/.npm"
|
||||
;;
|
||||
"pnpm")
|
||||
# pnpm store 路径(通过命令获取,以兼容自定义配置)
|
||||
if command -v pnpm >/dev/null 2>&1; then
|
||||
CACHE_PATH="$(pnpm store path)"
|
||||
else
|
||||
# 回退:若未能获取,则使用常见默认路径
|
||||
CACHE_PATH="$HOME/.pnpm-store"
|
||||
fi
|
||||
;;
|
||||
"yarn")
|
||||
# yarn v1 默认缓存目录(yarn berry 采用不同机制,这里聚焦 v1 常见场景)
|
||||
CACHE_PATH="$HOME/.cache/yarn"
|
||||
;;
|
||||
*)
|
||||
echo "❌ 不支持的包管理器: $MANAGER"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
echo "path=${CACHE_PATH}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: 拉取缓存依赖
|
||||
id: cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ inputs.node-modules-path }}
|
||||
path: ${{ steps.cache-path.outputs.path }}
|
||||
key: ${{ steps.cache-key.outputs.key }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-${{ inputs.cache-prefix }}-
|
||||
${{ steps.cache-key.outputs.restore-prefix }}
|
||||
|
||||
- name: 显示缓存状态
|
||||
shell: bash
|
||||
@@ -103,8 +181,15 @@ runs:
|
||||
echo "⚠️ 缓存未命中,开始安装依赖"
|
||||
fi
|
||||
|
||||
- name: 确保 pnpm 可用(如需)
|
||||
if: inputs.package-manager == 'pnpm'
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: ${{ inputs.pnpm-version }}
|
||||
run_install: false
|
||||
|
||||
- name: 安装依赖
|
||||
if: steps.cache.outputs.cache-hit != 'true'
|
||||
if: (inputs.cache-mode == 'node_modules' && steps.cache.outputs.cache-hit != 'true') || (inputs.cache-mode == 'store')
|
||||
shell: bash
|
||||
run: |
|
||||
# 如果提供了自定义安装命令,使用自定义命令
|
||||
@@ -112,33 +197,37 @@ runs:
|
||||
echo "🔧 使用自定义安装命令: ${{ inputs.install-command }}"
|
||||
${{ inputs.install-command }}
|
||||
else
|
||||
INSTALL_ARGS="${{ inputs.install-args }}"
|
||||
if [[ -n "$INSTALL_ARGS" ]]; then
|
||||
echo "➕ 附加安装参数: $INSTALL_ARGS"
|
||||
fi
|
||||
# 根据包管理器选择安装命令
|
||||
case "${{ inputs.package-manager }}" in
|
||||
"npm")
|
||||
if [[ "${{ inputs.force-install }}" == "true" ]]; then
|
||||
echo "🔧 使用npm强制安装"
|
||||
npm install --force
|
||||
npm install --force ${INSTALL_ARGS}
|
||||
else
|
||||
echo "🔧 使用npm安装"
|
||||
npm install
|
||||
npm install ${INSTALL_ARGS}
|
||||
fi
|
||||
;;
|
||||
"pnpm")
|
||||
if [[ "${{ inputs.force-install }}" == "true" ]]; then
|
||||
echo "🔧 使用pnpm强制安装"
|
||||
pnpm install --force
|
||||
pnpm install --force ${INSTALL_ARGS}
|
||||
else
|
||||
echo "🔧 使用pnpm安装"
|
||||
pnpm install
|
||||
pnpm install ${INSTALL_ARGS}
|
||||
fi
|
||||
;;
|
||||
"yarn")
|
||||
if [[ "${{ inputs.force-install }}" == "true" ]]; then
|
||||
echo "🔧 使用yarn强制安装"
|
||||
yarn install --force
|
||||
yarn install --force ${INSTALL_ARGS}
|
||||
else
|
||||
echo "🔧 使用yarn安装"
|
||||
yarn install
|
||||
yarn install ${INSTALL_ARGS}
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
|
Reference in New Issue
Block a user