最终会压缩除了忽略的文件夹以外的所有项目文件包括目录,输出到
/dist
文件夹内(.zip
格式),压缩包文件名前缀自定义,会自动拼接当前时间加入到文件名后缀防止文件重名冲突。
Python实现(推荐使用)
比起powershell脚本性能要好很多且简洁明了
import os
import zipfile
# 最终输出路径+压缩包文件名
output_zip = "KazeFrame_source.zip"
# 排除文件夹
exclude_folders = ["ui", "version", "tmp"]
# 排除文件,支持通配符
exclude_extensions = [".zip", ".exe", ".log"]
def zip_folder(output_path, exclude_folders, exclude_extensions):
# 创建一个zip文件
with zipfile.ZipFile(output_path, "w", zipfile.ZIP_DEFLATED) as zipf:
# 遍历当前工作目录中的文件和子文件夹
for foldername, subfolders, filenames in os.walk("."):
# 从子文件夹列表中移除要排除的文件夹
subfolders[:] = [sub for sub in subfolders if sub not in exclude_folders]
for filename in filenames:
# 构建文件的完整路径
filepath = os.path.join(foldername, filename)
# 获取文件相对于当前工作目录的相对路径
relative_path = os.path.relpath(filepath, ".")
# 检查文件是否在排除列表中(文件夹或后缀)
if not any(
excl in relative_path for excl in exclude_folders
) and not any(filename.endswith(ext) for ext in exclude_extensions):
zipf.write(filepath, relative_path)
# 开始压缩
zip_folder(output_zip, exclude_folders, exclude_extensions)
简易版示例
只对于已知文件名和文件夹处理
# 输出的ZIP包路径和文件名
$ZIPFILE = "KazeFrame.zip"
# 要压缩的文件和文件夹路径
$PathsToCompress = @(
".\main.go"
".\.air.toml"
".\go.mod"
".\go.sum"
".\cmd"
".\internal"
".\pkg"
".\script"
)
# 压缩
Compress-Archive -Path $PathsToCompress -DestinationPath $ZIPFILE -Force
示例
- 这里的
ignoreList
里面更改或自行添加删除为你要忽略压缩的文件夹,暂不支持忽略单文件,下方示例可以直接用来打包node项目(忽略的是node_modules和dist文件夹)。
# 自定义最终压缩文件的文件名前缀,建议是项目名称,简洁明了
$prefix = "KAZE"
# 自定义要忽略的文件夹列表
$ignoreList = @("node_modules", "dist")
# 获取当前目录下除去忽略列表的所有文件和文件夹
$itemsToCompress = Get-ChildItem -Path . | Where-Object {
$_.GetType().Name -ne 'DirectoryInfo' -or
$ignoreList -notcontains$_.Name
}
# 创建一个基于当前日期和时间的后缀
$suffix = Get-Date -Format "yyyyMMdd_HHmmss"
# 压缩包最终文件名
$destinationPath = ".\dist\$($prefix)_$suffix.zip"
# 拼接执行命令
$compress = @{
Path = $itemsToCompress.FullName
CompressionLevel = "Fastest"
DestinationPath = $destinationPath
}
Compress-Archive @compress