用jekyll的原因无需多说。这样配置好工作流之后,除了编写内容基本没有什么麻烦的操作(登录在线网页,换编辑器,按照统一格式改文件名之类在我看来都很麻烦。。)。
Ruby的环境管理,包管理方式
- 管理顺序: churby -> ruby -> bundle -> gem -> jekyll
- ruby: 是经常在 web 开发中使用的一种动态语言。
- churby: Ruby 的环境管理工具,用于管理不同版本的 Ruby。
- gem: Ruby 编写的软件包的统称,Jekyll 也是一个 gem。
- bundler: 用于管理项目 gem 的工具,根据 Gemfile 管理不同版本的 gem。bundler自己本身也是gem。
如果用 Python 来类比,关系大概是这样:
| ruby | python |
|---|---|
churby 版本号 |
conda create -n my_env python=版本号;conda activate my_env |
gem install 某个包 |
pip install 某个包 |
bundler install |
pip install -r requirements.txt |
具体配置流程
- 安装ruby
- 按照 Jekyll 网站 的方法,安装 Chruby 和 Ruby-install。
- 切换到对应版本的 Ruby。
- 在 macOS 中我遇到的问题是系统中已经安装了 Miniforge3,其中包含了 OpenSSL,但不能正常使用。通过 Homebrew 安装 OpenSSL@1.1 解决。
- 本地配置
- 选择一个博客主题,例如 So Simple,fork 对应主题的 GitHub 代码,然后根据自己的需要修改
_config.yml。 - 运行
bundler install安装项目所需的 gem。 - 运行
bundle exec jekyll serve,此时可以在本地进行预览。
- 选择一个博客主题,例如 So Simple,fork 对应主题的 GitHub 代码,然后根据自己的需要修改
- 利用 GitHub Actions 部署到 GitHub Pages
- 将下面的 Action 脚本添加到项目的
.github/workflows/main.yml文件。等待执行完成,可以通过浏览器访问http://name.github.io/base_url/。
name: Homepage Project Deploy to GitHub Pages on: push: branches: - master #设置每次将代码推送到 master 分支时自动执行 permissions: contents: write jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up ruby and gems uses: ruby/setup-ruby@v1 #如果用ruby install的话好像没法切换版本 with: ruby-version: '3.2' # Not needed with a .ruby-version file bundler-cache: true # runs 'bundle install' and caches installed gems automatically - name: Build and deploy run: | bundle exec jekyll build echo 'personal-homepage' > _site/CNAME cp _site/index.html _site/404.html touch _site/.nojekyll #必须的,gh-pages分支没有环境,必须要跳过build env: JEKYLL_ENV: production - name: Deploy to GitHub Pages uses: JamesIves/github-pages-deploy-action@releases/v3 with: GITHUB_TOKEN: $ BRANCH: gh-pages FOLDER: _site- 因为actions里有写入操作,需要先去账户生成一个有权限的token。具体参考github文档
- 还需要在repo setting里把gh-pages设置为pages对应的branch 。
- 将下面的 Action 脚本添加到项目的
- 更新内容:
- 在
docs/_posts中更新内容。因为我平时笔记都是在 Obsidian 中编辑的,决定在 Obsidian 中设置一个文件夹,然后将每篇笔记同步到docs/_posts文件夹中。 - 用obsidian的优点:
- Markdown 格式, 包括Front Matter在 Obsidian 中显示非常舒适。
-

- 利用 Obsidian 的
update-time-on-edit插件,可以自动更新last_modified_date。 - 利用 Obsidian 的
unique note插件,可以通过点击生成符合格式的笔记模板。
- 在
- 同步:
- 大部分 Obsidian 的 Markdown 格式是直接兼容的。为了同步,我编写了一个 Bash 脚本
sync_homepage.sh,把双链改成 Markdown 链接,并将文章中链接的图片同步到docs/attachment文件夹下。 - 注意代码块可能会解析错误,所以在脚本里把ruby的代码块都替换成Liquid语法。
- 问题:目前不支持增量同步,每次同步都需要遍历所有文件,但由于都是文本文件,影响较小。
- 大部分 Obsidian 的 Markdown 格式是直接兼容的。为了同步,我编写了一个 Bash 脚本
- 和raycast联动:
- 然后给脚本设置raycast的标记。这样每次在obsidian里面编辑完,直接用raycast快捷键同步。
- 脚本太多输出会导致raycast卡死

sync_homepage.sh 示范:
其他配置
- 配置位置:
- 我的模版调用顺序是
_layouts/default.html->_includes/scripts.html->includes/对应功能.html - 调整页面文字宽度: 我的模版中是调整
_page.scss和_variables.scss中的对应参数
- 我的模版调用顺序是
- 配置latex风格的公式:
- 用mathjax@3 : 只支持
$$...$$风格的语法,需要在Mathjax的tex里面配置一下支持一般的$...$语法<script> MathJax = { tex: { tags: "ams", // eq numbering options: none, ams, all inlineMath: [['$', '$'], ["\\(", "\\)"]], // 设置行内数学公式的开始和结束标记 displayMath: [['$$', '$$'], ["\\[", "\\]"]] // 设置行间数学公式的开始和结束标记 }, } </script> - markdown一些符号和mathjax冲突, 由于markdown渲染优先级更高, mathjax里面符号需要用另外的写法:
- mathjax的公式里的竖线和markdown的table的竖线冲突, 而且table的优先级更高: 把竖线用
\vert的方式写 - matrix在mathjax中换行需要
\\\ - mathjax里面不能直接用
#符号, 需要用\texttt{\#} - mathjax里面不会显示括号,
\{, 需要改用\lbrace或\rbrace< >, 需要改用\langle,\rangle
- mathjax的公式里的竖线和markdown的table的竖线冲突, 而且table的优先级更高: 把竖线用
- mathjax渲染是需要联网的
- 用mathjax@3 : 只支持
- 配置google analysis:
- 我用的模版比较老,需要把Universal analysis换成GA4
- 加table of content:
- 模版里的toc也是不能用了,加入这个比较新的toc.html
- 用gist加载代码块:
- 还是因为有些脚本里代码块解析错误,用GitHub gist就没有这个问题, 不过这种代码块的形式obsidian没法渲染
- 加related post:
- 用jekyll默认的
site.related_posts: 默认有10条最近的post, 复杂的筛选规则在github pages上不生效(据说)- 其他方法:
- 添加和toc类似的css显示
- 用jekyll默认的
- 添加collection:
- 关于collection folder不在主文件夹的情况
- 我添加了一个
family的collection, 用grid 布局