【问题标题】:Perl Module Resource Files [duplicate]Perl 模块资源文件 [重复]
【发布时间】:2014-01-01 00:25:09
【问题描述】:

有没有办法用 Perl 模块轻松打包资源文件?现在,我正在使用 %INC 查找模块的位置,然后加载我的资源文件,但我正在寻找 Perl 将自动引用正确路径的解决方案(类似于 Java 的类资源的工作方式)。

【问题讨论】:

  • 我没有时间回答,但您可能想查看__DATA__ 部分、FindBin 模块、Dist::Zilla 等分发创建工具和@987654324 等存档打包程序@ (用 Java 语言创建一个带有 JVM 的 JAR)。您还可以搜索 CPAN 以了解现有模块如何解决此问题。

标签: perl module resource-files


【解决方案1】:

%INC 的方法其实还不错。

如果你希望它是通用的,你可以将它包装在一个小模块中,并使用caller(0) 来获取父模块(caller(0) 将返回一个数组,其第二个元素将与您的 %INC 值相同模块)

这是我的示例代码(我对其进行了测试,但为简洁起见不包含完整的测试代码):

package ModulePath;
# This module can be used for getting resource files
# In the same directory as a Perl module
use File::Basename;
use File::Spec;

sub path {
    my @c=caller(0);
    return dirname($c[1]);
}   

sub default_resource {
    my $resource_suffix = shift || "txt";
    my @c=caller(0);
    my @suffixes = ("pm");
    my ($name,$path,$suffix) = fileparse($c[1], @suffixes);
    my $file = File::Spec->catfile(dirname($c[1]), "$name$resource_suffix");
    return $file;
}

1;

这是 SYNOPSIS(来自我刚刚编写和测试的名为“p/a.pm”的库)

# Get directory, supply resource file name
my $path = ModulePath::path();
my $file = File::Spec->catfile($path,"b.txt"); 

# Get default resource (module name with ".txt" suffix)
my $file2 = ModulePath::default_resource();

# Get resource with default name (same as module) but non-default suffix
my $file3 = ModulePath::default_resource("dat");

测试结果(节选):

$VAR2 = 'C:\\_Code\\so\\20864526\\p\\b.txt';
$VAR1 = 'C:\\_Code\\so\\20864526\\p\\a.txt';
$VAR1 = 'C:\\_Code\\so\\20864526\\p\\a.dat';

【讨论】:

  • 注意 - 可能有一个 CPAN 模块可以做到这一点,但“不止一种方式......”......而且把它拍在一起很有趣
  • 谢谢。我喜欢这个,但我更喜欢使用公共模块,所以我不需要维护代码。
  • @DByrne - 所以把它包装成一个模块并发布在 CPAN 上:)
【解决方案2】:

File::ShareDir 用于在运行时加载资源。

File::ShareDir::Install orModule::Install::Share or Dist::Zilla::Plugin::ModuleShareDirs or Dist::Zilla::Plugin::ShareDir 用于处理文件的安装时复制。

(您可能想知道为什么 Dist::Zilla 包含两个插件来执行此类操作。阅读 File::ShareDir 文档应该清楚 - File::ShareDir 允许您将资源文件安装在两个不同的位置- 一种按模块名称分组(例如 Foo::Bar),另一种按分发名称分组(例如 Foo-Bar)。当您创建具有多个模块的分发时,这是一个重要的区别。)

【讨论】:

  • 谢谢。这正是我正在寻找的。​​span>
猜你喜欢
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2015-07-13
相关资源
最近更新 更多