[ Mini Kiebo ]
Server: Windows NT DESKTOP-5B8S0D4 6.2 build 9200 (Windows 8 Professional Edition) i586
Path:
D:
/
0xampp
/
perl
/
lib
/
[
Home
]
File: cpanfile-faq.pod
=head1 NAME cpanfile-faq - cpanfile FAQ =head1 QUESTIONS =head2 Does cpanfile replace Makefile.PL/Build.PL or META.yml/json? No, it doesn't. C<cpanfile> is a simpler way to declare CPAN dependencies, mainly for I<your application> rather than CPAN distributions. However, while CPAN distributions do not need to B<switch> to C<cpanfile>, you can certainly I<manage> the dependencies in C<cpanfile>, then export them into C<META.json> files when shipping to CPAN, using tools such as L<Dist::Milla> or L<Module::Install::CPANfile> =head2 Why do we need yet another format? Here are some of the reasons that motivates the new L<cpanfile> format. =over 4 =item Not everything is a CPAN distribution First of all, it is annoying to write (a dummy) C<Makefile.PL> when what you develop is not a CPAN distribution, just so that installation like C<cpanm --installdeps .> would work. It gets more painful when you develop a web application that you want to deploy on a different environment using version control system (such as PaaS/cloud infrastructure), because it requires you to often commit the META file or C<inc/> directory (or even worse, both) to a repository. Many web application frameworks generate a boiler-plate C<Makefile.PL> for dependency declaration and to let you install dependencies with C<< cpanm --installdeps . >>, but that doesn't always mean they are meant to be installed. Things can be often much simpler if you run the application from the checkout directory. With L<cpanfile>, dependencies can be installed either globally or locally using supported tools such as L<cpanm> or L<Carton>. Because C<cpanfile> lists all the dependencies of your entire application and will be updated over time, it makes perfect sense to commit the file to a version control system, and push the file for a deployment. =item Familiar DSL syntax This is a new file type, but the format and syntax isn't entirely new. The metadata it can declare is exactly a subset of "Prereqs" in L<CPAN Meta Spec|CPAN::Meta::Spec>. The syntax borrows a lot from L<Module::Install>. Module::Install is a great way to easily declare module metadata such as name, author and dependencies. L<cpanfile> format is simply to extract the dependencies into a separate file, which means most of the developers are familiar with the syntax. =item Complete CPAN Meta Spec v2 support C<cpanfile> basically allows you to declare L<CPAN::Meta::Spec> prerequisite specification using an easy Perl DSL syntax. This makes it easy to declare per-phase dependencies and newer version 2 features such as conflicts and version ranges. =back =head2 How can I start using C<cpanfile>? First of all, most distributions on CPAN are not required to update to this format. If your application currently uses C<Makefile.PL> etc. for dependency declaration because of the current toolchain implementation (e.g. C<< cpanm --installdeps . >>), you can upgrade to C<cpanfile> while keeping the build file based installation working for the backward compatibility. If you are an author of CPAN module and want to manage CPAN module prerequisites using C<cpanfile> you can use one of the following tools: =over 4 =item Dist::Milla L<Dist::Milla> is a profile for L<Dist::Zilla> that has a C<cpanfile> support to declare dependencies for your module. =item Dist::Zilla L<Dist::Zilla::Plugin::Prereqs::FromCPANfile> provides a way to merge dependencies declared in C<cpanfile> into META files as well as build files. You can combine them using other prerequisite scanners like C<AutoPrereqs>. =item Minilla L<Minilla> is a yet another authoring tool that supports C<cpanfile> as a way to describe dependencies for your CPAN module. =item Module::Install L<Module::Install::CPANfile> provides a C<cpanfile> DSL that reads C<cpanfile> to merge prerequisites when dumping C<MYMETA> files upon installation. =item Module::Build L<Module::Build::Pluggable::CPANfile> merges C<cpanfile> dependencies from C<Build.PL> when dumping out MYMETA information. However you're recommended to switch to an authoring system that emits C<Build.PL> with parsed CPANfile information, like L<Dist::Zilla> mentioned above. =item ExtUtils::MakeMaker L<ExtUtils::MakeMaker::CPANfile> merges C<cpanfile> prerequisites when dumping C<MYMETA> files upon installation. However you're recommended to switch to an authoring system that emits C<Makefile.PL> with parsed CPANfile information, like L<Dist::Zilla> mentioned above. =back