Обновление переменной @INC во время установки пакета conda
Я пытаюсь установить пакет 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 ответ
Вот простой пример того, как создать пакет conda, который устанавливает модуль Perl (который зависит от модуля CPAN), который может помочь вам решить вашу проблему:
Установка миниконды на 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
, см. Можете ли вы положиться на шебанг установленной команды во время сборки? для дополнительной информации.
Постройте пакет
$ conda-build .
(Запишите сгенерированный вывод и определите путь к сгенерированному пакету. В моем случае имя было:
/home/hakon/miniconda3/conda-bld/linux-64/perl-hello3-1.0-pl526_0.tar.bz2
Загрузка пакета на сервер анаконды
Зарегистрировать нового пользователя в 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"