$30 off During Our Annual Pro Sale. View Details »

CPAN Module Hacks

akiym
January 26, 2019

CPAN Module Hacks

YAPC::Tokyo 2019

akiym

January 26, 2019
Tweet

More Decks by akiym

Other Decks in Technology

Transcript

  1. CPAN Module
    Hacks
    akiym
    YAPC::Tokyo 2019

    View Slide

  2. akiym

    View Slide

  3. CPAN
    モジュール
    すきですか

    View Slide

  4. モジュールを探す

    View Slide

  5. モジュールを探す

    View Slide

  6. ソースコードから検索

    View Slide

  7. 最近更新されたモジュール

    View Slide

  8. npm CPAN

    View Slide

  9. npm CPAN
    作者がフィーチャーされている
    SYNOPSIS⽂化
    CPANにはダウンロード数の計測はない

    View Slide

  10. CPAN
    モジュール
    とは何か

    View Slide

  11. *.pm
    distribution
    module
    package Foo;
    our $VERSION = '0.01';
    package Bar;
    ...
    例: libwww-perl
    例: LWP/UserAgent.pm
    LWP::UserAgent

    View Slide

  12. どのように
    CPANモジュールは

    アップロードされるのか

    View Slide

  13. PAUSE
    (Perl Authors Upload SErver)
    PAUSE ID
    CPAN Index (CPAN上にあるすべてのパッケージの⼀覧)
    http://cpan.org/modules/02packages.details.txt.gz
    LWP::Simple 6.36 E/ET/ETHER/libwww-perl-6.36.tar.gz
    LWP::UserAgent 6.36 E/ET/ETHER/libwww-perl-6.36.tar.gz
    ...
    indexing
    アップロードされたdistributionから
    使われているpackageを解析する
    libwww-perl-6.36.tar.gz
    release
    PAUSEにtarballを
    アップロード
    tarballの⽣成やアップロードは
    オーサリングツールを使う

    View Slide

  14. モジュールが
    インストールされるまで

    View Slide

  15. % cpanm LWP::UserAgent
    --> Working on LWP::UserAgent
    Fetching http://www.cpan.org/authors/id/E/ET/ETHER/
    libwww-perl-6.36.tar.gz ... OK
    Configuring libwww-perl-6.36 ... OK
    Building libwww-perl-6.36 ... OK
    Successfully installed libwww-perl-6.36
    1 distribution installed

    View Slide

  16. CPANクライアント
    cpanmetadb
    02packages.details.txt
    ① packageから
    distributionの解決を⾏う
    cpanm LWP::UserAgent
    or
    cpanm LWP::[email protected]
    E/ET/ETHER/libwww-perl-6.36.tar.gz

    View Slide

  17. CPANクライアント
    cpanmetadb
    BackPAN
    CPAN mirror
    02packages.details.txt
    www.cpan.org
    ① packageから
    distributionの解決を⾏う
    ② tarballを取ってくる
    E/ET/ETHER/libwww-perl-6.36.tar.gz
    http://www.cpan.org/authors/id/E/ET/ETHER/libwww-perl-6.36.tar.gz
    cpanm LWP::UserAgent
    or
    cpanm LWP::[email protected]

    View Slide

  18. CPANクライアント
    cpanmetadb
    BackPAN
    CPAN mirror
    02packages.details.txt
    www.cpan.org
    ① packageから
    distributionの解決を⾏う
    ② tarballを取ってくる
    E/ET/ETHER/libwww-perl-6.36.tar.gz
    http://www.cpan.org/authors/id/E/ET/ETHER/libwww-perl-6.36.tar.gz
    ③ 依存モジュールの解決
    Makefile.PL / Build.PLの実⾏のちインストールされる
    cpanm LWP::UserAgent
    or
    cpanm LWP::[email protected]

    View Slide

  19. CPAN
    モジュール
    を作る

    View Slide

  20. Minillaを使う
    オーサリングツール

    View Slide

  21. % cpanm Minilla --with-recommends

    View Slide

  22. % minil new Foo::Bar
    % cd Foo-Bar
    % tree
    ├── Build.PL
    ├── Changes
    ├── LICENSE
    ├── META.json
    ├── README.md
    ├── cpanfile
    ├── lib
    │ └── Foo
    │ └── Bar.pm
    ├── minil.toml
    └── t
    └── 00_compile.t
    3 directories, 9 files

    View Slide

  23. % minil release

    View Slide

  24. これだけで
    モジュールを作って
    リリース

    View Slide

  25. Songmuさんの
    「Minillaを使ったモダン
    なCPANモジュール開発」
    が詳しい
    http://gihyo.jp/dev/serial/01/perl-hackers-hub/005001

    View Slide

  26. CPAN Testersが
    便利

    View Slide

  27. View Slide

  28. CPAN
    モジュール
    を管理する

    View Slide

  29. ツールの紹介

    View Slide

  30. 1999- ?
    2002-
    2010-
    2015-
    cpan
    cpanplus
    cpanminus
    cpm
    CPANクライアント

    View Slide

  31. Q. 結局どれを使えば
    よい?

    View Slide

  32. A. cpm

    View Slide

  33. cpmの利点
    並列にインストールできる
    prebuilt機能によりインストール済み
    ならファイルをコピーするだけ
    cpanfile.snapshotから直接解決できる

    View Slide

  34. $ curl -sL --compressed https://git.io/cpm > cpm
    $ chmod +x cpm

    View Slide

  35. Carton
    プロジェクトごとに
    モジュールの管理
    バージョンの固定

    View Slide

  36. よくある説明:
    Rubyでいうところ
    のbundler

    View Slide

  37. % carton install
    Installing modules using /path/to/cpanfile
    Successfully installed Module-Pluggable-5.2
    Successfully installed Importer-0.025
    Successfully installed Test-Simple-1.302160 (upgraded from 1.302073)
    Successfully installed Scope-Guard-0.21
    Successfully installed Term-Table-0.013
    Successfully installed Sub-Info-0.002
    Successfully installed Test2-Suite-0.000118
    7 distributions installed
    Complete! Modules were installed into /path/to/local
    % tree
    .
    ├── cpanfile
    ├── cpanfile.snapshot
    └── local
    ├── cache
    │ └── ...
    └── lib
    └── perl5
    ├── ...
    cpanfileより
    依存モジュールをlocal/以下に
    インストール

    View Slide

  38. # carton snapshot format: version 1.0
    DISTRIBUTIONS
    Importer-0.025
    pathname: E/EX/EXODIST/Importer-0.025.tar.gz
    provides:
    Importer 0.025
    requirements:
    ExtUtils::MakeMaker 0
    perl 5.008001
    ...
    cpanfile.snapshotを吐く

    View Slide

  39. snapshot⽣成時の
    問題
    プラットフォームによっ
    て依存が変わる場合

    View Slide

  40. ⼿元で⽣成して
    コミットせず
    CIやdocker環境上で
    ⽣成

    View Slide

  41. cpanfileのコミットハッシュを
    保存しておくことで
    cpanfileの変更時のみ
    ⽣成させることができる

    View Slide

  42. cpan-audit
    脆弱性のある
    モジュールを検査する

    View Slide

  43. モジュールのディレクトリ
    cpanfile / snapshot
    から探す

    View Slide

  44. % cpan-audit deps
    Discovered 1 dependencies
    Mojolicious (requires 7.83) has 1 advisories
    * CPANSA-Mojolicious-2018-04
    This release reverts the addition of stream classes (added in 7.83), which have
    unfortunately resulted in many Mojolicious applications becoming unstable. While there
    are no known exploits yet, we've chosen to err on the side of cautiousness and will
    classify this as a security issue.
    Affected range: >7.83, <7.92
    References:
    https://github.com/mojolicious/mojo/commit/61f6cbf22c7bf8eb4787bd1014d91ee2416c73e7
    Total advisories found: 1

    View Slide

  45. CPANSAという
    データベースとして
    管理されている
    https://github.com/vti/cpan-security-advisory

    View Slide

  46. "This is a hand-
    picked database"

    View Slide

  47. Changesから⾃動的に
    拾える仕組みが欲しい

    View Slide

  48. プライベート
    CPANを作る

    View Slide

  49. プライベートな
    モジュールを管理する
    git submodule ?
    OrePAN2 ?

    View Slide

  50. もっと簡単に管理したい
    管理するものを無くしたい

    View Slide

  51. Support 'dist', 'mirror' and
    'url' option in cpanfile
    https://github.com/miyagawa/cpanminus/pull/568

    View Slide

  52. requires 'Path::Class', 0.26,
    dist => "KWILLIAMS/Path-Class-0.26.tar.gz";
    requires 'Hash::MultiValue',
    dist => "MIYAGAWA/Hash-MultiValue-0.15.tar.gz";
    requires 'Cookie::Baker',
    dist => "KAZEBURO/Cookie-Baker-0.08.tar.gz",
    mirror => "http://cpan.cpantesters.org/";
    requires 'Try::Tiny', 0.28,
    url => "http://backpan.perl.org/authors/id/E/ET/ETHER/Try-Tiny-0.28.tar.gz";
    cpanfileに以下のように書くだけ

    View Slide

  53. つまりtarballを配信
    できればよい
    → Amazon S3で

    View Slide

  54. requires 'Private::Module',
    dist => "AKIYM/Private-Module-0.01.tar.gz",
    mirror => "https://xxx.s3-ap-northeast-1.amazonaws.com/";
    • /authors/id/A/AK/AKIYM/Private-Module-0.01.tar.gz

    として配置する必要がある
    • bucketがパブリックアクセスにならないようにする

    (使うときにはIPアドレス制限など)
    • Menlo >= 1.0913

    View Slide

  55. Q.
    cpanfile.snapshot
    と組み合わせたとき
    に困りませんか

    View Slide

  56. # carton snapshot format: version 1.0
    DISTRIBUTIONS
    Importer-0.025
    pathname: E/EX/EXODIST/Importer-0.025.tar.gz
    provides:
    Importer 0.025
    requirements:
    ExtUtils::MakeMaker 0
    perl 5.008001
    ...
    mirrorの指定はできない

    View Slide

  57. A. cpmを使う
    cpanfileと
    cpanfile.snapshotを読む
    ハイブリッドで解決

    View Slide

  58. % cpm install -v
    Loading distributions from cpanfile.snapshot...
    73951 DONE resolve (0.003sec) Private::Module -> Private-Module-0.01 (from CPANfile)
    73950 DONE resolve (0.005sec) Test::More -> Test-Simple-1.302140 (from Snapshot)
    73950 DONE fetch (0.032sec) Test-Simple-1.302140 (using prebuilt)
    73951 DONE fetch (0.323sec) Private-Module-0.01
    73951 DONE configure (0.030sec) Private-Module-0.01
    73951 DONE install (0.289sec) Private-Module-0.01
    73950 DONE install (0.766sec) Test-Simple-1.302140 (using prebuilt)
    2 distributions installed.
    ここはcpanfileから解決
    cpanfile.snapshot

    View Slide

  59. これだけで
    プライベートCPAN
    が作れる

    View Slide

  60. まとめ
    CPANモジュールを
    探す・知る・作る・管理する
    S3におくだけプライベートCPANを作る

    View Slide