Dist-Zilla-Plugin-OptionalFeature
view release on metacpan or search on metacpan
lib/Dist/Zilla/Plugin/OptionalFeature.pm view on Meta::CPAN
# https://github.com/Perl-Toolchain-Gang/cpan-meta/issues/28
# but this is the current v2.0 spec - regexp lifted from Test::CPAN::Meta::JSON::Version
$self->log_fatal('invalid syntax for optional feature name \'' . $self->name . '\'')
if $self->name !~ /^([a-z][_a-z]+)$/i;
return {
# dynamic_config is NOT set, on purpose -- normally the CPAN client
# does the user interrogation and merging of prereqs, not Makefile.PL/Build.PL
optional_features => {
$self->name => {
description => $self->description,
# we don't know which way this will/should default in the spec if omitted,
# so we only include it if the user explicitly sets it
$self->_has_default ? ( x_default => $self->default ) : (),
prereqs => { $self->_prereq_phase => { $self->_prereq_type => $self->_prereqs } },
},
},
};
}
__PACKAGE__->meta->make_immutable;
__END__
=pod
=encoding UTF-8
=head1 NAME
Dist::Zilla::Plugin::OptionalFeature - Specify prerequisites for optional features in your distribution
=head1 VERSION
version 0.023
=head1 SYNOPSIS
In your F<dist.ini>:
[OptionalFeature / XS_Support]
-description = XS implementation (faster, requires a compiler)
-prompt = 1
Foo::Bar::XS = 1.002
=head1 DESCRIPTION
This plugin provides a mechanism for specifying prerequisites for optional
features in metadata, which should cause CPAN clients to interactively prompt
you regarding these features at install time (assuming interactivity is turned
on: e.g. C<< cpanm --interactive Foo::Bar >>).
The feature I<name> and I<description> are required. The name can be extracted
from the plugin name.
You can specify requirements for different phases and relationships with:
[OptionalFeature / Feature_name]
-description = description
-phase = test
-relationship = requires
Fitz::Fotz = 1.23
Text::SoundEx = 3
If not provided, C<-phase> defaults to C<runtime>, and C<-relationship> to
C<requires>.
To specify feature requirements for multiple phases, provide them as separate
plugin configurations (keeping the feature name and description constant):
[OptionalFeature / Feature_name]
-description = description
-phase = runtime
Foo::Bar = 0
[OptionalFeature / Feature_name]
-description = description
-phase = test
Foo::Baz = 0
B<NOTE>: this doesn't seem to work properly with L<CPAN::Meta::Merge> (used in L<Dist::Zilla> since version 5.022).
It is possible that future versions of this plugin may allow a more compact
way of providing sophisticated prerequisite specifications.
If the plugin name is the CamelCase concatenation of a phase and relationship
(or just a relationship), it will set those parameters implicitly. If you use
a custom name, but it does not specify the relationship, and you didn't
specify either or both of C<-phase> or C<-relationship>, these values default
to C<runtime> and C<requires> respectively.
The example below is equivalent to the synopsis example above, except for the
name of the resulting plugin:
[OptionalFeature]
-name = XS_Support
-description = XS implementation (faster, requires a compiler)
-phase = runtime
-relationship = requires
Foo::Bar::XS = 1.002
B<NOTE>: It is advised that you only specify I<one> prerequisite for a given
feature -- and if necessary, create a separate distribution to encapsulate the
code needed to make that feature work (along with all of its dependencies).
This allows external projects to declare a prerequisite not just on your
distribution, but also a particular feature of that distribution.
=for Pod::Coverage mvp_aliases BUILD before_build metadata register_prereqs
=head1 PROMPTING
At the moment it doesn't appear that any CPAN clients properly support
C<optional_feature> metadata and interactively prompt the user with the
information therein. Therefore, prompting is added directly to F<Makefile.PL>
when the C<-relationship> is C<requires>. (It doesn't make much sense to
prompt for C<recommends> or C<suggests> features, so prompting is omitted
here.) You can also enable or disable this explicitly with the C<-prompt> option.
The prompt feature can only be used with F<Makefile.PL>. If a F<Build.PL> is
detected in the build and C<=prompt> is set, the build will fail.
As with any other interactive features, the installing user can bypass the
prompts with C<PERL_MM_USE_DEFAULT=1>. You may want to set this when running
C<dzil build>.
=head1 CONFIGURATION OPTIONS
=head2 C<-name>
The name of the optional feature, to be presented to the user. Can also be
extracted from the plugin name.
=head2 C<-description>
The description of the optional feature, to be presented to the user.
Defaults to the feature name, if not provided.
=head2 C<-always_recommend>
If set with a true value, the prerequisites are added to the distribution's
metadata as recommended prerequisites (e.g. L<cpanminus> will install
recommendations with C<--with-recommends>, even when running
non-interactively).
Defaults to C<false>, but I recommend you turn this on.
=head2 C<-always_suggest>
(Available since version 0.022)
If set with a true value, the prerequisites are added to the distribution's
metadata as suggested prerequisites.
Defaults to the inverse of C<-always_recommend>.
=head2 C<-require_develop>
(Available since version 0.011)
If set with a true value, the prerequisites are added to the distribution's
( run in 0.773 second using v1.01-cache-2.11-cpan-39bf76dae61 )