如何阻止Jekyll清理生成的JSON文件?
解决Jekyll插件生成的JSON文件被自动删除的问题
我之前也遇到过一模一样的困扰——Jekyll构建完就把插件生成的JSON文件清掉,哪怕中途报错能看到文件已经生成。这本质是Jekyll的构建清理机制在起作用,它会默认清理掉它不认为是“合法构建产物”的文件。下面是几个靠谱的解决方案:
1. 让Jekyll把JSON文件识别为静态资源(最推荐)
不要直接用File.write生成文件后就完事,而是把生成的文件注册到Jekyll的static_files集合里,告诉它这个文件是构建产物的一部分,不能随便删。
修改你的插件代码,大概是这样:
Jekyll::Hooks.register :site, :post_write do |site| # 生成你的JSON内容 search_data = { # 这里替换成你的数据逻辑 } json_content = search_data.to_json # 指定生成路径(必须在site.dest目录下) json_path = File.join(site.dest, "search.json") File.write(json_path, json_content) # 关键步骤:把文件注册为静态资源 static_file = Jekyll::StaticFile.new( site, site.source, # 源目录,这里因为文件是动态生成的,填source即可 "", # 文件在dest的根目录,所以相对路径为空 "search.json" # 文件名 ) site.static_files << static_file end
这里用post_write钩子是因为它在所有页面和文件都写完之后触发,不会被后续的构建步骤覆盖或清理。
2. 配置Jekyll强制保留指定文件
如果不想修改插件代码,可以在_config.yml里添加keep_files配置,告诉Jekyll哪些文件不能删:
keep_files: - search.json
这个方法简单粗暴,但有个小缺点:如果你的JSON内容需要更新,Jekyll不会自动清理旧文件,所以要确保插件每次生成时都会覆盖旧文件,不然可能会残留旧内容。
3. 确认插件的执行时机
如果你之前是在before_build或者build钩子生成文件,那大概率会被Jekyll的初始清理步骤删掉——因为Jekyll默认会先清空dest目录再开始构建。
把钩子换成after_build或者post_write,这两个阶段都是在构建完成、不会再清空目录的时候触发,生成的文件就能保留下来。
额外排查点
- 检查你生成文件的路径是不是真的在
site.dest目录下,别写到其他地方去了; - 如果用了
jekyll serve命令,注意--incremental增量构建可能会有缓存问题,试试关掉增量构建再测试。
内容的提问来源于stack exchange,提问作者tlnagy
相关产品推荐
相关产品推荐

