我怎样才能configuration模块::生成不安装文件为只读?

我已经遇到了一个场景,我将构buildPerl模块作为Windows机器上另一个Build系统的一部分。 我使用Module :: Build的--install_base选项来指定一个临时目录来放置模块文件,直到整个构build系统都可以使用它们。 不幸的是,如果其他文件依赖的文件是只读的,它会尝试删除所有生成的文件,然后重build它们,而不能清除任何只读文件(它试图删除它,它是只读的,这会导致错误。)默认情况下, Module::Build将启用只读位来安装库。

一种select是在构build过程中进行一个新的步骤,从已安装的文件中删除只读位,但由于构build工具的性​​质需要第二个临时目录…呃。

是否有可能configuration一个基于Module::Build的安装程序,当文件安装到–install_base目录时不启用该只读位? 如果是这样,怎么样?

不,这不是一个可配置的选项。 它在modulee::Build::Basecopy_if_modified方法中完成:

 # 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,你可以继承modulee::Build ,重写copy_if_modified来调用基类,然后chmod文件可写。 但是我觉得你只是想安装别人的模块。

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

更新: ysth是正确的; 这是ExtUtils ::安装 ,实际上做最后的副本。 copy_if_modified用于填充blib 。 但ExtUtils :: Install也会将模式硬编码为只读模式。 您可以使用ExtUtils :: Install的自定义版本,但是可能只需要一个单独的步骤即可。