我已经遇到了一个场景,我将构buildPerl模块作为Windows机器上另一个Build系统的一部分。 我使用Module :: Build的--install_base
选项来指定一个临时目录来放置模块文件,直到整个构build系统都可以使用它们。 不幸的是,如果其他文件依赖的文件是只读的,它会尝试删除所有生成的文件,然后重build它们,而不能清除任何只读文件(它试图删除它,它是只读的,这会导致错误。)默认情况下, Module::Build
将启用只读位来安装库。
一种select是在构build过程中进行一个新的步骤,从已安装的文件中删除只读位,但由于构build工具的性质需要第二个临时目录…呃。
是否有可能configuration一个基于Module::Build
的安装程序,当文件安装到–install_base目录时不启用该只读位? 如果是这样,怎么样?
不,这不是一个可配置的选项。 它在modulee::Build::Base
的copy_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的自定义版本,但是可能只需要一个单独的步骤即可。