首页 > 技术文章 > lua 独立运行 standalone

RobertL 2021-01-10 10:28 原文

  1. 可以为lua.exe创建快捷方式
  2. 快捷方式的文件属性中在目标(...\lua.exe)后附加参数。
  3. 路径、参数:
    • 需要脚本文档文件的路径
    • 可以使用绝对路径或相对路径。
    • 相对路径基于、相对于属性中的起始位置
    • 起始位置即工作目录。
    • 工作目录默认会被作为查找(package)的路径(pacage.path)之一。
    • 脚本中(require)引用的其他文件(包)。建议保持相对位置关系。
    • 可以启用选项(参数)ienters interactive mode after running script; ,保持窗口可见,接收(print)输出。
    • 参见Lua文档7 – Lua Standalone。

或:

  1. 在以上快捷方式中不填写路径(填写选项工作目录)。
  2. 将文档拖放至快捷方式图标(相对于命令行中将文件路径附加到参数后并执行)。

或:

  • 复制链接(而非快捷方式)解释器(lua.exe)到脚本所在文件夹。
    • 进而无需指定工作目录(但也无法指定参数,需要以其为建立快捷方式)。

或:

  • 关联文件类型为解释器(lua.exe)打开,但需要在脚本内指定工作目录(使用lfs库)。

或:(当前方案)

  • 建立脚本,更改为自定义类型(如.luae),关联解释器。
  • 脚本作为启动入口,重命名为目标(Lua)文件一样,并放置在一起(目录)。
    • 启动脚本的内容一致,可以复制,或使用硬链接(不可使用符号连接,其路径仍为原文件)
  • 执行此(启动)脚本,自动设置包路径,(dofile)执行目标脚本。
  • 如:
--print(arg[-1],arg[0],arg[1])
local workingDirectory,fileName=string.match(arg[0],'^(.-)([^\\/]+)%..-$')
package.path=package.path..';'..workingDirectory..'?.lua'
    --..[[other path]]
package.cpath=package.cpath..';'..workingDirectory
dofile(workingDirectory..fileName..'.lua')

或者使用 os.execute 以传递其他选项。

assert(os.execute(
--print((
        arg[-1]
        ..' -i '
        ..' -e "package.path=package.path..[[;'..workingDirectory..'?.lua]]" '
        ..' -e "package.cpath=package.cpath..[[;'..workingDirectory..']]" '
        ..workingDirectory..fileName..'.lua'
))

 

其他:

  • If there is no script in the call, the interpreter name goes to index 0
    • 可以通过参数-e "print(arg[0])"查看。
  • string.match(arg[0],'([^\\/]+)%..-$') 提取文件名(不含后缀)。
  • by calling  os.exit  to terminate
  • 未能获知快捷方式的名字。
  • 可以建立指向快捷方式链接,但系统无法运行,报错(该版本的 ..\lua53.exe - 快捷方式 - 符号连接.exe 与你运行的 Windows 版本不兼容。请查看计算机的系统信息,然后联系软件发布者。)。
  • 设置工作目录是用于 package.path/cpath ,可以手动设置。
  • 指定 package.path 需包含文件后缀(如.lua)(指定 package.cpath 无需指定.dll)。
  • 构建为RunLuaFileOfThisFileName.lua/luae。
  • 以上涉及命令行下带空格的路径。
  • execute更兼容,但低效;load高效,但需要配置路径。
  • 直接运行luae(fileName.luae arg1 ...)无法传递参数(arg)。
    lua[53] fileName.luae arg1 ...
    但这样(指定解释器)的话,不如直接lua fileName.lua arg1 ...(而非luae了,luae特别在于已经绑定打开方式为解释器)。

推荐阅读