Skip to content

Instantly share code, notes, and snippets.

@talentestors
Last active December 31, 2025 06:58
Show Gist options
  • Select an option

  • Save talentestors/46b2248158be32acbadebb51284658eb to your computer and use it in GitHub Desktop.

Select an option

Save talentestors/46b2248158be32acbadebb51284658eb to your computer and use it in GitHub Desktop.
The shell script for packaging the project source code
#!/bin/bash
set -e
# 检查git是否安装
if ! command -v git &> /dev/null; then
echo "❌ 错误: 未找到 git 命令"
echo "💡 请先安装 git:"
echo " Ubuntu/Debian: sudo apt-get install git"
echo " CentOS/RHEL: sudo yum install git"
echo " macOS: brew install git 或 从 https://git-scm.com/ 下载"
echo " Windows: 从 https://git-scm.com/ 下载安装"
exit 1
fi
PROJECT_DIR=$(pwd)
PROJECT_NAME=$(basename "$PROJECT_DIR")
DIST_DIR="$PROJECT_DIR/dist"
mkdir -p "$DIST_DIR"
# 检查是否为git仓库
IS_GIT_REPO=false
IS_TEMP_REPO=false
if [ -d ".git" ] > /dev/null 2>&1; then
IS_GIT_REPO=true
fi
# 如果不是git仓库,创建临时仓库
if [ "$IS_GIT_REPO" = false ]; then
echo "⚠️ 警告: 当前目录不是 git 仓库"
echo "🔧 将创建临时 git 仓库来生成归档文件..."
# 检查是否有文件可以归档
if [ "$(find . -maxdepth 1 ! -name '.' ! -name '.git' | wc -l)" -eq 0 ]; then
echo "❌ 错误: 当前目录没有可归档的文件"
exit 1
fi
# 创建临时git仓库
git init -q
git add .
git commit -q -m "Temporary commit for packaging" --allow-empty
IS_TEMP_REPO=true
GIT_REF="HEAD"
FILE_SUFFIX=""
fi
# 设置trap清理
cleanup() {
if [ "$IS_TEMP_REPO" = true ]; then
echo "🧹 清理临时 git 仓库..."
rm -rf .git
fi
}
# 确保在脚本退出时清理
trap cleanup EXIT
# 获取 git ref 参数,默认为 HEAD(如果是临时仓库,会覆盖此设置)
GIT_REF="${1:-HEAD}"
# 验证 git ref 是否有效(仅在真实git仓库中验证)
if [ "$IS_TEMP_REPO" = false ]; then
if ! git rev-parse --verify "$GIT_REF" >/dev/null 2>&1; then
echo "❌ 错误: '$GIT_REF' 不是有效的 git ref"
echo "💡 用法示例:"
echo " ./scripts/package.sh # 使用 HEAD (默认)"
echo " ./scripts/package.sh main # 使用 main 分支"
echo " ./scripts/package.sh 1.0.0 # 使用 tag"
echo " ./scripts/package.sh abc123 # 使用 commit hash"
exit 1
fi
fi
# 生成文件名后缀:如果 ref 不是 HEAD 且不是临时仓库,则添加后缀
if [ "$GIT_REF" = "HEAD" ] || [ "$IS_TEMP_REPO" = true ]; then
FILE_SUFFIX=""
else
FILE_SUFFIX="_${GIT_REF}"
fi
# 清理可能存在的无效文件
cleanup_invalid_files() {
local file="$1"
if [ -f "$file" ] && [ ! -s "$file" ]; then
echo "🧹 清理无效的空文件: $file"
rm -f "$file"
fi
}
# 生成 tar.gz
TAR_FILE="$DIST_DIR/${PROJECT_NAME}${FILE_SUFFIX}.tar.gz"
if !(git archive --format=tar.gz -o "$TAR_FILE" "$GIT_REF"); then
echo "❌ tar.gz 生成失败,清理临时文件"
cleanup_invalid_files "$TAR_FILE"
exit 1
fi
# 生成 zip
ZIP_FILE="$DIST_DIR/${PROJECT_NAME}${FILE_SUFFIX}.zip"
if !(git archive --format=zip -o "$ZIP_FILE" "$GIT_REF"); then
echo "❌ zip 生成失败,清理临时文件"
cleanup_invalid_files "$ZIP_FILE"
cleanup_invalid_files "$TAR_FILE"
exit 1
fi
# 显示文件大小
echo "Success"
du -h "$DIST_DIR/"*
#!/bin/bash
set -e
# 打包脚本 - 支持 tar.gz 和 zip
# 用法: ./scripts/package.sh
PROJECT_DIR=$(pwd)
PROJECT_NAME=$(basename "$PROJECT_DIR")
DIST_DIR="$PROJECT_DIR/dist"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 创建 dist 目录
mkdir -p "$DIST_DIR"
# 创建临时目录(使用项目目录下的临时目录,避免跨文件系统问题)
TEMP_DIR="$PROJECT_DIR/.package_temp"
mkdir -p "$TEMP_DIR"
echo "📦 项目: $PROJECT_NAME"
echo "🕐 时间: $TIMESTAMP"
echo "📂 临时目录: $TEMP_DIR"
echo "--------------------------------"
# 复制所有文件到临时目录(排除 .gitignore 规则)
echo "🔄 复制文件(应用 .gitignore 规则)..."
rsync -av --exclude-from="$PROJECT_DIR/.gitignore" \
--exclude='.git/' \
--exclude='dist/' \
--exclude='*.tar.gz' \
--exclude='*.zip' \
--exclude='.package_temp/' \
"$PROJECT_DIR/" "$TEMP_DIR/"
# 调试:显示临时目录内容
echo "🔍 临时目录内容:"
find "$TEMP_DIR" -maxdepth 2 -type f | head -10
echo "(显示前10个文件,总文件数:$(find "$TEMP_DIR" -type f | wc -l))"
# 检查是否有文件被复制
FILE_COUNT=$(find "$TEMP_DIR" -type f | wc -l)
if [ "$FILE_COUNT" -eq 0 ]; then
echo "❌ 临时目录为空,请检查 .gitignore 规则"
echo "📋 .gitignore 内容:"
cat "$PROJECT_DIR/.gitignore" 2>/dev/null || echo "(无 .gitignore 文件)"
rm -rf "$TEMP_DIR"
exit 1
fi
# 生成 tar.gz
TAR_FILE="$DIST_DIR/${PROJECT_NAME}.tar.gz"
echo "🔧 生成 tar.gz: $TAR_FILE"
tar -czf "$TAR_FILE" -C "$TEMP_DIR" .
# 生成 zip
ZIP_FILE="$DIST_DIR/${PROJECT_NAME}.zip"
echo "🔧 生成 zip: $ZIP_FILE"
cd "$TEMP_DIR" && zip -r "$ZIP_FILE" . -q
cd "$PROJECT_DIR"
# 清理临时目录
rm -rf "$TEMP_DIR"
echo "--------------------------------"
echo "✅ 打包成功!"
echo "📁 输出目录: $DIST_DIR"
echo "📦 tar.gz: $TAR_FILE"
echo "📦 zip: $ZIP_FILE"
echo "--------------------------------"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment