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

2024-01-06

我正在尝试安装 Perl 模块的 conda 包。到目前为止,我可以使用创建包conda-build。为此,我有一个食谱,其中包含build.sh and a meta.yaml files.

然后我使用安装它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例如 ?或者我应该在安装过程中管理它,如果是的话,我该怎么做?

任何建议将不胜感激,

Thanks

Edit :

元.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

构建.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}"

Edit 2 :

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


以下是如何创建安装 Perl 模块(依赖于 CPAN 模块)的 conda 包的简单示例,可能会帮助您解决问题:

在 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 <hako[email protected] /cdn-cgi/l/email-protection>',
    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

请注意,我跑了cpanm using perl ${PREFIX}/bin/cpanm。我无法简单地运行它cpanm, see 您可以在构建过程中依赖已安装命令的 shebang 吗? https://github.com/conda/conda-build/issues/3592了解更多信息。

构建包

$ conda-build .

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

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

将包上传到anaconda服务器

  • 注册一个新用户蟒蛇云 https://anaconda.org/account/register

  • 安装客户端

    $ 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"
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在安装 conda 包期间更新 @INC 变量 的相关文章

随机推荐

  • 结构参数的默认值

    假设我有以下结构 struct myStruct int x int y int z int w 我想在调用以下函数时将此结构初始化为默认值 如果有帮助 我正在寻找一个简单的零初始化 void myFunc myStruct param 0
  • 我怎样才能把日期和时间选择器放在android的对话框中

    我是 Android 新手 正在努力解决如何添加这两个date picker and time picker在一个单一的dialog box请指导我该怎么做我创建了一个dialog box并使用一个函数setview给它充气 但我得到了例外
  • CQ 工作流程,“Handler Advance”的目的?

    我正在 Adob e CQ 5 4 中使用一些自定义 WorkflowProcess 类 当我将工作流程步骤配置为工作流程模型的一部分时 有一个标题为 处理程序前进 检查您的处理程序是否将前进到下一步 的复选框 我的 Java 类实际上确实
  • Node.js + MySQL - 处理事务

    我正在使用express和node mysql驱动程序在node js上构建一个应用程序 当我需要进行一系列数据库插入 更新时 我的应用程序中有几种情况 我希望它们在一个事务中 这样如果第二个或第三个失败 以前的插入将完全回滚 目前 我这样
  • 如何旋转形状 (n,) 或 (n,1) 的 numpy 数组中的数字?

    假设我有一个 numpy 数组 gt gt gt a array 0 1 2 3 4 我想 旋转 它以获得 gt gt gt b array 4 0 1 2 3 什么是最好的方法 我一直在转换为双端队列并返回 见下文 但是有更好的方法吗 b
  • 使用 Angular ui-router 设置 URL 查询参数而不更改状态

    我应该如何使用 AngularJS 的 ui router 通过更改查询参数来更新地址栏 URL 以在刷新页面时保持状态 目前 我正在使用 state transitionTo search q updated search term 每当
  • MySQL单字段斜率(趋势)(最佳拟合线)

    我有一个名为 LOGENTRY 的简单表 其中包含名为 DATE 和 COST 的字段 例子 DATE COST MAY 1 2013 0 8 SEP 1 2013 0 4 NOV 1 2013 0 6 DEC 1 2013 0 2 我想找
  • HTTP/2 请求和以冒号开头的标头

    你好 亲爱的 SO 社区 我有一个问题折磨了我好几个月却没有解决办法 我正在尝试在 HTTP 2 端点上发出请求 该端点使用一些以冒号开头的标头 例子 method POST 我尝试过 python hyper requests php g
  • 如何在 AngularJS 网页中滚动后修复元素

    我最近用 AngularJs 做了一个网站 我还处于学习阶段 我希望在页面上的某个元素到达顶部后对其进行修复 我尝试过各种 Javascript 和 Jquery 函数 然而 他们似乎并没有工作 我也尝试使用 Angular UI 的 ui
  • 如何在 Linux 上的 Bash 中一次删除多个文件?

    我在 Linux 服务器上有以下文件列表 abc log 2012 03 14 abc log 2012 03 27 abc log 2012 03 28 abc log 2012 03 29 abc log 2012 03 30 abc
  • onsubmit 方法与提交事件监听器

    我一直在为一门课程做一个邮件程序 我遇到了与通过 return false 阻止表单提交有关的行为 我不明白 情况 1 未正确阻止表单提交 重新加载 DOM 并出现 200 错误 document querySelector compose
  • IDEA 中的 Spring 支持与 Lombok:是否支持“导航到自动装配依赖项”?

    Lombok 支持生成构造函数 Inject注释 RequiredArgsConstructor onConstructor Inject 所以 而不是 Service public class FooService private fin
  • Node.js 支持“let”语句吗?

    Node js 是否支持 let 语句 例如MDN 上有描述吗 https developer mozilla org en JavaScript Reference Statements let var x 8 y 12 let x 5
  • opencv 使用 waitKey() 函数处理箭头键

    我想处理箭头键 但是当我打印出 waitKey 函数的输入值时 它是 0 我不知道为什么 我尝试从 int 更改为 char 但它不起作用 我怎么解决这个问题 int pos 100 imshow image image onChange
  • 页面加载时的 jQuery .fadeIn() ?

    我正在尝试设置一些代码 以便我有一个首先隐藏但在页面加载后淡入的代码 我有以下 HTML 代码 div class hidden p This is some text p div 然后我还有这个 CSS 代码 它隐藏了 div div h
  • 如何从war文件中获取java源代码?

    我没有最新的源代码 但在服务器上部署了 war 最新 文件 请建议最好的方法1 从war ear获取源代码2 将可用源代码与 war ear 中存在但可用源代码中缺失的代码进行比较并合并 更新 我正在使用 ECLIPSE IDE 提前致谢
  • 如何在 Mac 上与图层支持的视图交互

    我正在设计一个包含多个标签和文本字段的用户界面 我想像这样设计用户界面 为我的内容视图设置背景图案NSWindow 在左上角背景添加自定义图标 我通过将内容视图设置为层支持视图如中所述Apple 的文档NSView http develop
  • 使用 Scipy 进行图像腐蚀和膨胀

    我正在尝试使用 scipy 来做erosion http docs scipy org doc scipy reference generated scipy ndimage morphology binary erosion html a
  • 弥补 Java 中基于多态参数的运行时方法查找不足的模式?

    看来Java无法根据参数的运行时类型选择最合适的方法实现 如文档所示here http www rizzoweb com java polymorphismAndOverloading html 回顾一下这个例子 class Supercl
  • 在安装 conda 包期间更新 @INC 变量

    我正在尝试安装 Perl 模块的 conda 包 到目前为止 我可以使用创建包conda build 为此 我有一个食谱 其中包含build sh and a meta yaml files 然后我使用安装它conda install在新环