如何在单个Jekyll项目中组织多产品文档输出?
嘿,这个需求完全可行!我帮你拆解一下实现思路和具体步骤,完美适配你用单Jekyll项目管理30+产品文档的场景:
Jekyll的集合就是为这种「多组独立内容+通用资源复用」的场景设计的——它能让你在单个项目里管理所有产品的文档内容,同时完全复用根目录下的CSS、JS、布局模板和核心配置,不用再复制30个重复项目。
第一步:配置集合与独立内容目录
首先修改项目根目录的_config.yml,为每个产品定义一个集合,每个集合对应一个独立的内容目录:
# _config.yml collections: product1: output: true # 开启该集合的页面生成 permalink: /product1/:path/ # 定义该产品文档的URL结构 product2: output: true permalink: /product2/:path/ # 剩下的28+个产品依次类推,格式完全一致
然后在项目根目录创建对应的_product1/、_product2/等文件夹,把每个产品的markdown文档直接放进对应的文件夹里就好——通用的CSS、JS、布局模板依然放在根目录的css/、js/、_layouts/文件夹,完全复用。
第二步:通用布局的复用与动态适配
因为所有产品共用Liquid模板,你只需要在_layouts/里写一套通用的布局文件(比如product-docs.html),就能自动适配所有产品的内容。
比如布局里的文档导航部分,可以用Liquid动态调用当前产品集合的所有页面,自动生成专属目录:
<!-- _layouts/product-docs.html --> <div class="product-nav"> <h3>当前产品文档目录</h3> <ul> {% for doc in site[page.collection] %} <li><a href="{{ doc.url }}">{{ doc.title }}</a></li> {% endfor %} </ul> </div> <div class="doc-content"> {{ page.content }} </div>
每个产品的markdown文档只需要在头部指定这个通用布局:
--- layout: product-docs title: 产品1快速入门 --- 这里是产品1的具体文档内容...
第三步:单独发布单个产品的两种方案
方案1:环境变量控制(快速预览单个产品)
如果只想启动本地服务预览某一个产品(比如product1),可以通过环境变量控制集合的output属性:
首先修改_config.yml里的集合配置,改成动态判断环境变量:
# _config.yml collections: product1: output: {% if env == "product1" %}true{% else %}false{% endif %} permalink: /product1/:path/ product2: output: {% if env == "product2" %}true{% else %}false{% endif %} permalink: /product2/:path/ # 其他产品同理
然后启动Jekyll服务时指定环境变量:
env=product1 jekyll serve
这样只会生成product1的文档页面,其他产品的output设为false,不会生成页面,启动速度也更快。
方案2:单独配置文件+指定输出目录(适合部署)
如果需要单独生成某一个产品的文档用于部署,可以为每个产品创建一个专属的小配置文件,比如_config-product1.yml:
# _config-product1.yml collections: product1: output: true product2: output: false # 把其他所有产品的output都设为false
然后执行build命令,同时加载核心配置和产品专属配置,并指定输出目录:
jekyll build --config _config.yml,_config-product1.yml --destination _site/product1
生成的产物会单独放在_site/product1目录下,直接部署这个目录即可。
额外优化:批量管理30+产品(避免手动重复配置)
如果手动写30个集合配置太麻烦,可以利用Jekyll的Liquid循环批量生成集合配置(需要Jekyll 3.0及以上版本支持):
首先在_config.yml里定义所有产品的列表:
# _config.yml products: ["product1", "product2", "product3", ..., "product30"]
然后用Liquid循环动态生成collections配置:
{% assign product_list = site.products %} collections: {% for product in product_list %} {{ product }}: output: false permalink: /{{ product }}/:path/ {% endfor %}
后续新增产品时,只需要在products列表里添加产品名称即可,不用重复写集合配置。
内容的提问来源于stack exchange,提问作者Andrey Langovoy

