You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by "mikyll (via GitHub)" <gi...@apache.org> on 2025/06/30 08:59:42 UTC
[I] bug: cannot set apisix.extra_lua_path in tests via yaml_config or extra_yaml_config [apisix]
mikyll opened a new issue, #12389:
URL: https://github.com/apache/apisix/issues/12389
### Current Behavior
## The Issue
When creating a test file for a custom plugin, it's currently not possible to set a custom path for plugins, via `--- yaml_config` or `--- extra_yaml_config`.
## The Cause
The issue is caused by these lines in [`t/APISIX.pm`](https://github.com/apache/apisix/blob/77dacda31277a31d6014b4970e36bae2a5c30907/t/APISIX.pm#L272-L275):
```perl
my $lua_deps_path = $block->lua_deps_path // <<_EOC_;
lua_package_path "$apisix_home/?.lua;$apisix_home/?/init.lua;$apisix_home/deps/share/lua/5.1/?/init.lua;$apisix_home/deps/share/lua/5.1/?.lua;$apisix_home/apisix/?.lua;$apisix_home/t/?.lua;$apisix_home/t/xrpc/?.lua;$apisix_home/t/xrpc/?/init.lua;;";
lua_package_cpath "$apisix_home/?.so;$apisix_home/deps/lib/lua/5.1/?.so;$apisix_home/deps/lib64/lua/5.1/?.so;;";
_EOC_
```
This is different from [`apisix/apisix/cli/ngx_tpl.lua`](https://github.com/apache/apisix/blob/77dacda31277a31d6014b4970e36bae2a5c30907/apisix/cli/ngx_tpl.lua#L270C1-L276C45), where we put the content of field `apisix.extra_lua_path` config at the beginning of `lua_package_path`:
```lua
# put extra_lua_path in front of the builtin path
# so user can override the source code
lua_package_path "{*extra_lua_path*}$prefix/deps/share/lua/5.1/?.lua;$prefix/deps/share/lua/5.1/?/init.lua;]=]
.. [=[{*apisix_lua_home*}/?.lua;{*apisix_lua_home*}/?/init.lua;;{*lua_path*};";
lua_package_cpath "{*extra_lua_cpath*}$prefix/deps/lib64/lua/5.1/?.so;]=]
.. [=[$prefix/deps/lib/lua/5.1/?.so;;]=]
.. [=[{*lua_cpath*};";
```
### Expected Behavior
I'd like to be able to set a custom path for APISIX plugins, as we have for APISIX runtime via `apisix.extra_lua_path`. Example:
```yaml
apisix:
extra_lua_path: "/usr/local/apisix/apisix/plugins/custom/?.lua"
```
With this configuration, we can place custom plugins in `/usr/local/apisix/apisix/plugins/custom/apisix/plugins/` and APISIX will load them.
### Error Logs
_No response_
### Steps to Reproduce
## Minimal Reproducible Example
File `${apisix_home}/apisix/custom/apisix/plugins/myplugin.lua` (simple custom plugin):
```lua
local plugin_name = "myplugin"
local core = require("apisix.core")
local schema = {
type = "object",
properties = {
message = {
type = "string",
default = "Hello World!\n",
}
}
}
local _M = {
version = 0.1,
priority = 0,
name = plugin_name,
schema = schema,
}
function _M.check_schema(conf, _)
return core.schema.check(schema, conf)
end
function _M.access(conf, _)
return 200, conf.message
end
return _M
```
Test file `t/custom/plugin/extra_path.t`:
```perl
use t::APISIX 'no_plan';
repeat_each(1);
no_root_location();
run_tests;
__DATA__
=== TEST 1: Check apisix.extra_lua_path
Verify that the extra Lua path is included in lua_package_path
--- extra_yaml_config
apisix:
extra_lua_path: "/usr/local/apisix/apisix/plugins/custom/?.lua"
--- config
location /t {
content_by_lua_block {
ngx.say("Content of lua_package_path: ", package.path)
}
}
--- request
GET /t
--- response_body_like
.+/usr/local/apisix/apisix/plugins/custom/.+
=== TEST 2: Try loading the custom plugin "myplugin"
Verify that the custom plugin can be loaded.
--- extra_yaml_config
apisix:
extra_lua_path: "/usr/local/apisix/apisix/plugins/custom/?.lua"
plugins:
- myplugin
--- config
location /t {
content_by_lua_block {
}
}
--- request
GET /t
--- response_body
done
```
If we run the test we obtain the following:
```bash
t/custom/plugin/extra_path.t .. 1/?
# Failed test 't/custom/plugin/extra_path.t TEST 1: Check apisix.extra_lua_path - response_body_like - response is expected (Content of lua_package_path: /usr/local/apisix/?.lua;/usr/local/apisix/?/init.lua;/usr/local/apisix/deps/share/lua/5.1/?/init.lua;/usr/local/apisix/deps/share/lua/5.1/?.lua;/usr/local/apisix/apisix/?.lua;/usr/local/apisix/t/?.lua;/usr/local/apisix/t/xrpc/?.lua;/usr/local/apisix/t/xrpc/?/init.lua;/usr/local/openresty/site/lualib/?.ljbc;/usr/local/openresty/site/lualib/?/init.ljbc;/usr/local/openresty/lualib/?.ljbc;/usr/local/openresty/lualib/?/init.ljbc;/usr/local/openresty/site/lualib/?.lua;/usr/local/openresty/site/lualib/?/init.lua;/usr/local/openresty/lualib/?.lua;/usr/local/openresty/lualib/?/init.lua;./?.lua;/usr/local/openresty/luajit/share/luajit-2.1/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua;)'
# at /usr/local/apisix/../test-nginx/lib/Test/Nginx/Socket.pm line 1731.
# 'Content of lua_package_path: /usr/local/apisix/?.lua;/usr/local/apisix/?/init.lua;/usr/local/apisix/deps/share/lua/5.1/?/init.lua;/usr/local/apisix/deps/share/lua/5.1/?.lua;/usr/local/apisix/apisix/?.lua;/usr/local/apisix/t/?.lua;/usr/local/apisix/t/xrpc/?.lua;/usr/local/apisix/t/xrpc/?/init.lua;/usr/local/openresty/site/lualib/?.ljbc;/usr/local/openresty/site/lualib/?/init.ljbc;/usr/local/openresty/lualib/?.ljbc;/usr/local/openresty/lualib/?/init.ljbc;/usr/local/openresty/site/lualib/?.lua;/usr/local/openresty/site/lualib/?/init.lua;/usr/local/openresty/lualib/?.lua;/usr/local/openresty/lualib/?/init.lua;./?.lua;/usr/local/openresty/luajit/share/luajit-2.1/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua;
# '
# doesn't match '(?^s:.+/usr/local/apisix/apisix/plugins/custom/.+
# )'
# Failed test 't/custom/plugin/extra_path.t TEST 2: Try loading the custom plugin "myplugin" - response_body - response is expected (repeated req 0, req 0)'
# at /usr/local/apisix/../test-nginx/lib/Test/Nginx/Socket.pm line 1685.
# got: ''
# expected: 'done
# '
# Failed test 't/custom/plugin/extra_path.t TEST 2: Try loading the custom plugin "myplugin" - pattern "[error]" should not match any line in error.log but matches line "2025/06/30 08:57:23 [error] 638#638: *2 [lua] plugin.lua:144: load_plugin(): failed to load plugin [myplugin] err: module 'apisix.plugins.myplugin' not found:" (req 0)
# no field package.preload['apisix.plugins.myplugin']
# no file '/usr/local/apisix/apisix/plugins/myplugin.lua'
# no file '/usr/local/apisix/apisix/plugins/myplugin/init.lua'
# no file '/usr/local/apisix/deps/share/lua/5.1/apisix/plugins/myplugin/init.lua'
# no file '/usr/local/apisix/deps/share/lua/5.1/apisix/plugins/myplugin.lua'
# no file '/usr/local/apisix/apisix/apisix/plugins/myplugin.lua'
# no file '/usr/local/apisix/t/apisix/plugins/myplugin.lua'
# no file '/usr/local/apisix/t/xrpc/apisix/plugins/myplugin.lua'
# no file '/usr/local/apisix/t/xrpc/apisix/plugins/myplugin/init.lua'
# '
# at /usr/local/apisix/../test-nginx/lib/Test/Nginx/Socket.pm line 1356.
# Failed test 't/custom/plugin/extra_path.t TEST 2: Try loading the custom plugin "myplugin" - pattern "[error]" should not match any line in error.log but matches line "2025/06/30 08:57:23 [error] 637#637: *1 [lua] plugin.lua:144: load_plugin(): failed to load plugin [myplugin] err: module 'apisix.plugins.myplugin' not found:" (req 0)
# no field package.preload['apisix.plugins.myplugin']
# no file '/usr/local/apisix/apisix/plugins/myplugin.lua'
# no file '/usr/local/apisix/apisix/plugins/myplugin/init.lua'
# no file '/usr/local/apisix/deps/share/lua/5.1/apisix/plugins/myplugin/init.lua'
# no file '/usr/local/apisix/deps/share/lua/5.1/apisix/plugins/myplugin.lua'
# no file '/usr/local/apisix/apisix/apisix/plugins/myplugin.lua'
# no file '/usr/local/apisix/t/apisix/plugins/myplugin.lua'
# no file '/usr/local/apisix/t/xrpc/apisix/plugins/myplugin.lua'
# no file '/usr/local/apisix/t/xrpc/apisix/plugins/myplugin/init.lua'
# '
# at /usr/local/apisix/../test-nginx/lib/Test/Nginx/Socket.pm line 1356.
t/custom/plugin/extra_path.t .. Failed 4/7 subtests
Test Summary Report
-------------------
t/custom/plugin/extra_path.t (Wstat: 0 Tests: 7 Failed: 4)
Failed tests: 2, 5-7
Parse errors: No plan found in TAP output
Files=1, Tests=7, 0 wallclock secs ( 0.01 usr 0.00 sys + 0.18 cusr 0.07 csys = 0.26 CPU)
Result: FAIL
```
As we can see, both tests fail:
- `lua_package_path` doesn't include `/usr/local/apisix/apisix/plugins/custom/?.lua`
- APISIX cannot load custom plugin `myplugin`: `load_plugin(): failed to load plugin [myplugin]`
### Environment
- APISIX version (run `apisix version`): 3.13.0
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] bug: cannot set apisix.extra_lua_path in tests via yaml_config or extra_yaml_config [apisix]
Posted by "Baoyuantop (via GitHub)" <gi...@apache.org>.
Baoyuantop commented on issue #12389:
URL: https://github.com/apache/apisix/issues/12389#issuecomment-3021945712
This looks like a potential missing feature, welcome to submit a PR to improve this.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] bug: cannot set apisix.extra_lua_path in tests via yaml_config or extra_yaml_config [apisix]
Posted by "mikyll (via GitHub)" <gi...@apache.org>.
mikyll commented on issue #12389:
URL: https://github.com/apache/apisix/issues/12389#issuecomment-3249251025
To implement this feature, the only two ways that come up to my mind are the following:
1. parse both `yaml_config` and `extra_yaml_config`, searching for `apisix.extra_lua_path` (and `apisix.extra_lua_cpath`), save the content to a variable, and insert it at the beginning of the related Nginx directive.
Example:
```perl
my $extra_lua_path = "";
my $extra_lua_cpath = "";
# Do stuff (and eventually, if the extra path was found, append ";" to these)
my $lua_deps_path = $block->lua_deps_path // <<_EOC_;
lua_package_path "$extra_lua_path$apisix_home/?.lua;...";
lua_package_cpath "$extra_lua_cpath$apisix_home/?.so;...";
_EOC_
```
2. Use specific block definitions: `extra_lua_path`, `extra_lua_cpath`.
Example:
```perl
my $extra_lua_path = "";
my $extra_lua_cpath = "";
if (defined($block->extra_lua_path)) {
$extra_lua_path = $block->extra_lua_path . ";";
}
if (defined($block->extra_lua_cpath)) {
$extra_lua_cpath = $block->extra_lua_cpath . ";";
}
my $lua_deps_path = $block->lua_deps_path // <<_EOC_;
lua_package_path "$extra_lua_path$apisix_home/?.lua;...";
lua_package_cpath "$extra_lua_cpath$apisix_home/?.so;...";
_EOC_
```
Personally I think the second one is more clean/reliable, since for the first we would need to manually parse the YAML (or install a dependency) 👀
What do you think? @Baoyuantop
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org