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