windows - 如何配置 Module::Build 以不将文件安装为只读?

标签 windows perl module-build

我遇到过一个场景,我在 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/

相关文章:

mysql - 在 Apache::Sessions:MySQL session 中存储一个复杂的散列

mysql - Windows 上正确的 "chmod"Perl 模块文件是什么?

perl - 使用 Module::Build 运行时如何将参数传递给 Perl 测试

regex - Perl - 无法去除空行

perl - 下载 CPAN 模块分发存档:I18N::Langinfo

perl - 如何确保使用 Module::Build 安装没有扩展名的文件?

C# EventLog 无法访问的日志

python - 如何在 Anaconda (Windows 10) 上安装 textract?

windows - 当条件为 True 时对文件执行命令

windows - 如何使用 VB6 或 BAT/CMD 列出连接到我的 WiFi 网络的设备?