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.