时隔快一年了终于想起来把blog整理一下了……
于是做了个迁移,并记录一些过程中出现的问题和思路。
[补档]关于图片插入
主要是需要解决两个问题:1.图片的管理;2.图片引用方式
主要参考了hexo文档的资源文件夹
^1 相关内容,在config.yml
中开启资源文件夹:
1 | post_asset_folder: true |
当资源文件管理功能打开后,Hexo将会在你每一次通过
hexo new [layout] <title>
命令创建新文章时自动创建一个文件夹。这个资源文件夹将会有与这个文章文件一样的名字。将所有与你的文章有关的资源放在这个关联文件夹中之后,你可以通过相对路径来引用它们,这样你就得到了一个更简单而且方便得多的工作流。
然后使用标签插入图片
1 | {% asset_img example.jpg This is an example image %} |
通过这种方式,图片将会同时出现在文章和主页以及归档页中。在上述的情况下,图片资源引用的相对路径的根目录就是对应文章配套的assets文件夹。
这种方法的缺点是标准markdown 编辑器就无法识别图片了。
[补档]关于主题的使用
使用的主题是melody
。
注意现在很多的主题都支持 npm 安装,然后添加主题配置文件(如_config.melody.yml
)实现配置。
blog迁移:GitHub-Actions的使用
之前是为了保证github.io的其他功能(图片站和小工具网页)导致整个repo的结构异常混乱:
于是采用了诡异的操作:在项目文件下建立.blog-src/文件夹储存hexo工程,重定向工程输出到blog/;写自动跳转index.html从 https://dwcarrot.github.io/ 自动跳转至https://dwcarrot.github.io/blog
思来想去还是把blog源文件放在单独的repo下,并使用自动化构建器进行自动发布。
于是需要解决的问题是:如何使得自动git发布能够只修改外部repo的一个子文件夹,并且外部repo自身其他的更新不会导致push失败?
用三个repo的方案 ^2 最后还是被放弃了 刷Commit是坏文明;用三个repo的主要原因是 hexo-deployer-git好像不支持发布到子文件夹。那么有没有能够支持更新到子文件夹的插件呢?不知道
不过其实hexo官方英文版给的方案就不是用hexo-deployer-git的^3,而是基于peaceiris/actions-gh-pages。后者的确是支持发布到子文件夹的! 问题解决。
其实问题在于hexo官方中文版页面和英文版给的方案居然不一样
最后方案是这样的:
Github新建一个
blog
repo 用于存储blog源文件;这里将该repo改为private。生成一对新密钥对用于自动化发布:
在当前目录生成一个 ssh 密钥对。请勿在 repo 文件夹生成并上传到 GitHub
1
ssh-keygen -f ./hexo-deploy
在
blog
repo settings 添加 Depoly keys,Title 为HEXO_DEPLOY_PUB
,Key 为hexo-deploy.pub
文件内的内容,勾选 Allow write access。在
blog-source
repo settings 添加 Secrets。Name Value GIT_EMAIL 填写 Git 邮箱(执行 git config user.email
查看)GIT_USER 填写 Git 用户名(执行 git config user.name
查看)BLOG_DEPLOY_KEY 填写 hexo-deploy
文件内的内容blog内容的迁移和自动化脚本编写。
这里先放出
Github Actions
脚本。在blog源码repo下新建.github/workflows/deploy-blog.yml
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58# This is a basic workflow to help you get started with Actions
name: Deploy Blog Into Github Pages
# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [ master ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "deploy"
deploy:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
- name: Install Node
uses: actions/setup-node@v2
with:
node-version: '14.x'
- name: Cache node modules
uses: actions/cache@v2
env:
cache-name: cache-node-modules
with:
# npm cache files are stored in `~/.npm` on Linux/macOS
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Install Dependencies
run: npm install
- name: Build
run: npm run build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
deploy_key: ${{ secrets.BLOG_DEPLOY_KEY }}
publish_dir: ./public
external_repository: DWCarrot/DWCarrot.github.io
publish_branch: master
destination_dir: blog注意几个要点:
- 可以注意到步骤中没有显式安装
hexo
的步骤。这是因为自动构建时是局部安装hexo
的,受到blog source下的package.json
控制。
本次做的是迁移,就是之前已有的blog源文件是包含这个package.json
的,迁移时把有效文件粘过来就行。如果是要重开一个全新的blog,现在能想到的方法是:全局hexo init <blog-name>
先初始化一个模板然后整体复制过去。
在迁移完成后的blog源文件中,可以执行npm install
->npm run build
|./node_modules/bin/hexo generate
来进行构建,不用全局的hexo,这样可以测试在Github Actions上能不能正常工作。 - 步骤
Deploy
中参数说明:deploy_key
:后面的变量就是blog源文件repo的secrets 设置的变量,即那个密钥私钥;publish_dir
:与_config.yml
中public_dir
对应;external_repository
和publish_branch
:部署目标repo及branch;destination_dir
:部署目标repo的目标子文件夹。注意因为用到子文件夹所以_config.yml
的root
还是要保持一致的;
- 可以注意到步骤中没有显式安装
TODO
- Github Actions 里面 actions/cache的正确使用方式
- 把小工具也迁移出去