Jekyll如何将对应章节静态cpp文件批量打包为zip压缩包提供下载
Windows环境Jekyll自动生成章节习题zip包实现方案
方案一:Jekyll自定义插件(构建时自动执行)
- 首先安装依赖:在项目Gemfile中添加
gem 'rubyzip',执行bundle install完成安装。 - 在项目根目录创建
_plugins文件夹,新建generate_chapter_zips.rb文件,写入如下代码:
require 'zip' Jekyll::Hooks.register :site, :after_init do |site| # 配置路径,替换为你实际存放cpp文件的相对路径 cpp_source_dir = File.join(site.source, 'solutions') zip_output_dir = File.join(site.source, 'assets', 'zips') FileUtils.mkdir_p(zip_output_dir) unless Dir.exist?(zip_output_dir) # 按章节分组cpp文件 chapter_files = Hash.new { |h, k| h[k] = [] } Dir.glob(File.join(cpp_source_dir, '*.cpp')).each do |file_path| file_name = File.basename(file_path) # 提取文件名前两位作为章节号,适配你的命名规则 chapter_num = file_name[0..1] chapter_files[chapter_num] << file_path end # 逐章节生成zip chapter_files.each do |chapter, files| zip_path = File.join(zip_output_dir, "chapter_#{chapter}.zip") Zip::File.open(zip_path, Zip::File::CREATE) do |zipfile| files.each do |file| zipfile.add(File.basename(file), file) end end # 将生成的zip加入静态文件列表,让Jekyll自动发布 site.static_files << Jekyll::StaticFile.new(site, site.source, 'assets/zips', "chapter_#{chapter}.zip") end end
- 配置完成后每次执行
jekyll build或jekyll serve都会自动扫描更新zip包,无需手动操作。
方案二:Windows批处理脚本(无需修改Jekyll逻辑)
如果不想使用Ruby插件,可以用Windows原生工具实现打包,适合不熟悉Ruby开发的场景:
- 在项目根目录新建
pack_chapters.bat文件,写入如下代码:
@echo off setlocal enabledelayedexpansion :: 替换为你实际存放cpp文件的相对路径 set "cpp_dir=solutions" set "zip_output_dir=assets\zips" if not exist %zip_output_dir% mkdir %zip_output_dir% :: 清理旧zip文件 del /q %zip_output_dir%\*.zip 2>nul :: 遍历所有cpp文件按章节打包,Windows10 1809及以上版本自带tar命令 for %%f in (%cpp_dir%\*.cpp) do ( set "filename=%%~nf" :: 取前两位字符为章节号,适配你的命名规则 set "chapter=!filename:~0,2!" tar -a -c -f %zip_output_dir%\chapter_!chapter!.zip "%%f" )
- 使用方式:每次修改cpp文件后执行该批处理即可自动更新所有zip包,也可以把该脚本加入Jekyll构建前置命令,实现自动执行。
页面中添加下载链接
你原来遍历site.static_files生成章节页面的逻辑无需修改,只需要在对应章节页面添加如下下载链接即可:
<a href="/assets/zips/chapter_{{ chapter_num }}.zip">下载本章全部习题解答</a>
内容的提问来源于stack exchange,提问作者PhilLab
相关产品推荐
相关产品推荐

