avatar

让Astro的 content 目录支持符号链接


订正

这篇水文发出来没到一个月官方就支持符号链接了PR戳我… 所以大家直接用就可以了。

前言

自打我用 Astro 重写博客后,我开始思考博客文章应该放在项目何处的哲学问题。

我认为博客文章很明显是不随前端框架变化的独立数据源,前端框架只要知道这些数据长什么样子就可以了,而把这些数据提交进前端框架的版本管理里怎么想都不是个好点子。

比如以前在 Hexo 里文章在 source/_posts下,现在 Astro 要求必须放在 src/content,虽然路径变了,但是其实还是同样的文件,所以我做出了一个决定:

将博客文章单独放进一个 Git 仓库中!

思路

对于本地编辑而言,我会在 Astro 的对应目录下创建一个软符号链接来指向真正的文章存放目录:

ln -s ~/dev/docs/blog ~/dev/frontEnd/astro-blog/src/content/blog

记住在.gitignore中排除这个目录,因为符号链接可以被提交进版本管理,但我们并不需要。

而对于 前端仓库的 CI 而言,我会在 Github Action 中将文章对应的 repo checkout 到对应目录:

steps:
  - uses: actions/checkout@v4
  - name: Checkout blog repo
    uses: actions/checkout@v4
    with:
      repository: PaiJi/blog
      ref: main
      path: src/content/blog
      token: ${{ secrets.PAT }}

结局 1

你的 CI 工作得很好,但是你的本地编辑爆炸了,你得到了错误:

UnknownContentCollectionError
Unknown Content Collection Error.

你放弃了,开始把文章复制到 Astro 项目中。

结局 2

你搜索来到了这篇文章,解锁了以下神秘代码,可以让 Vite 老老实实干活:

// astro.config.mjs
export default defineConfig({
  vite: {
    resolve: {
      preserveSymlinks: true,
    },
  },
});

你的项目工作得非常好!你感到十分高兴,并决定当场写一篇文章,叫做《让 Astro 的 content 目录支持符号链接》。

参考

https://github.com/withastro/astro/issues/8262