Last active
December 31, 2025 06:58
-
-
Save talentestors/46b2248158be32acbadebb51284658eb to your computer and use it in GitHub Desktop.
The shell script for packaging the project source code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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/"* |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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