电脑太多就会很烦恼,比如经常使用不同的电脑写博客,为了防止博客丢失,我把源文件都存在了云盘上。而 Hexo 框架需要每台机器都装一遍,同步起来后很麻烦,然后就导致我更新越来越少。

方案

1.容器

为了解决这个问题,我首先想到了使用容器,把 Node.js 、Hexo 、等打包到容器里面,然后把 source、themes 等文件挂载上去就能使用了,如果需要在别的机器上运行就把容器复制过去,然后从云盘上挂载 source 等文件就可以用了。

然后 Windows 的 Docker 使用比较麻烦,首先我认为 Windows 的 cmd 和 powershell 不是人用的,所以开发环境我一直使用 Mac 和 Linux 等类 Unix 系统。使用 windows 的时候就用 ubuntu subsystem,虽然 subsystem 能带来不错的 Bash 体验,但实际上还是有一些毛病,在这次尝试的时候就暴露出来了。

首先子系统里面不能启动 Docker daemon,需要在外面的 Windows 启动 Docker ,然后里面的子系统使用 Docker-client 远程连接过来,这都是小事,要命的是文件系统,Windows 内的文件夹并不能通过 docker run -v正确挂载过去。

说到底还是子系统还不够完善,子系统只是翻译了一下 Ubuntu 的 systemcal l过去执行,毕竟内核、文件系统什么的和 Linux 完全不一样,要完全兼容还是比较困难。

当然不依赖子系统直接使用 Windows 上的容器挂载文件也值得尝试,不过我不想用 CMD 也就没有尝试了。

2.Git

第二个方法是使用 git,这也是 V2EX 社区上流传比较开的办法,在 hexo g 生成的博客文件根目录下有个 .gitignore 文件,所以使用 git 过滤掉和系统相关的文件,然后把剩下的文件同步到其他机器上就可以正确运行了。

其实很多人的静态博客,尤其是 Hexo 都是本来就托管在 Github 上的,省钱且方便,所以这个方案非常靠谱。

不过我个人还是不太想把啥都扔到 Github 上,但自己也没有建立私有 Git 服务器,所以就借鉴一下这个方案做了下自己的办法。

3.OneDrive同步

我的方法是把源文件都扔到 OneDrive(或 DropBox 等能在本地文件系统访问的云盘里面都行),然后每台机器把 source、themes 等要用的文件夹都软链接过去。至于哪些文件要同步、哪些不要,就有方法2提到的 .gitignore 文件说了算。

写了一个简单脚本用来初始化这个过程:

#!bin/bash
srcD=/path/to/OneDrive/blog
dstD=/patch/to/blog

#需要同步的文件或目录的列表
overrideFiles="scaffolds source themes _config.yml package.json package-lock.json"

#遍历列表
for x in $overrideFiles
  do
  #删除本地目录里的需要同步的文件
  rm -r $dstD/$x
  #建立软链接到OneDrive
  ln -s $srcD/$x $dstD
  done

这样本地的博客文件就能通过 OneDrive 实时、自动同步了( OneDrive 官方只有 Windows、Mac 客户端,Linux 用户可能需要费点力气)

同步使用这个脚本:

#!/bin/bash

hexo clean  --cwd /path/to/blog
hexo g --cwd /path/to/blog

rsync -r  /path/to/blog/public/ [email protected]:/var/www/html/blog/

总结

其实对大多数人来说,使用 Git 是最好的办法,因为依赖云盘服务还是受制于人(微软)了。有空我用 Gogs 搭一个私人 Git 服务去。