Обновление переменной @INC во время установки пакета conda - PullRequest
2 голосов
/ 03 июля 2019

Я пытаюсь установить пакет conda модуля Perl. Пока что я могу создать пакет, используя conda-build. Для этого у меня есть рецепт, содержащий файлы build.sh и meta.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:

Еще одно редактирование, которое может помочь вам, ребята, лучше понять мою ситуацию. Я только что понял, что когда я собираю пакет, папка lib моего модуля perl, в котором у меня есть PMP::util, живет в lib/site_perl/5.26.0/Perl_Module. Я уверен, что если я смогу установить его прямо в папку lib/, это решит эту проблему. Однако я не уверен, как изменить файл build.sh, чтобы изменить место, где мы собираем модуль perl.

1 Ответ

2 голосов
/ 05 июля 2019

Вот простой пример того, как создать пакет conda, который устанавливает модуль Perl (который зависит от модуля CPAN), который может помочь вам решить вашу проблему:

Установка miniconda в Linux

$ 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

Обратите внимание, что я запустил cpanm, используя perl ${PREFIX}/bin/cpanm.Я не смог просто запустить его как cpanm, см. Можете ли вы рассчитывать на shebang установленной команды во время сборки? для получения дополнительной информации.

Сборка пакета

$ 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"
    
...