Как я могу настроить Module::Build, чтобы НЕ устанавливать файлы только для чтения?
Я столкнулся со сценарием, в котором я собираю модуль Perl как часть другой системы сборки на компьютере с Windows. Я использую --install_base
опция Module::Build для указания временного каталога для размещения файлов модулей, пока общая система сборки не сможет их использовать. К сожалению, другая система сборки имеет проблему, если какой-либо из ее файлов, от которых она зависит, доступен только для чтения - она пытается удалить любые сгенерированные файлы перед их сборкой и не может очистить файлы только для чтения (она пытается удалить их)., и это только для чтения, что дает ошибку.) По умолчанию Module::Build
устанавливает свои библиотеки с включенным битом только для чтения.
Одним из вариантов будет сделать новый шаг в процессе сборки, который удалит бит только для чтения из установленных файлов, но из-за природы инструмента сборки, который потребует второй временный каталог... тьфу.
Можно ли настроить Module::Build
на основе установщика, чтобы НЕ включить этот бит только для чтения, когда файлы установлены в каталог --install_base? Если так, то как?
1 ответ
Нет, это не настраиваемый параметр. Это сделано в 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, но, вероятно, проще сделать отдельный шаг.