4

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

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

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

4

1 回答 1

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,但只需一个单独的步骤可能更容易。

于 2011-07-21T00:01:25.363 回答