日野弥生:勉強しよう
Ruby-Jekyll-HTML静态网站Windows本地部署
利用Ruby和Jekyll框架在本地部署静态网站
发表于2016年07月06日
windows-Ruby的部署安装
由于是在内网部署安装Ruby,所以考虑过用Linux系统来编译Ruby、用WSL等方法,由于Ruby的编译过程可能有较多不可控的因素,为了尽快满足公司提出的诉求,我还是选择使用能在Windows10系统稳定安装的RubyInstaller,我选择了ruby 3.3.7x64-mingw-ucrt。
主要满足的需求描述:团队成员协同修改文档、统一高效集成的静态网站。
所以如果只是一台机器部署了Ruby,其实也可以在局域网内让不同机器推送代码到该机器统一构建和更新网站内容,并能通过一个IP地址加端口访问到即可。
安装jekyll
/* 安装jekyll */
gem install jekyll bundler
/* 安装 bunder */
bunder install
/* 验证安装 */
bundle exec jekyll -v
/* 输出: jekyll 3.8.4
下载网站模板
在github上找到了一个比较接近于文档风格的网站模板edition-jekyll-template,且同时具备搜索功能。搜索功能很重要,因为客户肯定很自然的希望通过关键词查找到对应信息。
部署构建
/* 根据报错信息:"Dependency Error: Yikes! It looks like you don`t have tzinfo or one of its dependencies installed."提示,需要安装tzinfo */
gem install tzinfo
gem install tzinfo-data
/* 根据模板项目的提示信息,需要下载1.2.0版本以上的jekyll-sitemap */
bundle add jekyll-sitemap --version '>1.4'
gem update --system
/* 新增rexml和webrick库 */
bundle add rexml webrick
解决Ruby3.3.0变量为nil的问题
Windows PowerShell运行下面的执行命令时:
bundle exec jekyll build
出现报错: Ruby33-x64/lib/ruby/3.3.0/logger.rb:384:in ‘level’: undefine method ‘[]’ for nil(NoMethodError).
根据Google Gemini的提示,可能是因为@level_override变量,它在某个时刻变成了nil。即使检查了Fiber.current,但如果@level_override本身就是nil,那么 &. 操作符也无法避免错误。
解决方法:延迟初始化
def level
current_fiber = Fiber.current
if current_fiber
@level_override ||= {} # 延迟初始化,只有为 nil 时才赋值为空哈希
if @level_override[current_fiber]
@level_override[current_fiber]
else
@level
end
else
@level
end
end
解决无法隐式转换的问题
继续执行发现控制台继续报错:no implicit conversion of Hash into Integer。查阅发现有不少帖子有这种问题,大概原因是Ruby版本和Jekyll版本不兼容导致。参见no implicit。
根据描述,把GemFile文件中jekyll的版本改为’3.9.2’,再继续执行,发现网站已经可以在本地构建页面端口访问。
改变部署地址
如果在内网希望改变部署地址,例如部署到一个公共IP地址下,让子网下的其他IP机器都能访问到,可以把host改成当前机器IP,并关闭防火墙,即可实现协同修改文档的需求。例如可以修改为以下IP:
bundle exec jekyll serve --host 192.168.1.25
即可通过访问指定IP机器构建查阅已构建的网站。