如何为 conda 构建设置每个 perl 脚本的 perl 路径

How to set each perl script's perl path for a conda build

我已经为此苦苦思索了一段时间,我需要一些帮助。我有一个我开发的漂亮的小 perl 包。效果很好。它有一个简单的安装过程:

perl makefile.PL
make
make install

我一直在尝试编写我的第一个 conda 配方,以便我最终可以使用它在 galaxy 上创建一个通过 bioconda 自动安装的包。

问题是上述过程对于 conda build.sh 脚本来说还不够,我不知道如何使已安装的 perl 脚本的 shebang 行具有正确的 perl 路径。我第一次尝试这个:

perl Makefile.PL INSTALL_BASE=${PREFIX} INSTALLDIRS=site
make
make install

基于我在其他食谱中看到的东西,但这会导致错误:

/Users/rleach/local/miniconda3/conda-bld/vcfsamplecompare_1538773699290/test_tmp/run_test.sh: /Users/rleach/local/miniconda3/conda-bld/vcfsamplecompare_1538773699290/_test_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_pla/bin/vcfSampleCompare.pl: /Users/rleach/local/miniconda3/conda-bld/vcfsamplecompare_1538773699290/_build: bad interpreter: No such file or directory
Tests failed for vcfsamplecompare-v2.005-pl526_0.tar.bz2 - moving package to /Users/rleach/local/miniconda3/conda-bld/broken

我在构建输出中注意到这样的注释:

Renaming build prefix directory,  /Users/rleach/local/miniconda3/conda-bld/vcfsamplecompare_1538773699290/_build_env  to  /Users/rleach/local/miniconda3/conda-bld/vcfsamplecompare_1538773699290/build_prefix_moved_vcfsamplecompare-v2.005-pl526_0_osx-64

所以凭直觉,我在 make install:

之后添加了这个
sed -i.bak 's|_build_env|build_prefix_moved_vcfsamplecompare-v2.005-pl526_0_osx-64|g' ${PREFIX}/bin/vcfSampleCompare.pl

成功了! (无论如何,它让我克服了第一个错误 - 现在它抱怨它应该安装的模块不在 @INC 中。 - 虽然一次只有一件事......)

问题是,我不知道在哪里可以找到字符串 "build_prefix_moved_vcfsamplecompare-v2.005-pl526_0_osx-64"。显然在不同的系统上会有所不同。如果我假设 "build_prefix_moved_" 是静态的,我知道哪些环境变量会给我 "vcfsamplecompare"、"v2.005" 和“64”(甚至可能是 "osx")——但我找不到任何具有价值 "pl526_0" 的东西,所以我似乎没有能力自己完全构建字符串...

那么这里的传统智慧是什么?我应该如何在包中的脚本顶部设置 perl 解释器路径?

正如我所怀疑的那样,您不必向 Makefile.PL 提供 INSTALL_BASE=${PREFIX} 甚至 PREFIX=${PREFIX} 即可使其正常工作。在 PATH 上找到的脚本具有错误的 perl 解释器路径这一事实表明,当 运行 脚本与构建脚本时使用的脚本不同时,可能存在一些可用的 perl 编译版本.这与 @INC.

中不同路径的问题一致

事实证明,meta.yaml 文件在 2 个地方有 perl:在 requirements:build:requirements:host: 下,因此在构建期间使用了 2 个不同版本的 perl 与 运行 在主机上。通过删除 meta.yaml 文件中 requirements:build: 下的那个,只有 1 个版本的 perl,冲突就解决了。 build.sh 文件中只需要:

perl Makefile.PL INSTALLDIRS=site
make
make install

只需确保 meta.yaml 具有:

requirements:
  build:
    - make
  host:
    - perl
  run:
    - perl

perl 放在构建部分下可能很诱人,因为您在 build.sh 脚本中使用了对 perl 的调用,但构建完成后它就在主机上了。