Установка дополнительных файлов во время установки с помощью ExtUtils :: MakeMaker / Dist :: Zilla (dzil) - PullRequest
0 голосов
/ 01 ноября 2018

tl; dr Я хочу отправить package.json с моей библиотекой Perl, запустить yarn install (или npm install во время установки) и установить загруженные зависимости JavaScript с модулями Perl.

У меня есть следующее dist.ini:

name = Foobar
version = 1.2.3
license = Perl_5
copyright_holder = Yours Truly
copyright_year   = 2018

[@Filter]
-bundle = @Basic
-remove = GatherDir
[Git::GatherDir]

[Web::FileHeader]
header_filename = EMM-include.pm
file_match = ^Makefile\.PL$

Файл EMM-include.pm содержит метод MY::postamble:

package MY;

use strict;

use Cwd qw(abs_path);
use File::Spec;

sub postamble {
    my ($self) = @_;

    my $here = Cwd::abs_path();
    my $libdir = File::Spec->catdir($here, 'lib', 'Foobar');
    chdir $libdir or die;
    0 == system 'yarn', 'install' or die;
    chdir $here or die;

    return '';
}

Плагин [Web::FileHeader] берет файл и исправляет его в начале Makefile.PL.

Тогда есть lib/Foobar/package.json:

{
  "name": "foobar",
  "version": "1.2.3",
  "main": "index.js",
  "dependencies": {
    "ajv": "^6.5.4"
  }
}

Раздел MY::postamble из EMM-include.pm вызывает yarn install (замените его на npm install, если у вас нет yarn) и заполните каталог lib/Foobar/node_modules с помощью ajv и его зависимостей.

Наконец, должен быть модуль lib/Foobar.pm:

package Foobar;
# ABSTRACT: Just a test.
1;

То, что почти работает как задумано: дистрибутив может быть создан с помощью dzil build. В каталоге распространения perl Makefile.PL вызывает yarn install, каталог lib/Foobar/node_modules заполняется, но файлы там не устанавливаются с make install.

Если я запускаю perl Makefile.PL во второй раз, все работает, зависимости JavaScript превращают его в blib/, а make install устанавливает модули JavaScript вместе с модулями Perl.

Доставка зависимостей JavaScript вместе с дистрибутивом невозможна. Их уже слишком много, и они могут иметь конфликтующие лицензии (я использую GPLv3 здесь). Скачивая deps во время выполнения, после установки в большинстве случаев произойдет сбой из-за отсутствия привилегий.

Правда, это не имеет ничего общего с Dist::Zilla, это скорее проблема с ExtUtils::MakeMaker. Но я на самом деле использую Dist::Zilla здесь.

В случае, если это имеет значение, реальное распределение - https://github.com/gflohr/qgoda, а последний коммит на момент написания статьи - https://github.com/gflohr/qgoda/commit/3f34a3dfec8da665061432c3a8f7bd8eef28b95e.

1 Ответ

0 голосов
/ 01 ноября 2018

Во-первых, вместо того, чтобы использовать [Web :: FileHeader] для изменения вашего Makefile.PL, замените [MakeMaker] (используемый @Basic) на [MakeMaker :: Awesome], который позволяет вам напрямую изменять Makefile.PL, и правильно включает dynamic_config, так как ваш дистрибутив нуждается в этом. Кроме того, не давайте вашему включаемому файлу расширение .pm, поскольку оно не является модулем perl, и исключите его из сбора в получившийся дистрибутив, чтобы он случайно не был установлен.

[@Filter]
-bundle = @Basic
-remove = GatherDir
-remove = MakeMaker
[Git::GatherDir]
exclude_filename = EMM-include
[MakeMaker::Awesome]
header_file = EMM-include

Я настоятельно рекомендую использовать мой @ Starter bundle вместо устаревшего @Basic, но если нет, то хотя бы добавьте [MetaJSON], чтобы у вас были современные метаданные.

[@Starter::Git]
revision = 3
installer = MakeMaker::Awesome
Git::GatherDir.exclude_filename[] = EMM-include
MakeMaker::Awesome.header_file = EMM-include

Относительно того, что нужно сделать во время установки. Во-первых, я предупреждаю, что требование установки интернет-соединения - это не то, на что вы всегда можете положиться, и, конечно же, нет доступной пряжи. Но серия модулей Alien для установки внешних библиотек часто делает подобные вещи. Поскольку вам не нужно компилировать этот код, вам, вероятно, не понадобится вся установка Alien :: Build / Alien :: Base, но это может оказаться более простым способом решения вашей проблемы, чем взлом Makefile, описанный ниже. По сути, вы сначала должны выпустить дистрибутив Alien, который при необходимости устанавливает вашу библиотеку javascript, а затем этот дистрибутив может зависеть от того, чтобы загрузить библиотеку. Если вы решите следовать этому направлению, проверьте Alien :: Build и IRC-канал # native на irc.perl.org .


Раздел posttamble для ExtUtils :: MakeMaker не предназначен для запуска произвольного кода; это для добавления пользовательских правил в Makefile, который он генерирует; это способ, которым вы должны влиять на процесс создания. Я очень мало знаю о Makefiles, поэтому я не могу помочь вам в этом, все, что я могу предложить, это прочитать все документы EUMM и заметить, что постамбл это функция из MM_Any который вы переопределяете, чтобы добавить свой текст, среди других опций MM_Any и MM_Unix. Вы можете найти людей, которые помогут вам в этом направлении на канале IRC # toolchain на irc.perl.org .

...