Devel::IPerl::Plugin::Perlbrew - interact with perlbrew in Jupyter IPerl kernel
In a shared server environment the Perl module needs of multiple users can be met most easily with access to perlbrew and the ability to install perl modules under their own libraries. A user can generate a cpanfile to facilitate the creation of these libraries in a reproducible manner. At the command line a typical workflow in such an environment might appear thus:
perlbrew lib create perl-5.26.0@reproducible perlbrew use perl-5.26.0@reproducible ## assuming a cpanfile cpanm --installdeps .
During the analysis that utilises such codebases using a JupyterHub on the same environment a user will wish to access these installed modules in a way that is as simple as the command line and within the framework of a Jupyter notebook.
This plugin is designed to easily transition between command line and Jupyter with similar syntax and little overhead.
There are some Jupyter notebooks in the examples directory
IPerl->load_plugin('Perlbrew') unless IPerl->can('perlbrew'); IPerl->perlbrew_list(); IPerl->perlbrew_list_modules(); IPerl->perlbrew('perl-5.26.0@reproducible');
## install dependencies cpanm --installdeps --quiet . ## install cpanm .
If there are some issues with Devel::IPerl installing refer to their README.md. The .travis.yml in this repository might provide sources of help.
.travis.yml
App::perlbrew is a requirement and it is suggested that Devel::IPerl is deployed into a perlbrew installed perl and call the "perlbrew" function to use each library.
For a single user use case the recommended install proceedure at https://perlbrew.pl should be used. If installing for a shared environment and JupyterHub, the following may act as a template.
version=0.82 mkdir -p /sw/perlbrew-$version export PERLBREW_ROOT=!$ curl -L https://install.perlbrew.pl | bash
The kernel specification needs to be installed so that Jupyter can find it. This is achieved thus:
iperl --version
The kernel specification should be updated to make the environment variables, that App::perlbrew relies on, available. Included in this dist is the command perlbrewise-spec.
perlbrewise-spec
Called by IPerl->load_plugin('Perlbrew').
IPerl->load_plugin('Perlbrew')
# 1 - success IPerl->perlbrew('perl-5.26.0@reproducible'); # 0 - it is already loaded IPerl->perlbrew('perl-5.26.0@reproducible'); # -1 - no library specified IPerl->perlbrew(); # 1 - success switching off reproducible and reverting to perl-5.26.0 IPerl->perlbrew($ENV{'PERLBREW_PERL'});
This is identical to perlbrew use perl-5.26.0@reproducible and will switch any from any previous call. Returns 1, 0 or -1 for success, no change and error respectively. A name for the library is required. To revert to the "system" or non-library version pass the value of $ENV{PERLBREW_PERL}.
perlbrew use perl-5.26.0@reproducible
1
0
-1
$ENV{PERLBREW_PERL}
IPerl->perlbrew('perl-5.26.0@tutorial', 1);
The function takes a Boolean as an optional second argument. A true value will result in all the modules that were loaded during the activity of the previous library to be unloaded using delete_package. The default value is false as setting is to true might expose the unexpected behaviour.
When using multiple perlbrew libraries it may be possible to use modules from both, although this is not a recommended use.
IPerl->perlbrew('perl-5.26.0@tutorial'); use Jupyter::Tutorial::Simple; ## run some code ## load @reproducible, but do not unload Jupyter::Tutorial::Simple IPerl->perlbrew('perl-5.26.0@reproducible', 0); use Bio::Taxonomy; ## ... more code, possibly using Jupyter::Tutorial::Simple
This is experimental.
# /home/username/.perlbrew IPerl->perlbrew_domain; # /work/username/perlbrew-libs IPerl->perlbrew_domain('/work/username/perlbrew-libs');
Users often generate a large number of libraries which can quickly result in a long list generated in the output of "perlbrew_list". This experimental feature allows for switching between domains to reduce the size of these lists. Thus, a collection of libraries are organised under domains. These are only directories, must exist before use and are synonymous with $ENV{PERLBREW_HOME}. Indeed, this is a convenient alternative to $App::perlbrew::PERLBREW_HOME.
$ENV{PERLBREW_HOME}
$App::perlbrew::PERLBREW_HOME
# 1 - success IPerl->perlbrew_lib_create('reproducible'); # 0 - already exists IPerl->perlbrew_lib_create('reproducible'); # -1 - no library name given IPerl->perlbrew_lib_create();
This is identical to perlbrew lib create. Returns 1, 0 or -1 for success, already exists and error respectively.
perlbrew lib create
IPerl->perlbrew_list;
This is identical to perlbrew list and will output the same information.
perlbrew list
IPerl->perlbrew_list_modules;
This is identical to perlbrew list_modules and will output the same information.
perlbrew list_modules
The following environment variables alter the behaviour of the plugin.
A logical to control how verbose the plugin is during its activities.
This defaults to App::prelbrew
These are part of the internal interface and not designed for end user consumption.
$plugin->brew;
Use the perlbrew library specified in "name".
$plugin->env({PERLBREW_ROOT => '/sw/perlbrew', ...}); # {PERLBREW_ROOT => '/sw/perlbrew', ...} $plugin->env;
An accessor that stores the environment from App::perlbrew for a subsequent call to "brew".
my $plugin = Devel::IPerl::Plugin::Perlbrew->new();
Instantiate an object.
$plugin->name('perl-5.26.0@reproducible'); # perl-5.26.0@reproducible $plugin->name;
An accessor for the name of the perlbrew library.
$plugin->saved;
An accessor for the previous environment variables so they may be restored as the "brew" "spoil"s.
$plugin->spoil;
When a "brew" is finished with. This is called automatically during object destruction.
# boolean where 1 == success, 0 == not success $plugin->success;
Was everything a success?
$plugin->unload(1); # 1 $plugin->unload;
A flag to determine whether to unload all the modules that were used as part of this library during cleanup.
To install Devel::IPerl::Plugin::Perlbrew, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Devel::IPerl::Plugin::Perlbrew
CPAN shell
perl -MCPAN -e shell install Devel::IPerl::Plugin::Perlbrew
For more information on module installation, please visit the detailed CPAN module installation guide.