文章

jekyll-安装

关于jekyll

Jekyll使用Ruby脚本根据模板生成静态网页,实现了内容与排版的分离。

模板以嵌入Liquid脚本的HTML格式存放。内容为markdown或者html。


jekyll主题的目录结构

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
59
60
61
62
63
./
├── Gemfile
├── Gemfile.lock
├── LICENSE
├── README.md
├── _config.yml
├── _config.yml.default
├── _data/
├── _includes/
├── _javascript/
├── _layouts/
├── _plugins/
├── _posts/
├── _sass/
├── _site/
├── _tabs/
├── assets/
├── docs/
├── index.html
├── jekyll-theme-chirpy.gemspec
├── package.json
├── rollup.config.js
└── tools/

主题(当前使用主题): jekyll-theme-chirpy
==================================================================================
Gemfile:如果你使用 Bundler 管理 Ruby 依赖,
会列出所有的 gem 依赖,包括 Jekyll 本身和任何插件。


_config.yml: Jekyll 的配置文件
1. 用于指定网站的全局配置选项,例如网站标题、描述、基础URL、默认布局等。
2. 置文件中的选项可以被网站的其他文件引用,以便在生成网站时进行定制和配置

_posts  博客内容
文件名通常遵循 YEAR-MONTH-DAY-title.MARKUP 的命名规则

_pages  其他需要生成的网页,如About页

_layouts:网页排版模板
1. 存放网站的布局模板文件,这些模板定义了不同页面的结构和外观,例如文章页面、首页、标签页面等。
2. 布局模板文件通常使用 Liquid 模板语言编写,它允许你使用变量、条件语句和循环来动态生成页面内容。
3. 在页面的 Front Matter 中通过 layout: default 这样的声明来指定使用哪个布局模板

_includes:被模板包含的HTML片段,可在_config.yml中修改位置
1. 该目录用于存放可重用的页面片段或组件,例如页眉、页脚、导航菜单等。
2. 这些页面片段可以在布局模板中被包含或引用,以便在不同页面中重复使用。
 3. 通过 {% include file.ext %} 标签可以将这些部分包含到布局或页面中 

assets:辅助资源 css布局 js脚本 图片等
1. 存放网站的静态资源文件,例如图片、JavaScript 文件、样式表(非 Sass 格式)、字体文件等。
2. 这些静态资源可以在布局模板或页面中直接引用,以便在网站中显示或使用

_data 动态数据
1. 存放 YAML、JSON 或 CSV 格式的数据文件
2. 在网站的任何地方使用
3. Jekyll 会自动加载这些文件,并可以通过 site.data 访问这些数据

_sites  最终生成的静态网页

_sass:存放 SASS/SCSS 文件
Jekyll 会自动处理这些文件,并将它们编译成 CSS

jekyll-目录结构说明-表格

文件/文件夹 说明
_config.yml 存储配置数据。这些配置中的许多选项都可以从命令行中指定,但在这里指定它们更加容易,并且你不必记住它们
_drafts 草稿是未发布的文章。这些文件的命名格式是没有日期的:title.MARKUP。了解如何使用草稿。
_includes 这些是你的布局和帖子可以混合和匹配的部分,以促进重用。液体标签 {% include file.ext %} 可以用来包括在_includes/file.ext。
_layouts 这些是包装文章的模板。在YAML Front Matter 中逐层选择布局,这将在下一节中介绍。 The liquid tag {{ content }} 用于将内容注入网页。
_posts 可以这么说,这里是你的动态内容。这些文件的命名约定很重要,并且必须遵循以下格式:YEAR-MONTH-DAY-title.MARKUP。可以为每篇文章指定固定链接,但日期和MARKUP语言完全由文件名决定。
_data 格式良好的网站数据应该放在这里。Jekyll引擎将自动加载该目录中的所有数据文件(使用.yml,.yaml,.json或 .csv格式和扩展名),并且可以通过 site.data访问它们。如果目录下有文件 members.yml,则可以通过site.data.members访问该文件的内容。
_sass 是可以导入到 main.scss 中的sass部分,然后将它们处理成一个样式表 main.css ,该样式表定义了你的网站使用的样式。
_site 这是Jekyll完成转换后,生成的网站将被存放的(默认)位置。建议将它添加到 .gitignore 文件中。
.jekyll-metadata 临时文件,这些将帮助Jekyll追踪自上次构建站点后哪些文件未被修改,以及哪些文件需要在下一个版本中重新生成。该文件不会包含在生成的网站中。建议将它添加到.gitignore文件中。
index.*或其他HTML、md 假设该文件具有YAML Front Matter部分,它将由Jekyll进行转换。网站根目录中的任何.html,.markdown,.md 或 .textile 文件或上面未列出的目录也会发生同样的情况。
其他文件/文件夹 除了上面列出之外的其他文件夹和文件(例如css和images文件夹,favicon.ico文件等),将会被逐字复制到生成的网站中。如果你想知道它们是如何布置的,有很多网站已经在使用Jekyll。

工作流程

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
在项目文件夹(含有_config.yml)中运行jekyll build 指令后,jekyll会依次做如下几件事

 1. 加载_layout文件夹内的所有模板,并将其中的{% include xxxx.html %} 字段按照_includes文件夹内对应文件填入 

2.遍历_post文件夹及子文件夹,对所有命名符合yyyy-mm-dd-title.md 格式的博客文件放入 site.posts 变量(按时间倒序),并对其进行解析,根据Front Matter 头的内容套入layout生成对应title的博客

3. 遍历整个项目子目录,扫描所有含Front Matter 头的文件,放入site.pages 变量并根据permalink 字段指定的URL目标位置生成index.html

 4. 在生成过程中,文件中包含的Liquid脚本 {{ content }} 会被解析并替换。Liquid指令包括Object、Tag、Filter三类,其中 

4.1 object是变量,在解析过程中会被直接文本替换,如
 {{ page.title }} 
	
4.2 Tag是控制流,可以做判断和循环,如

 {% if user %} 
       Hello {{ user.name }}! 
 {% else %} 
     {% assign foo = false %} 
     {{ foo }} 
 {% endif %} 

 {% if foo!= true %} 
  This statement is valid.
 {% endif %} 

 {% for product in collection.products %} 
     {{ product.title }} 
 {% endfor %} 


4.3 Filter用于对文本进一步处理

 {{ "fold" | | prepend: {{ site.baseurl }} | append: "/.html" }} 
 {{ "adam!" | capitalize | prepend: "Hello " }} 
Output: Hello Adam!




安装至MacOS

安装jekyll

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
# 依赖:
brew


# 安装: chruby 和 ruby-install
brew install chruby ruby-install xz
    ## 安装之后记得执行 安装过程中提示 source、export的内容
    source /usr/local/opt/chruby/share/chruby/chruby.sh
    source /usr/local/opt/chruby/share/chruby/auto.sh


# 最新的 Ruby 稳定版本
ruby-install ruby 3.1.3
    ## 在安装过程中有的可能需要访问外网,设置http代理即可
    ## 安装过程中会有大量的编译过程,持续大概5-10min
    ## 遇到保存请看下面,<<安装中遇到的问题>>

# 配置.bash_profile
echo "source $(brew --prefix)/opt/chruby/share/chruby/chruby.sh" >> ~/.bash_profile
echo "source $(brew --prefix)/opt/chruby/share/chruby/auto.sh" >> ~/.bash_profile
echo "chruby ruby-3.1.3" >> ~/.bash_profile # run 'chruby' to see actual version
source ~/.bash_profile


# 查看 ruby的版本
ruby -v
    # 应该显示 ruby 3.1.3p185(2022-11-24 修订版 1a6b16756e)或更高版本

# 安装最新的 jekyll
gem install jekyll

安装中遇到的问题

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
1. 执行: ruby-install ruby 3.1.3
报错日志
=======================================================================
...
...
/usr/local/Cellar/openssl@3/3.1.2/include/openssl/evp.h:565:56: note: expanded from macro 'EVP_MD_CTX_get_size'
# define EVP_MD_CTX_get_size(e)        EVP_MD_get_size(EVP_MD_CTX_get0_md(e))
                                                       ^
./openssl_missing.h:219:35: note: expanded from macro 'EVP_MD_CTX_get0_md'
#  define EVP_MD_CTX_get0_md(ctx) EVP_MD_CTX_md(ctx)
                                  ^
/usr/local/Cellar/openssl@3/3.1.2/include/openssl/evp.h:554:1: note: 'EVP_MD_CTX_md' has been explicitly marked deprecated here
OSSL_DEPRECATEDIN_3_0
^
/usr/local/Cellar/openssl@3/3.1.2/include/openssl/macros.h:193:49: note: expanded from macro 'OSSL_DEPRECATEDIN_3_0'
#   define OSSL_DEPRECATEDIN_3_0                OSSL_DEPRECATED(3.0)
                                                ^
/usr/local/Cellar/openssl@3/3.1.2/include/openssl/macros.h:62:52: note: expanded from macro 'OSSL_DEPRECATED'
#     define OSSL_DEPRECATED(since) __attribute__((deprecated))
                                                   ^
ossl_digest.c:262:40: warning: 'EVP_MD_CTX_md' is deprecated [-Wdeprecated-declarations]
    return rb_str_new_cstr(EVP_MD_name(EVP_MD_CTX_get0_md(ctx)));
                                       ^
./openssl_missing.h:219:35: note: expanded from macro 'EVP_MD_CTX_get0_md'
#  define EVP_MD_CTX_get0_md(ctx) EVP_MD_CTX_md(ctx)
                                  ^
/usr/local/Cellar/openssl@3/3.1.2/include/openssl/evp.h:554:1: note: 'EVP_MD_CTX_md' has been explicitly marked deprecated here
OSSL_DEPRECATEDIN_3_0
...
...

1 warning generated.
compiling ossl_ts.c
In file included from ossl_ts.c:10:
In file included from ./ossl.h:171:
./openssl_missing.h:195:11: warning: 'TS_VERIFY_CTS_set_certs' macro redefined [-Wmacro-redefined]
#  define TS_VERIFY_CTS_set_certs(ctx, crts) ((ctx)->certs=(crts))
          ^
/usr/local/Cellar/openssl@3/3.1.2/include/openssl/ts.h:426:11: note: previous definition is here
#  define TS_VERIFY_CTS_set_certs(ctx, cert) TS_VERIFY_CTX_set_certs(ctx,cert)
          ^
ossl_ts.c:829:5: error: incomplete definition of type 'struct TS_verify_ctx'
    TS_VERIFY_CTX_set_certs(ctx, x509inter);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./openssl_missing.h:215:46: note: expanded from macro 'TS_VERIFY_CTX_set_certs'
#  define TS_VERIFY_CTX_set_certs(ctx, crts) TS_VERIFY_CTS_set_certs(ctx, crts)
                                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./openssl_missing.h:195:52: note: expanded from macro 'TS_VERIFY_CTS_set_certs'
#  define TS_VERIFY_CTS_set_certs(ctx, crts) ((ctx)->certs=(crts))
                                              ~~~~~^
/usr/local/Cellar/openssl@3/3.1.2/include/openssl/ts.h:407:16: note: forward declaration of 'struct TS_verify_ctx'
typedef struct TS_verify_ctx TS_VERIFY_CTX;
               ^
1 warning and 1 error generated.
make[2]: *** [ossl_ts.o] Error 1
make[1]: *** [ext/openssl/all] Error 2
make: *** [build-ext] Error 2
!!! Compiling ruby 3.1.3 failed!
=======================================================================
原因: 可能是在编译过程中安装了一些其他依赖,但是没有source、export

解决: 
1. 执行编制过程中安装的依赖提示的 source、export
2. 报错内容是提示openssl版本不兼容的问题,根据查找资料,安装openssl1.1版本及需要安装的依赖: (记得source、export 提示内容)
    brew install openssl readline zlib libyaml
    brew cleanup openssl@1.1

2. 继续重新运行: ruby-install ruby 3.1.3
提示安装成功:
=======================================================================
...
...
installing bundled gems:            /Users/fengshao/.rubies/ruby-3.1.3/lib/ruby/gems/3.1.0
                                    minitest 5.15.0
                                    power_assert 2.0.1
                                    rake 13.0.6
                                    test-unit 3.5.3
                                    rexml 3.2.5
                                    rss 0.2.9
                                    net-ftp 0.1.3
                                    net-imap 0.2.3
                                    net-pop 0.1.1
                                    net-smtp 0.3.1
                                    matrix 0.4.2
                                    prime 0.1.2
                                    rbs 2.7.0
Building native extensions. This could take a while...
                                    typeprof 0.21.3
                                    debug 1.6.3
Building native extensions. This could take a while...
installing bundled gem cache:       /Users/fengshao/.rubies/ruby-3.1.3/lib/ruby/gems/3.1.0/cache
>>> Successfully installed ruby 3.1.3 into /Users/fengshao/.rubies/ruby-3.1.3
=======================================================================
本文由作者按照 CC BY 4.0 进行授权