首页 > 解决方案 > 如何在 perl 中添加库的相对路径?

问题描述

我想要一个库(my_library_1),它使用与其自身相关的文件夹中的另一个库。如果我这样写:

use lib "/./libraries/";
use my_library_2;

它将使用我执行脚本的路径。

如果我按照其他类似问题中的建议使用以下内容:

use FindBin;
use lib "$FindBin::Bin/./libraries/";
use my_library_2;

它将相对于正在执行的主脚本,因此如果我从另一个脚本调用这个库,然后这个库调用另一个(my_library_1),如果第一个库(my_library_1),库声明将不会像预期的那样和主脚本在同一个文件夹中。

如何在不依赖绝对路径的情况下解决此问题?

编辑:添加更多信息这是当前结构:

folder
\_folder_1
 \__main_script
\_folder_2
 \__my_library_1
 \__folder_1
   \___my_library_2

我想用相对路径从 library_2 引用 library_3。当我在“my_library_2”上使用它们时,这两个建议的选项不起作用。

标签: perldeclarationrelative-path

解决方案


lib::relative是一种__FILE__用于添加相对于脚本或模块的绝对 lib 路径的简单方法。它还记录了等效的核心模块命令,因此不需要安装。

在脚本中:

use lib::relative '../folder2';

或者:

use Cwd ();
use File::Basename ();
use File::Spec ();
use lib File::Spec->catdir(File::Basename::dirname(Cwd::abs_path __FILE__), '../folder2');

同样在模块中:

use lib::relative 'folder1';

我建议__FILE__在所有情况下都使用比 FindBin 更简单的方法 - FindBin 是远距离操作,需要变通方法,并且在旧 Perls 上有严重的错误,因为它在 CPAN 上不可用而无法修复。


推荐阅读