読者です 読者をやめる 読者になる 読者になる

その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Released Perl::PrereqScanner::Lite

Perl

(日本語は英語の後にあります)


I released Perl::PrereqScanner::Lite.

https://github.com/moznion/Perl-PrereqScanner-Lite
https://metacpan.org/release/Perl-PrereqScanner-Lite


This module is the fast edition of Perl::PrereqScanner.
Perl::PrereqScanner has been using PPI as tokenizer, however Perl::PrereqScanner::Lite uses Compiler::Lexer as tokenizer. Moreover it excludes dependency to Moose. Consequently, Perl::PrereqScanner::Lite realized the acceleration. It is faster about 30 times than Perl::PrereqScanner *1.


Now this module can extract modules as prereqs that are declared in use statement and require statement. Besides it can extract modules that are declared in extends notation (member of Moose family) by using Moose extra scanner. And it is able to extract version number that is specified as Foo::Bar->VERSION(1.0.0) by using Version extra scanner.

If you want other extra scanners, make module that has such as the name; Perl::PrereqScanner::Lite::SCANNER_NAME which has the method of scan(), and register extra scanner by add_extra_scanner('SCANNER_NAME') method.


I put this module in App::scan_prereqs_cpanfile.
Now, you can try scan-prereqs-cpanfile with fast mode.

$ scan-prereqs-cpanfile --fast

--fast option enables fast mode. Fast mode means, scan-prereqs-cpanfile uses Perl::PrereqScanner::Lite as the backend module. Perhaps it will run at a high speed.

For example, the result of executing this command on HEAD of mojo;

$ time scan-prereqs-cpanfile
real   0m20.386s
user   0m20.132s
sys    0m0.126s
$ time scan-prereqs-cpanfile —fast
real   0m1.174s
user   0m1.074s
sys    0m0.096s


Enjoy!


==


Perl::PrereqScanner::Liteをリリースしました.
https://github.com/moznion/Perl-PrereqScanner-Lite
https://metacpan.org/release/Perl-PrereqScanner-Lite


このモジュールはPerl::PrereqScannerの高速化版です.
Perl::PrereqScannerではtokenizerにPPIを使用していましたが,Perl::PrereqScanner::LiteはtokenizerとしてCompiler::Lexerを使うことに加え,Moose依存を排除する事により,30倍程度の高速化を実現しています *2


現在はuserequireによって宣言されたモジュールに加えて,extra scannerとしてMooseを利用するとMooseファミリーの持つextends記法によって宣言されたモジュールを抜き出すことが出来ます.Versionというextra scannerを用いる事によってFoo::Bar->VERSION(1.0.0)のようにして指定されたバージョンを抜き出すことも可能です.

その他のextra scannerが必要な場合は,scan()というメソッドを持ったPerl::PrereqScanner::Lite::SCANNER_NAMEという名前のモジュールを書いて,add_extra_scanner('SCANNER_NAME')という具合にextra scannerを登録してやると良いです.


試しに,という言い方もアレですが,Perl::PrereqScanner::LiteをApp::scan_prereqs_cpanfileに組み込んでみました.最新版だと,

$ scan-prereqs-cpanfile --fast

という風に--fastオプションを付けてやる事でバックエンドがPerl::PrereqScanner::Liteとなり,高速に動作することが見込めます.おそらく体感出来るレベルで速さを知覚出来ると思います.

[追記]
mojoのHEADでコマンドを実行するとこんな感じになりました.

$ time scan-prereqs-cpanfile
real   0m20.386s
user   0m20.132s
sys    0m0.126s
$ time scan-prereqs-cpanfile —fast
real   0m1.174s
user   0m1.074s
sys    0m0.096s


ぜひお試しくださいませ.不具合等ありましたら教えて頂けると嬉しいです.