Glang的Lua解释器编译

 go教练   2019-08-05 15:43   185 人阅读  0 条评论

Lua解释器编译为可执行文件。

支持热部署自动刷新功能,实时编辑/实时预览。

自包含的Algernon应用程序可以压缩到存档(以.zip或.alg结尾),支持子启动时加载。

内置支持Markdown,Pongo2,Amber,Sass(SCSS),GCSS和JSX。

默认情况下,使用Redis作为数据库后端,如果没有可用的Redis服务器,Algernon将使用内置的Bolt数据库。

可以对Markdown渲染的HTML页面指定以MultiMarkdown语法的标题:

title: Title内容。

后台无需要文件转换器(如SASS)即可进行文件转化。

如果设置了autorefresh,源文件时自动刷新页面。

交互式REPL。

如果Markdown文件名作为第一个参数,则它将在端口3000上提供预览,无需任何数据库。方便在本地查看README.md文件。

完全多线程。将使用所有可用的CPU。

支持通过tollbooth进行速率限制。

Lua REPL提供了帮助命令,可快速浏览可用的Lua功能。

可以加载用任何语言编写的插件。插件必须提供Lua.Code和Lua.Help函数,并通过stderr + stdin来交互JSON-RPC。

内置线程安全文件缓存,具有多种可用缓存模式(例如,仅用于缓存图像)。

可以读取并保存到JSON文档。支持简单的JSON路径表达式(如简单版本的XPath,但对于JSON)。

支持缓存压缩,可以将缓存中存储的文件直接从缓存发送到客户端,无需解压缩。

对大于4096B的文件发送到客户端的文件默认使用gzip压缩。

使用PostgreSQL作为后端数据库时候,默认使用HSTORE键/值类型(PostgreSQL 9.1或更高版本)。

没有外部依赖,纯Golang程序。

需要Go 1.12或更高版本。另外用于QUIC支持的包不支持使用gccgo(GCC)构建。

安装

OS X

苹果OS X系统可以使用包管理器直接安装:

brew install algernon

如果没有安装Homebrew包管理器,请先安装。

Arch Linux

可以使用AUR源安装:

pacman -S algernon

二进制包

其他系统请下载对应二进制包即可使用。

 微信截图_20190805094408.png

源码安装

从源码编译安装,适用于任何系统。用get命令从官方主分支下载最新源码

get -u github/xyproto/algernon

使用该方法安装,需要先设置GOPATH, 并将$GOPATH/bin添加到执行PATH中

export GOPATH =~/go

export PATH = $PATH:$GOPATH/bin

也可以先git clone到本地然后编译安装

Golang 1.12版本

 微信截图_20190805094418.png

早期Golang版本

 微信截图_20190805094426.png

docker容器

 微信截图_20190805094437.png

Algernon基本使用

运行Algernon:

 微信截图_20190805094449.png

以开发者模式运行

algernon -e

该命令启用调试模式,以内置的Bolt数据库,以HTTP形式启动,并对除了以下类型的其他文件启用缓存,这些类型包括Pongo2,Amber,Lua,Sass,GCSS,Markdown和JSX。

新建一个简单的hello lua文件index.lua:

 微信截图_20190805094459.png

浏览器访问,结果如下:

 微信截图_20190805094508.png

自定义Algernon应用程序

创建应用目录:

mkdir mypage && cd mypage

创建名为index.lua的文件,其中包含以下内容和上面一样。

启动:

algernon --httponly --autorefresh .

启动增加参数autorefresh,使得文件编辑后可以热加载实时生效。可以试着编辑下index.lua并刷新浏览器以查看新结果。

注意—autorefresh对Markdown,Pongo2和Amber页面也生效,比如我新建一个chongchong.md页面:

 微信截图_20190805094527.png

然后浏览器访问:

 微信截图_20190805094538.png

HTTP/2 和HTTPS支持应用

利用openssl创建创建自签名证书,仅用于测试:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 3000 -nodes

结果中,按照提示中按Return键,在Common Name时候输入任意名称,我们输入的是CC,就会在本目录生成cert.pem和key.pem两个证书文件

启动

algernon .

然后通过浏览器以https访问:

https://localhost:3000

由于使用子签名证书,没有添加根域证书,需要在浏览器添加信息才能访问。

 微信截图_20190805094601.png

注意https头信息,确实是HTTP/2。

Lua支持

基本的Lua功能

//返回服务器的版本字符串。

version() -> string

//睡眠给定的秒数(可以是浮点数)。

sleep(number)

//将给定的字符串记录为信息。采用可变数量的字符串。

log(...)

//将给定的字符串记录为警告。采用可变数量的字符串。

warn(...)

//将给定的字符串记录为错误。采用可变数量的字符串。

err(...)

//返回1970年的纳秒数(Unix时间)

unixnano() -> number

//将Markdown转换为HTML

markdown(string) -> string

//返回运行REPL或脚本的目录。如果给出了文件名(可选),则返回脚本运行的路径,使用路径分隔符和给定的文件名连接。

scriptdir([string]) -> string

//返回运行服务器的目录。如果给出了文件名(可选),则返回服务器运行的路径,使用路径分隔符和给定的文件名连接。

serverdir([string]) -> string

Lua插件

//在给定可执行文件路径的情况下加载插件。成功时返回true。如果在Lua提示符上调用,将返回插件帮助文本。

Plugin(string)

//给定一个插件路径,返回插件中Lua.Code函数返回的Lua代码。可能会返回一个空字符串。

PluginCode(string) -> string

//获取插件路径,函数名称和参数。如果函数调用失败,则返回空字符串;如果成功,则返回结果为JSON字符串。

CallPlugin(string, string, ...) -> string

Lua代码库函数

这些函数可以与插件函数结合使用,用于存储加载serverconf.lua时插件返回的Lua代码,然后在处理请求时检索Lua代码。

//创建或使用代码库对象。 (可选)将数据结构名称作为第一个参数。

CodeLib([string]) -> userdata

//给定命名空间和Lua代码,将给定代码添加到命名空间。成功时返回true。

codelib:add(string, string) -> bool

//给定命名空间和Lua代码,将给定代码设置为命名空间中的唯一代码。成功时返回true。

codelib:set(string, string) -> bool

//给定命名空间,返回Lua代码或空字符串。

codelib:get(string) -> string

//将给定命名空间中的(eval)代码导入当前的Lua状态。成功时返回true。

codelib:import(string) -> bool

//完全清除代码库。成功时返回true。

codelib:clear() -> bool

Lua文件上传函数

//创建文件上传对象。采用表单ID(来自POST请求)作为第一个参数。将可选的最大上载大小(以MiB为单位)作为第二个参数。

//失败时返回nil和错误字符串,成功时返回userdata和空字符串。

UploadedFile(string[, number]) -> userdata, string

//返回客户端指定的上传文件名

uploadedfile:filename() -> string

//返回已接收数据的大小

uploadedfile:size() -> number

Lua处理请求函数

//设置页面的Content-Type。

content(string)

//返回请求的HTTP方法(GET,POST等)。

method() -> string

//将文本输出到浏览器/客户端。采用可变数量的字符串。

print(...)

//返回请求的URL路径。

urlpath() -> string

//返回请求中的HTTP标头,给定键或空字符串。

header(string) -> string

//在给定键和值的情况下设置HTTP标头。

setheader(string, string)

更多函数支持请参考官方文档,此处略。

Markdown支持

Algernon实现对Markdown的快速浏览,实现在线webMarkdown查看器。-m标志用来启动:

algernon -m README.md在浏览器中查看README.md。

除了常规的Markdown语法之外,Algernon还支持在Markdown文件的顶部设置页眉标题和语法高亮样式,如下所示:

 微信截图_20190805094731.png

该代码将使用highlight.js突出显示代码,并提供多种样式。

replace_with_theme后面的字符串将用于替换当前主题字符串与给定字符串。这使得可以为一个主题使用一个图像(如logo_default_theme.png)。主题可以是light,dark,redbox,bw,github,wing,material,neon,default,werc或CSS文件的路径。或者同一目录下的style.gcss文件自定义的样式。

范例和截图

官方提供了大量的范例可以供使用,可以在官方仓下载samplepack.zip安装包,解压到web目录更目录然后通过浏览器就可以访问。

 微信截图_20190805094752.png

bootstrap小应用

 微信截图_20190805094803.png

hyperapp计数

 微信截图_20190805094815.png

这是在启用调试模式时处理Lua脚本中的错误的方法。

three.js

Algernon Charles Swinburne的一首诗,背景中有三个旋转的圆环。使用CSS3高斯模糊,使用three.js作为3D图形。

 微信截图_20190805094859.png

prettify代码美化

美化样本的屏幕截图,由单个Lua脚本提供。

 微信截图_20190805094920.png

todo小程序

 微信截图_20190805094937.png

使用Alact和Algernon交互使用

tiles图片拼图小游戏

 微信截图_20190805095003.png

以上就是今天给大家介绍的Glang的Lua解释器编译,如果你还想了解更多关于golang的知识技巧,可以持续关注我们http://www.fastgolang.com

本文地址:http://www.fastgolang.com/127.html
版权声明:本文为原创文章,版权归 go教练 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?