tl;dr我想package.json
随我的 Perl 库一起提供一个,运行yarn install
(或npm install
在安装期间)并使用 Perl 模块安装下载的 JavaScript 依赖项。
我有以下内容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。