Lua-In-Xcode & lua-environment

Lua-In-Xcode

前言

Lua 应用场景

  • 游戏开发
  • 独立应用脚本
  • Web 应用脚本
  • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
  • 安全系统,如入侵检测系统

lua-environment

  • Mac 上也可以通过 homebrew 安装,便于版本管理。
brew install lua

如果已经安装了5.3.0,在采用

brew install lua
的时候,就会报错:

Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/lua
Target /usr/local/bin/lua
already exists. You may want to remove it:
  rm '/usr/local/bin/lua'

To force the link and overwrite all conflicting files:
  brew link --overwrite lua

To list all files that would be deleted:
  brew link --overwrite --dry-run lua
devzkndeMacBook-Pro:luatest devzkn$ brew link --overwrite --dry-run lua
Would remove:
/usr/local/bin/lua
/usr/local/bin/luac
/usr/local/include/lauxlib.h
/usr/local/include/lua.h
/usr/local/include/lua.hpp
/usr/local/include/luaconf.h
/usr/local/include/lualib.h
devzkndeMacBook-Pro:luatest devzkn$ brew link --overwrite lua
Linking /usr/local/Cellar/lua/5.2.4_5... 71 symlinks created
devzkndeMacBook-Pro:luatest devzkn$ lua -v
Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
devzkndeMacBook-Pro:luatest devzkn$ brew install lua
Updating Homebrew...
Warning: lua 5.2.4_5 is already installed
  • 自己下载安装
devzkndeMacBook-Pro:ios-Reverse_Engineering devzkn$ curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  271k  100  271k    0     0  73274      0  0:00:03  0:00:03 --:--:-- 73324
devzkndeMacBook-Pro:ios-Reverse_Engineering devzkn$ ls -lrt
total 99520
-rw-r--r--   1 devzkn  staff    278045 Jan  6  2015 lua-5.3.0.tar.gz
devzkndeMacBook-Pro:ios-Reverse_Engineering devzkn$ tar zxf lua-5.3.0.tar.gz
devzkndeMacBook-Pro:ios-Reverse_Engineering devzkn$ ls -lrt
total 99520
drwxr-xr-x   6 devzkn  staff       192 Jan  6  2015 lua-5.3.0
devzkndeMacBook-Pro:lua-5.3.0 devzkn$ make macosx test
cd src && /Applications/Xcode.app/Contents/Developer/usr/bin/make macosx
/Applications/Xcode.app/Contents/Developer/usr/bin/make all SYSCFLAGS="-DLUA_USE_MACOSX" SYSLIBS="-lreadline" CC=cc
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lapi.o lapi.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lcode.o lcode.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lctype.o lctype.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ldebug.o ldebug.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ldo.o ldo.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ldump.o ldump.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lfunc.o lfunc.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lgc.o lgc.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o llex.o llex.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lmem.o lmem.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lobject.o lobject.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lopcodes.o lopcodes.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lparser.o lparser.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lstate.o lstate.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lstring.o lstring.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ltable.o ltable.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ltm.o ltm.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lundump.o lundump.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lvm.o lvm.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lzio.o lzio.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lauxlib.o lauxlib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lbaselib.o lbaselib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lbitlib.o lbitlib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lcorolib.o lcorolib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ldblib.o ldblib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o liolib.o liolib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lmathlib.o lmathlib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o loslib.o loslib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lstrlib.o lstrlib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ltablib.o ltablib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lutf8lib.o lutf8lib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o loadlib.o loadlib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o linit.o linit.c
ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o lmathlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o loadlib.o linit.o 
ranlib liblua.a
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lua.o lua.c
cc -o lua   lua.o liblua.a -lm -lreadline 
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o luac.o luac.c
cc -o luac   luac.o liblua.a -lm -lreadline 
src/lua -v
Lua 5.3.0  Copyright (C) 1994-2015 Lua.org, PUC-Rio
devzkndeMacBook-Pro:lua-5.3.0 devzkn$ sudo  make install
Password:
cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.3 /usr/local/lib/lua/5.3
cd src && install -p -m 0755 lua luac /usr/local/bin
cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/include
cd src && install -p -m 0644 liblua.a /usr/local/lib
cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1
devzkndeMacBook-Pro:lua-5.3.0 devzkn$ lua -v
Lua 5.3.0  Copyright (C) 1994-2015 Lua.org, PUC-Rio
  • 测试HelloWorld
devzkndeMacBook-Pro:luatest devzkn$ touch HelloWorld.lua 
devzkndeMacBook-Pro:luatest devzkn$ open 
devzkndeMacBook-Pro:luatest devzkn$ vi  HelloWorld.lua 
devzkndeMacBook-Pro:luatest devzkn$ cat  HelloWorld.lua 
print("Hello World!");
devzkndeMacBook-Pro:luatest devzkn$ lua  HelloWorld.lua 
Hello World!
devzkndeMacBook-Pro:luatest devzkn$ 

下载xclangspec文件(Add-Lua.sh, Lua.xclangspec)

下载https://github.com/breinhart/…
确认 Xcode 处于关闭状态

  • 切换对应的Xcode
devzkndeMacBook-Pro:Lua-In-Xcode-master devzkn$ sudo xcode-select -s /Applications/Xcode.app
  • 进入Lua-In-Xcode-master目录执行命令’sudo ./Add-Lua.sh’

输入密码

  • 重新打开 Xcode ,并打开你的lua文件 选择功能表上的Editor->Syntax Coloring -> Lua 完成!

交互式编程

devzkndeMacBook-Pro:luatest devzkn$ lua 
Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> print("Hello World!")
Hello World!

脚本式编程

devzkndeMacBook-Pro:luatest devzkn$ lua HelloWorld.lua 
Hello World!
  • 将代码修改为如下形式来执行脚本

在开头添加:#!/usr/local/bin/lua
指定了 Lua 的解释器为 /usr/local/bin directory。加上 # 号标记解释器会忽略它。接下来我们为脚本添加可执行权限
类似与#!/bin/bash 用法。

devzkndeMacBook-Pro:luatest devzkn$ cat *
#!/usr/local/bin/lua
print("Hello World!");
devzkndeMacBook-Pro:luatest devzkn$ chmod +x *
devzkndeMacBook-Pro:luatest devzkn$ ls -lrt
total 8
-rwxr-xr-x  1 devzkn  staff  45 Dec  4 18:19 HelloWorld.lua
devzkndeMacBook-Pro:luatest devzkn$ HelloWorld.lua
Hello World!

注释

--[=[注释内容]=]
--[[
 多行注释
 多行注释
 --]]

Lua 文件 I/O

打开文件操作语句如下:

file = io.open (filename [, mode])
  • mode 的值有:
r    以只读方式打开文件,该文件必须存在。
w    打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
a    以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
r+    以可读写方式打开文件,该文件必须存在。
w+    打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a+    与a类似,但此文件可读可写
b    二进制模式,如果文件是二进制文件,可以加上b
+    号表示对文件既可以读也可以写
  file = io.open("/var/root/lualog.text", "a")
        -- 设置默认输出文件为 test.lua
        io.output(file)
        io.write("--  test.lua 文件末尾注释")
        file:close()
  • 例子:处理http 请求timeout的情况
    local res, code, response_headers = http.request{  
        url = http_url,  
        method = "POST",  
        headers =  
        {  
            ["Content-Type"] = content_type;  
            ["Content-Length"] = #http_body;  
        },  
        source = ltn12.source.string(http_body),  
        sink = ltn12.sink.table(response_body),  
    }
    decode3 = {};
    --notifyMessage("res is:"..res);
    sysLog("《httpPost end 》");
    if(not(res == nil)) then
        sysLog("res:"..res);
        
    else
    --code: timeout
    res= "";
    sysLog("code: "..code);
    
    --输出返回的信息到特定文件
    
    -- 以附加的方式打开只写文件
    file = io.open("/var/root/lualog.text", "a")
    -- 在文件最后一行添加 Lua 注释
    -- 设置默认输出文件为 test.lua
    io.output(file)
    
    if type(response_body) == "table" then
        file:write("--res:"..res.." code:"..code.." response_body:"..table.concat(response_body).."\n")
        else
        file:write("--res:"..res.." code:"..code.." response_body[1]:"..type(response_body).."\n")
    end
    
    -- 关闭打开的文件
    file:close()

    return res,code,decode3
    
    end
  • 记录信息
iPhone:~ root# cat lualog.text 
--res: code:timeout response_body:
--res: code:closed response_body:
--res: code:timeout response_body:
-rw-r--r-- 1 root wheel   104 Dec  6 13:30 lualog.text
/var/root
  • 新增时间格式
        file:write("--time:"..getTime.."res:"..res.." code:"..code.." response_body:"..table.concat(response_body).."\n")
--time:Wed Dec  6 14:16:30 2017res: code:timeout response_body:

知识补充

local getTime = os.date("%c");

%a    abbreviated weekday name (e.g., Wed)
%A    full weekday name (e.g., Wednesday)
%b    abbreviated month name (e.g., Sep)
%B    full month name (e.g., September)
%c    date and time (e.g., 09/16/98 23:48:10)
%d    day of the month (16) [01-31]
%H    hour, using a 24-hour clock (23) [00-23]
%I    hour, using a 12-hour clock (11) [01-12]
%M    minute (48) [00-59]
%m    month (09) [01-12]
%p    either “am” or “pm” (pm)
%S    second (10) [00-61]
%w    weekday (3) [0-6 = Sunday-Saturday]
%x    date (e.g., 09/16/98)
%X    time (e.g., 23:48:10)
%Y    full year (1998)
%y    two-digit year (98) [00-99]
%%    the character ‘%’
  • 如获取当前年月日时分秒
local date=os.date(“%Y-%m-%d %H:%M:%S”);

os.time()--获取当前秒
    原文作者:kunnan
    原文地址: https://segmentfault.com/a/1190000012017455
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞