#!/bin/bash # npm发布脚本 # 参数1: 包名 # 参数2: 版本号 # 参数3: 工作目录 # 确保提供了必要的参数 if [ $# -lt 3 ]; then echo "错误:缺少必要参数" echo "用法:$0 <包名> <版本号> <工作目录>" exit 1 fi PACKAGE_NAME="$1" VERSION="$2" WORK_DIR="$3" # 检查工作目录是否存在 if [ ! -d "$WORK_DIR" ]; then echo "错误:工作目录 $WORK_DIR 不存在" exit 1 fi # 切换到工作目录 cd "$WORK_DIR" # 设置npm注册表 echo "设置npm注册表..." npm config set @shenxianhe:registry=https://git.shenxianhe.cn/api/packages/shenxianhe/npm/ # 配置npm认证(如果提供了环境变量) configure_npm_auth() { # 如果设置了 CONNECT_AUTH_TOKEN 变量,则配置npm if [ -n "$CONNECT_AUTH_TOKEN" ]; then echo "检测到 CONNECT_AUTH_TOKEN 环境变量,配置npm认证..." npm config set -- '//git.shenxianhe.cn/api/packages/shenxianhe/npm/:_authToken' "$CONNECT_AUTH_TOKEN" fi # 无论是否设置了环境变量,都继续执行(因为可能之前已经配置过npm) echo "正在使用当前npm配置进行认证..." } # 显示认证错误提示信息 display_auth_error() { echo "提示:如果是认证失败,请尝试设置环境变量:export CONNECT_AUTH_TOKEN=your_access_token" } # 调用函数配置npm认证(如果有环境变量) configure_npm_auth # 检查包是否已存在 check_package_exists() { echo "检查包 $PACKAGE_NAME@$VERSION 是否已存在..." # 使用npm view命令检查包是否存在 if npm view "$PACKAGE_NAME@$VERSION" --registry=https://git.shenxianhe.cn/api/packages/shenxianhe/npm/ > /dev/null 2>&1; then return 0 # 包已存在 else return 1 # 包不存在 fi } # 如果包已存在,询问是否删除 if check_package_exists; then echo "警告:包 $PACKAGE_NAME@$VERSION 已存在" echo "是否要先删除现有包?(y/n)" read -r answer if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then echo "删除现有包 $PACKAGE_NAME@$VERSION..." npm unpublish --force "$PACKAGE_NAME@$VERSION" --registry=https://git.shenxianhe.cn/api/packages/shenxianhe/npm/ if [ $? -ne 0 ]; then echo "错误:删除包失败" display_auth_error exit 1 fi else echo "取消发布操作" exit 1 fi fi # 发布包 echo "发布包 $PACKAGE_NAME@$VERSION..." npm publish --registry=https://git.shenxianhe.cn/api/packages/shenxianhe/npm/ # 检查发布是否成功 if [ $? -eq 0 ]; then echo "成功发布包 $PACKAGE_NAME@$VERSION 到 npm 仓库" else echo "错误:发布包失败" display_auth_error exit 1 fi