在安装 conda 包期间更新 @INC 变量

Posted

技术标签:

【中文标题】在安装 conda 包期间更新 @INC 变量【英文标题】:Updating the @INC variable during installation of a conda package 【发布时间】:2019-07-03 17:14:15 【问题描述】:

我正在尝试安装 Perl 模块的 conda 包。到目前为止,我可以使用conda-build 创建包。为此,我有一个包含 build.shmeta.yaml 文件的配方。

然后我在新环境中使用conda-install 安装它,我希望能够运行位于我刚刚安装的 Perl 模块中的一些 Perl 脚本。

所有这些步骤都运行良好,但是当我运行一些脚本时,我有一个错误提示:

Can't locate PMP/util.pm in @INC (you may need to install the PMP::util module) (@INC contains: /.autofs/home/antoine/anaconda2/envs/testCustomChannel/lib/site_perl/5.26.2/x86_64-linux-thread-multi /.autofs/home/antoine/anaconda2/envs/testCustomChannel/lib/site_perl/5.26.2 /.autofs/home/antoine/anaconda2/envs/testCustomChannel/lib/5.26.2/x86_64-linux-thread-multi /.autofs/home/antoine/anaconda2/envs/testCustomChannel/lib/5.26.2 .)

如您所见,当我执行 Perl 时,似乎无法识别我的 Perl 模块的某些模块。我知道要解决此问题,我可以修改 @INC 变量并将 bin/ 添加到 PATH 并将 lib/ 添加到 PERL5LIB,但我需要在安装模块期间自动执行此过程。

我真的不知道应该在哪里修改环境变量。在创建包的过程中,例如在build.sh 中添加一些东西?或者我应该在安装过程中管理它,如果是这样,我该怎么做?

任何建议将不胜感激,

谢谢

编辑:

meta.yaml =>

% set name = "module_name" %
% set version = "0.8.3" %

package:
  name: " name "
  version: " version "

source:
  git_url: ssh://git@adress/bspcore/perl_module.git

build:
  number: 0

requirements:
  host:
    - perl
    - perl-extutils-makemaker
  run:
    - perl

about:
  home: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  license: xxx
  license_family: xxx
  summary: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Build.sh =>

#!/bin/bash
if [ -f Build.PL ]; then
    perl Build.PL
    perl ./Build
    # Make sure this goes in site
    perl ./Build install --installdirs site
elif [ -f Makefile.PL ]; then
    # Make sure this goes in site
    perl Makefile.PL INSTALLDIRS=site
    make
    make install
else
    echo 'Unable to find Build.PL or Makefile.PL. You need to modify build.sh.'
    exit 1
fi

chmod u+rwx $PREFIX/bin/*
echo "$PREFIX"

编辑 2:

另一个可以帮助你们更好地了解我的情况的编辑。我刚刚意识到,当我构建包时,我的 perl 模块的 lib 文件夹中有 PMP::util 位于 lib/site_perl/5.26.0/Perl_Module 下。我很确定如果我能够将它直接安装在lib/ 文件夹下,它将解决这个问题。但是我不确定如何修改 build.sh 文件来修改我们构建 perl 模块的位置。

【问题讨论】:

你是如何安装 perl 5.26.2 的?您正在运行哪些脚本?你是如何运行它们的? Perl 安装:在 meta.yaml 中,我的要求 run/host 字段中有 -perl。我在我的 perl 模块的 t/ 文件夹中运行了一个测试。我通过运行来调用它:perl <path_to_my_script.t>。 PS:我要编辑我的问题以添加 build.sh 和 meta.yaml 文件:) 感谢您的更新。我之前没有使用过conda,但我想尝试一下。我可以从某处下载您创建的 conda 包吗?然后我可以尝试在我的机器上安装它 我很想这样做,但它是我公司的 perl 模块。我不能分享给任何人... 【参考方案1】:

下面是一个简单示例,说明如何创建一个 conda 包来安装 Perl 模块(依赖于 CPAN 模块),它可能会帮助您解决问题:

在 Linux 上安装 miniconda

$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
$ bash Miniconda3-latest-Linux-x86_64.sh
# NOTE: I answered "yes" on the question:
#   "Do you wish the installer to initialize Miniconda3 ?" in the
#   previous command. This will modify ~/.bashrc
$ source ~/.bashrc # activates base environment
# Next command: Do not automatically activate conda for every terminal window,
# instead run "conda activate" from a given terminal window to
# activate locally. The following command also creates ~/.condarc
$ conda config --set auto_activate_base False

创建包:

perl-hello/meta.yaml

package:
  name: perl-hello3
  version: "1.0"

source:
  path: ../src # NOTE: if you had put "src" in same folder as "meta.yaml", 
               # conda-build would have include the src folder in info/recipe in 
               # the generated package. It is not necessary to include  the 
               # source code in the generated package.

requirements:
  build:
    - perl >= 5.22
    - make

  run:
    - perl >= 5.22

about:
  license: Artistic
  summary: Simple perl function

../src/

$ tree ../src
../src
├── lib
│   └── My
│       └── Module.pm
└── Makefile.PL

../src/Makefile.PL

use utf8;
use ExtUtils::MakeMaker;

WriteMakefile(
    MIN_PERL_VERSION => 5.022000,
    NAME             => 'My::Module',
    VERSION_FROM     => 'lib/My/Module.pm',
    PREREQ_PM        =>
    
        'ExtUtils::MakeMaker' => '7.12',
        'Data::Dump'          => 0,
    ,
    ABSTRACT_FROM    => 'lib/My/Module.pm',
    AUTHOR           => 'Håkon Hægland <hakon.hagland@gmail.com>',
    LICENSE          => 'perl',
);

../src/lib/My/Module.pm

package My::Module;
our $VERSION = 0.01;
use strict;
use warnings;
use Exporter qw(import);

our @EXPORT = qw(hello);
our @EXPORT_OK = @EXPORT;

use Data::Dump;
sub hello 
    print "Hello world!\n";
    my $str = "Testing Perl module Data::Dump";
    dd $str;

1;

build.sh

# PERL_MM_USE_DEFAULT=1  -> automatically answer "yes" on config questions
PERL_MM_USE_DEFAULT=1 cpan App::cpanminus
perl $PREFIX/bin/cpanm Data::Dump
perl Makefile.PL INSTALLDIRS=site
make
make install

请注意,我使用perl $PREFIX/bin/cpanm 运行cpanm。我无法简单地以cpanm 运行它,请参阅Can you rely on the shebang of an installed command during build? 了解更多信息。

构建包

$ conda-build .

(记下生成的输出,并确定生成包的路径。在我的例子中,路径名称是:

/home/hakon/miniconda3/conda-bld/linux-64/perl-hello3-1.0-pl526_0.tar.bz2

上传包到anaconda服务器

在Anaconda Cloud注册一个新用户

安装客户端

$ conda install anaconda-client

登录您的帐户:

$ anaconda login

上传生成的包:

$ anaconda upload /home/hakon/miniconda3/conda-bld/linux-64/perl-hello3-1.0-pl526_0.tar.bz2

测试包(可以在任何 linux 机器上完成):

创建一个新环境:

 $ conda create --name perltest
 $ conda activate perltest

在新环境下安装包:

 $ conda install -c hakonhagland perl-hello3 
 # Alternatively: You can test the package locally before uploading with
 #   "conda install --use-local perl-hello3"

测试包:

 $ perl -E 'use My::Module; hello'
 Hello world!
 "Testing Perl module Data::Dump"

【讨论】:

您好,感谢您抽出宝贵时间帮助我解决此问题。你的回答很有帮助!我将解决它以使我的 Perl 模块正常工作。 我很难理解path : ../src。我一直有一个错误,比如说它不能复制我的 perl 模块的内容。我试图效仿你的榜样。虽然我的情况没有这个问题,因为源代码来自 GitHub :) 但是我仍然无法让它工作,我尝试复制你的小教程,但似乎你把 perl 模块的路径相对于食谱文件夹对吗? 通过使用path: ../src,我避免将源代码合并到生成的 conda 包中。如果我将src 文件夹与build.sh 放在同一文件夹中,然后在meta.yaml 中使用path: srcconda-build 将在生成的包中包含info/recipe 中的src 文件夹。 @AntMau 我已更新我的答案以包括从 Anaconda Cloud 安装。现在你可以使用conda install -c hakonhagland perl-hello3 测试我的包,如果你愿意的话! 你好,我又来找你了。我按照你的教程从头开始安装包。我已经能够做到,但我找不到Data::Dumper in @INC。首先,如果在 build.sh 我有 perl $PREFIX/bin/cpanm Data::Dump,则构建失败,说文件 cpanm 不存在。我看了看,实际上我有一个cpan 脚本,但没有cpanm 脚本。如果我改用perl $PREFIX/bin/cpan Data::Dump,则构建工作很艰难,但在那之后,如果我尝试通过运行$ perl -E 'use My::Module; hello'测试模块,我有这个错误:Can't locate Data/Dump.pm in @INC

以上是关于在安装 conda 包期间更新 @INC 变量的主要内容,如果未能解决你的问题,请参考以下文章

如何卸载用conda命令安装的包

python conda 环境变量 pip默认安装目录

Window安装Anaconda后,conda不是内部或者外部命令

conda安装过程和创建虚拟环境

mac conda安装

当安装的包使用 conda 虚拟环境时,如何使 Python 控制台脚本入口点工作?