How can I 'use' specific version of a perl CPAN module?
Asked Answered
F

3

9

I have a lot perl code that does different things in test and production, and I want to lock my code to specific versions of CPAN modules in case there are some changes to some of them in the future which may possibly break my code.

So I want to use specific versions of all the modules I use. By use I mean

use XML::Smart 
Fingernail answered 15/1, 2013 at 6:29 Comment(4)
Check whether this thread has any useful information for you: #261093Maudmaude
You are the exact use case for Pinto, by Jeffrey Thalhammer. It's on CPAN: search.cpan.org/perldoc?PintoNadeen
To elaborate: Pinto manages your dependency chain, allowing you to "pin" some modules at specific versions, while allowing others to upgrade as new releases come available. You're able to roll back changes, and a lot more. It's like version control geared specifically toward Perl modules/distributions.Nadeen
Pinto doesn't mean that someone else ignores it and upgrades it through other means.Birthwort
D
9

To use specific module refer only

use only MyModule => 0.30;

Also to print error if module version you want is above to currently installed one You can say

use XML::Smart v1.6.9;

or

use XML::Smart 1.6.9;

or
for backward compatibility

use XML::Smart 1.006_009;  

With reference from perldoc :

  • use Module VERSION LIST
  • use Module VERSION
  • use Module LIST
  • use Module
  • use VERSION

If the VERSION argument is present between Module and LIST, then the use will call the VERSION method in class Module with the given version as an argument. The default VERSION method, inherited from the UNIVERSAL class, croaks if the given version is larger than the value of the variable $Module::VERSION .

Discriminate answered 15/1, 2013 at 7:33 Comment(2)
That doesn't stop newer versions from being used.Barman
@Barman - sorry for that. Updated answer with only moduleDiscriminate
B
4

You can do the low tech thing:

BEGIN {
    use XML::Simple;
    die "..." unless XML::Simple->VERSION eq '1.23';
    }

There is a headache knowing how a particular module reports its version. The version module is supposed to do version math, but I haven't found it reliable since there are too many ways to specify a version.

Birthwort answered 15/1, 2013 at 18:51 Comment(0)
E
0

If you use a cpanfile in your project root to declare dependencies on CPAN modules (you should), you can pin down the version there:

requires 'XML::Simple' => '== 1.23';
Enchanter answered 31/10, 2023 at 22:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.