我遇到过一种情况,我在Windows机器上构建Perl模块作为另一个Build系统的一部分。我使用Module :: Build的--install_base
选项来指定放置模块文件的临时目录,直到整个构建系统可以使用它们。不幸的是,如果其依赖的任何文件是只读的,那么其他Build系统会出现问题 - 它会在重建之前尝试删除任何生成的文件,并且它无法清除任何只读文件(它会尝试删除它,它是只读的,这会产生错误。)默认情况下,Module::Build
安装其库,并启用只读位。
一个选择是在构建过程中创建一个新步骤,从已安装的文件中删除只读位,但由于构建工具的性质,需要第二个临时目录......呃。< / p>
是否可以将基于Module::Build
的安装程序配置为在文件安装到--install_base目录时不启用该只读位?如果是这样,怎么样?
答案 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::Install。 copy_if_modified
用于填充blib
。但是ExtUtils :: Install也将模式硬编码为只读模式。您可以使用ExtUtils :: Install的自定义版本,但可能更容易实现单独的步骤。