使用 ExtUtils::MakeMaker/Dist::Zilla (dzil) 在安装时安装附加文件
Installing additional files at install time with ExtUtils::MakeMaker/Dist::Zilla (dzil)
tl;dr 我想用我的 Perl 库发布 package.json
,运行 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"
}
}
EMM-include.pm
中的 MY::postamble
部分调用 yarn install
(如果没有 yarn
,请将其替换为 npm install
)并填充目录 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 and the last commit at the time of this writing is https://github.com/gflohr/qgoda/commit/3f34a3dfec8da665061432c3a8f7bd8eef28b95e。
首先,不要使用 [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
关于安装时需要做什么。首先,我要提醒您,安装时需要互联网连接并不是您可以始终依赖的东西,当然也没有可用的 yarn。但是 Alien series of modules for installing external libraries does this sort of thing often. Since you don't need to compile this code you probably don't need the whole Alien::Build/Alien::Base setup, but it may turn out to be an easier way to solve your problem than Makefile hacking described below. Basically you would first release an Alien distribution which installs your javascript library if necessary, and then this distribution could depend on that to load the library. If you decide to pursue this direction, check out Alien::Build, and the IRC channel #native on irc.perl.org.
ExtUtils::MakeMaker 的后同步码部分不适用于 运行 任意代码;它用于将自定义规则添加到它生成的 Makefile 中;这是您需要影响制作过程的方式。我对 Makefile 知之甚少,所以我不能在这里进一步帮助你,我只能建议阅读所有 EUMM docs and note that the postamble is a function from MM_Any which you override to add your text, among other options from MM_Any and MM_Unix. You may be able to find people to help you in this direction on the IRC channel #toolchain on irc.perl.org.
tl;dr 我想用我的 Perl 库发布 package.json
,运行 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"
}
}
EMM-include.pm
中的 MY::postamble
部分调用 yarn install
(如果没有 yarn
,请将其替换为 npm install
)并填充目录 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 and the last commit at the time of this writing is https://github.com/gflohr/qgoda/commit/3f34a3dfec8da665061432c3a8f7bd8eef28b95e。
首先,不要使用 [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
关于安装时需要做什么。首先,我要提醒您,安装时需要互联网连接并不是您可以始终依赖的东西,当然也没有可用的 yarn。但是 Alien series of modules for installing external libraries does this sort of thing often. Since you don't need to compile this code you probably don't need the whole Alien::Build/Alien::Base setup, but it may turn out to be an easier way to solve your problem than Makefile hacking described below. Basically you would first release an Alien distribution which installs your javascript library if necessary, and then this distribution could depend on that to load the library. If you decide to pursue this direction, check out Alien::Build, and the IRC channel #native on irc.perl.org.
ExtUtils::MakeMaker 的后同步码部分不适用于 运行 任意代码;它用于将自定义规则添加到它生成的 Makefile 中;这是您需要影响制作过程的方式。我对 Makefile 知之甚少,所以我不能在这里进一步帮助你,我只能建议阅读所有 EUMM docs and note that the postamble is a function from MM_Any which you override to add your text, among other options from MM_Any and MM_Unix. You may be able to find people to help you in this direction on the IRC channel #toolchain on irc.perl.org.