windows – 如何将Module :: Build配置为NOT以只读方式安装文件?

前端之家收集整理的这篇文章主要介绍了windows – 如何将Module :: Build配置为NOT以只读方式安装文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到过一个场景,我在 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的自定义版本,但可能更容易实现单独的步骤.

猜你在找的Windows相关文章