我在用 perl 编写的应用程序中有一些模块和脚本。对于它的分发,我使用 ExtUtils::MakeMaker
。
模块和脚本的目标操作系统是 Linux。关键是我希望最终用户将模块/脚本安装在非标准目录中,也许在他们自己的目录中,然后他们安装如下:
perl Makefile.PL PREFIX='/YOUR/DIRECTORY'
make
make test
make install
ExtUtils::MakeMaker
通过PREFIX
变量解决modules/scritps 安装目录不规范时的问题。
如何将 PREFIX
字符串的值复制或替换到脚本中?例如,而不是硬代码:
use lib '/YOUR/DIRECTORY';
我想用这样的模板替换它:
use lib '%%PREFIX%%';
其中 %%PREFIX%%
在“编译”时被替换,并且没有设置环境变量 ($ENV{'PREFIX'}
)
感谢您的回答!!
最佳答案
要使用的是 PM_FILTER:
if (!($^O eq 'MSWin32' || $Config{'ccflags'} =~ /-D_?WIN32_?/)) {
# doesn't work on windows: no sed
$opts{'PM_FILTER'} = 'sed -e "s|/usr/share|$(PREFIX)/share|"';
}
它适用于 linux 和除 Windows 之外的几乎所有东西(正如您在评论中看到的那样)。
[已更新以包含更多使用细节:]
use ExtUtils::MakeMaker;
%opts = (
'NAME' => 'myModulesAndScripts',
# ...
);
if (!($^O eq 'MSWin32' || $Config{'ccflags'} =~ /-D_?WIN32_?/)) {
# doesn't work on windows: no sed
$opts{'PM_FILTER'} = 'sed -e "s|/usr/share|$(PREFIX)/share|"';
}
WriteMakefile(%opts);
(正如评论所指出的,您可以尝试在 PM_FILTER 中调用 perl 本身,这样您就不需要窗口检查;但是,在我上面的示例中,我发现 perl 不在 exec 中的实例path 和/usr 的现有 PREFIX 路径已经没问题了...如果需要,您可以直接在普通的 WriteMakefile 参数列表中定义 PM_FILTER。
关于linux - 使用 ExtUtils::MakeMaker 时如何更改脚本/模块中的变量字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5419164/