Perl::Critic::Policy::ValuesAndExpressions::RequireConstantVersion - Require $VERSION to be a constant rather than a computed value.
This Policy is part of the core Perl::Critic distribution.
The $VERSION variable of a module should be a simple constant - either a number, a single-quotish string, or a 'use version' object. In the latter case the 'use version;' must appear on the same line as the object construction.
Computing the version has problems of various severities.
The most benign violation is computing the version from (e.g.) a Subversion revision number:
our ($VERSION) = q$REVISION: 42$ =~ /(\d+)/;
The problem here is that the version is tied to a single repository. The code can not be moved to another repository (even of the same type) without changing its version, possibly in the wrong direction.
This policy accepts v-strings (v1.2.3 or just plain 1.2.3), since these are already flagged by Perl::Critic::Policy::ValuesAndExpressions::ProhibitVersionStrings.
v1.2.3
1.2.3
The proper way to set a module's $VERSION to a version object is to use version; on the same line of code that assigns the value of $VERSION. That way, ExtUtils::MakeMaker and Module::Build can extract the version when packaging the module for CPAN. By default, this policy declares an error if this is not done.
version
use version;
Should you wish to allow version objects without loading the version module on the same line, add the following to your configuration file:
[ValuesAndExpressions::RequireConstantVersion] allow_version_without_use_on_same_line = 1
There will be false negatives if the $VERSION appears on the left-hand side of a list assignment that assigns to more than one variable, or to undef.
undef
There may be false positives if the $VERSION is assigned the value of a here document. This will probably remain the case until PPI::Token::HereDoc acquires the relevant portions of the PPI::Token::Quote interface.
There will be false positives if $VERSION is assigned the value of a constant created by the Readonly module or the constant pragma, because the necessary infrastructure appears not to exist, and the author of the present module lacked the knowledge/expertise/gumption to put it in place.
Currently the idiom
our $VERSION = '1.005_05'; $VERSION = eval $VERSION;
will produce a violation on the second line of the example.
Thomas R. Wyant, III wyant at cpan dot org
Copyright (c) 2009-2011 Tom Wyant.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of this license can be found in the LICENSE file included with this module
To install Perl::Critic, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Perl::Critic
CPAN shell
perl -MCPAN -e shell install Perl::Critic
For more information on module installation, please visit the detailed CPAN module installation guide.