代码之家  ›  专栏  ›  技术社区  ›  Guido Flohr

在安装时使用ExtUtils::MakeMaker/Dist::Zilla(dzil)安装其他文件

  •  1
  • Guido Flohr  · 技术社区  · 7 年前

    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"
      }
    }
    

    这个 我的邮戳 节自 EMM-包括.pm 调用 纱线安装 (替换为 npm安装 如果你没有 yarn )并填充目录 lib/Foobar/node_modules ajv 以及它的依赖关系。

    最后,必须有一个模块 lib/Foobar.pm :

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

    几乎 dzil build . 在分发目录中, perl Makefile.PL 调用 lib/Foobar/node\u模块 make install .

    如果我跑了 perl生成文件.PL blib/ 制作和安装

    将JavaScript依赖项与发行版一起传送不是一个选项。它们已经太多了,并且可能有冲突的许可证(我在这里使用GPLv3)。在运行时下载deps,在安装之后,由于缺少特权,大多数情况下都会失败。

    没错,这和 Dist::Zilla ExtUtils::MakeMaker 分布:Zilla 在这里。

    如果有关系,真正的分配是 https://github.com/gflohr/qgoda https://github.com/gflohr/qgoda/commit/3f34a3dfec8da665061432c3a8f7bd8eef28b95e .

    1 回复  |  直到 7 年前
        1
  •  2
  •   Grinnz    7 年前

    首先,不要使用[Web::FileHeader]修改Makefile.PL,而是将[MakeMaker](由@Basic使用)替换为[MakeMaker::Awesome],这样可以直接修改Makefile.PL,并正确启用动态配置,因为您的发行版需要它。另外,不要给include文件一个.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 hacking更容易解决您的问题。基本上,您应该首先发布一个外来发行版,在必要时安装javascript库,然后这个发行版可以依赖它来加载库。如果你决定追求这个方向,那就去看看吧 Alien::Build #native on irc.perl.org .


    EUMM docs 注意,postamble是来自 MM_Any #toolchain on irc.perl.org .

    推荐文章