• Lua require 相对路径


    lua require 加载方式与我们现在熟知的路径系统不太一样,想要知道lua require 方法的工作原理也很简单 随便写一个错误的require 代码即可:

    1 require("lala");
     这样运行会得到一个报错:
     
    复制代码
     1 1>F:GitluatestmetaTest.lua:(56): module 'lala' not found:
     2     no field package.preload['lala']
     3     no file '.lala.lua'
     4     no file 'D:Program Files (x86)LuaStudiolualala.lua'
     5     no file 'D:Program Files (x86)LuaStudiolualalainit.lua'
     6     no file 'D:Program Files (x86)LuaStudiolala.lua'
     7     no file 'D:Program Files (x86)LuaStudiolalainit.lua'
     8     no file 'C:Program FilesLua5.1lualala.luac'
     9     no file 'F:Gitluatestlala.lua'
    10     no file '.lala.dll'
    11     no file 'D:Program Files (x86)LuaStudiolala.dll'
    12     no file 'D:Program Files (x86)LuaStudioloadall.dll'
    13 Stack Traceback:
    14     [C]: in function 'require'
    15     F:GitluatestmetaTest.lua:56: in main chunk
    复制代码
    这里可以很清晰的看见lua require方法搜索一个模块或者文件的流程会依次搜索文件名为lala.lua的文件或者dll
     
    那么这些带有路径的lala.lua文件怎么来的的?很简单lua的模块路径是存在一个全局table package的path和cpath字段里的:
    打印一下

    1 print(package.path);
    运行得到
    复制代码
    1 ;.?.lua;
    2 D:Program Files (x86)LuaStudiolua?.lua;
    3 D:Program Files (x86)LuaStudiolua?init.lua
    4 ;D:Program Files (x86)LuaStudio?.lua;
    5 D:Program Files (x86)LuaStudio?init.lua;
    6 C:Program FilesLua5.1lua?.luac;
    7 F:Gitluatest?.lua
    复制代码
    1 print(package.cpath);
    .?.dll;
    D:Program Files (x86)LuaStudio?.dll;
    D:Program Files (x86)LuaStudioloadall.dll
    是不是很眼熟,是的当require的时候lua解释器会按照path 和cpath里存储的路径替换“?”去查询是否存在该文件,有则加载脚本或者模块亦或是C库。
     
    了解了加载机制我们就可以很方便的去加载任何我们当前脚本依赖的外部模块:
    'require("requiretest.loader");'
    但是又一个问题,当我们想要加载当前脚本的上级目录或者其他目录的怎么办,这时候就需要自己去修改或者是添加相对路径,由于require的查询路径都是
    存储在package.path中的这样我们就可以自行添加:
    1 package.path = package.path ..';..\?.lua';
     
    测试下:在目录requiretest目录下新建loader.lua,在根目录下新建requiretest2目录并新建loader2.lua:
    loader.lua:
    1 require("requiretest2.loader2");
    loader2.lua:
    1 print("requiretest2.loader2");
     
    运行:
    1 requiretest2.loader2

    在项目实际运用时可以根据需求加入相对目录。

    些许浅薄认识 如有不妥之处望请斧正!!!!!

  • 相关阅读:
    设置通过数字证书方式登录远程连接Linux服务器,禁止root账户远程密码方式远程连接服务器
    Windows server 2003 粘滞键后门+提权
    CVE-2017-7494复现 Samba远程代码执行
    SQL盲注学习-时间型
    SQL盲注学习-布尔型
    关于绿盟RSAS使用时遇到的问题
    SQL注入学习
    CentOS7,zabbix3.4通过,zabbix-Java-gateway监控Tomcat
    (转)输入pipt提示:AttributeError: 'module' object has no attribute 'HTTPSConnection'
    pip安装cx_Oracle报错:error code 1 in /tmp/pip-build-root/cx-Oracle
  • 原文地址:https://www.cnblogs.com/zhuawang/p/6765275.html
Copyright © 2020-2023  润新知