我遇到过一个场景,我在 Windows 机器上构建一个 Perl 模块作为另一个构建系统的一部分。我使用 Module::Build 的 --install_base
选项来指定一个临时目录来放置模块文件,直到整个构建系统可以使用它们。不幸的是,如果它依赖的任何文件是只读的,那么其他构建系统就会出现问题 - 它会尝试在重建它们之前删除任何生成的文件,并且它无法清除任何只读文件(它会尝试删除它,并且它是只读的,这会产生错误。)默认情况下,Module::Build
在启用只读位的情况下安装其库。
一个选择是在构建过程中进行一个新步骤,从已安装的文件中删除只读位,但由于构建工具的性质,它需要第二个临时目录......呃。
是否可以将基于 Module::Build
的安装程序配置为在文件安装到 --install_base 目录时不启用该只读位?如果是,怎么办?
最佳答案
不,这不是一个可配置的选项。它在 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
的副本在私有(private)目录中,然后编辑它以使用 oct(666)
(或您想要的任何模式)。然后调用 perl -I /path/to/customized/Module/Build Build.PL
.或者,(如您所说)只需使用标准 Module::Build
并添加一个单独的步骤以将所有内容标记为可写。
更新: ysth 是对的;这是ExtUtils::Install这实际上是最终的副本。 copy_if_modified
用于填充 blib
.但是 ExtUtils::Install 也将模式硬编码为只读。您可以使用自定义版本的 ExtUtils::Install,但单独执行一个步骤可能更容易。
关于windows - 如何配置 Module::Build 以不将文件安装为只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6769102/