如何将Module :: Build配置为NOT以只读方式安装文件?

时间:2011-07-20 22:02:32

标签: windows perl module-build

我遇到过一种情况,我在Windows机器上构建Perl模块作为另一个Build系统的一部分。我使用Module :: Build的--install_base选项来指定放置模块文件的临时目录,直到整个构建系统可以使用它们。不幸的是,如果其依赖的任何文件是只读的,那么其他Build系统会出现问题 - 它会在重建之前尝试删除任何生成的文件,并且它无法清除任何只读文件(它会尝试删除它,它是只读的,这会产生错误。)默认情况下,Module::Build安装其库,并启用只读位。

一个选择是在构建过程中创建一个新步骤,从已安装的文件中删除只读位,但由于构建工具的性​​质,需要第二个临时目录......呃。< / p>

是否可以将基于Module::Build的安装程序配置为在文件安装到--install_base目录时不启用该只读位?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:4)

不,这不是可配置的选项。它是在copy_if_modified中的Module::Build::Base方法中完成的:

# mode is read-only + (executable if source is executable)
my $mode = oct(444) | ( $self->is_executable($file) ? oct(111) : 0 );
chmod( $mode, $to_path );

如果你控制了Build.PL,你可以继承Module::Build并覆盖copy_if_modified来调用基类,然后chmod文件可写。但我得到的印象是你只是想安装别人的模块。

最简单的做法可能是在私人目录中安装Module::Build的副本,然后将其编辑为使用oct(666)(或您想要的任何模式)。然后调用perl -I /path/to/customized/Module/Build Build.PL。或者,(如你所说)只使用标准Module::Build并添加一个单独的步骤来标记之后可写的所有内容。

更新: ysth是对的;实际上是最终副本的ExtUtils::Installcopy_if_modified用于填充blib。但是ExtUtils :: Install也将模式硬编码为只读模式。您可以使用ExtUtils :: Install的自定义版本,但可能更容易实现单独的步骤。