Как я могу настроить 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, но, вероятно, проще сделать отдельный шаг.

Другие вопросы по тегам