Slide 1

Slide 1 text

CPAN Module Hacks akiym YAPC::Tokyo 2019

Slide 2

Slide 2 text

akiym

Slide 3

Slide 3 text

CPAN モジュール すきですか

Slide 4

Slide 4 text

モジュールを探す

Slide 5

Slide 5 text

モジュールを探す

Slide 6

Slide 6 text

ソースコードから検索

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

npm CPAN

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

CPAN モジュール とは何か

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

どのように CPANモジュールは
 アップロードされるのか

Slide 13

Slide 13 text

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の⽣成やアップロードは オーサリングツールを使う

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

% 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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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::UserAgent@6.36

Slide 18

Slide 18 text

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::UserAgent@6.36

Slide 19

Slide 19 text

CPAN モジュール を作る

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

% cpanm Minilla --with-recommends

Slide 22

Slide 22 text

% 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

Slide 23

Slide 23 text

% minil release

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

CPAN Testersが 便利

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

CPAN モジュール を管理する

Slide 29

Slide 29 text

ツールの紹介

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

A. cpm

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

% 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/以下に インストール

Slide 38

Slide 38 text

# 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を吐く

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

% 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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

"This is a hand- picked database"

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

プライベート CPANを作る

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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に以下のように書くだけ

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

# 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の指定はできない

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

% 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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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