Yarn 2プラグイン入門
2020年4月13日
0 分で読めますYarn 2やそのプラグインアーキテクチャに興味がある方は、まずyarnpkg.comのプラグインアーキテクチャに関するドキュメントを読み、サイトのYarn 2プラグインチュートリアルも確認してみてください。
Yarn 2を初めて使う方は、私のブログ記事Yarn 2入門をぜひお読みください。
Yarn 2プラグインを作成する
まずはプラグインを開発する環境を整えます。Yarn 2で管理する新しいプロジェクトの作成から始めましょう。
これで、Yarn 2で管理されるまっさらなnpmパッケージプロジェクトができました。
Yarnの実行プロセスの一部としてプラグインを実行することをYarnに伝えるには、.yarnrc.ymlという新しいファイルを作成し、開発するプラグインへのパスを指定してプラグイン定義を追加します。
続いて、プラグインのコードを見ていきましょう。Yarnの処理フェーズにフックする機能を作成します。ここではafterAllInstalledにフックし、その後コンソールにメッセージを出力します。プラグインのコードは次のようになります。
プラグインをテストするには、CLIからyarnコマンドを実行するだけです。次のように出力されます。
すばらしい!これで独自のYarn 2プラグインができました。
Yarn 2プラグインでは、yarnの実行ファイルへのコマンド追加や、Yarnが参照する新しいリゾルバーやフェッチャーの追加、さらには相互に連携するyarnプラグインの作成など、さまざまなことができます。
Yarnにコマンドを追加するYarn 2プラグインの作成方法を知りたい方は、手順を解説している公式ドキュメントYarn pluginsをご覧ください。
Yarn 2プラグインで依存関係の詳細情報にアクセスする
先ほどの例で見たように、Yarnのフックの中には、プロジェクトに関してYarnが収集した詳細なメタデータを含む、グローバルな公開オブジェクトを提供して、より深く連携できるものがあります。
次の例では、再びafterAllInstalledフックと連携します。このフックには、
追加のパラメーターとして公開Projectオブジェクトが渡されます。このパラメーターを使うと、依存関係、パッケージマニフェスト、ワークスペース情報など、Yarnがプロジェクトについて収集したすべての情報にアクセスできます。
次のplugin-hook-install-hello-brave-world.jsプラグインの例では、このオブジェクトの情報を変数_に格納し、内容をJSONファイルに書き出して、さらに詳しく調べられるようにします。
Projectオブジェクトの構造はpackages/berry-core/sources/Project.tsで定義されています。オブジェクトのルートレベルにあるキーの一部を以下に示します。
これらのstored*キーを使うと、依存関係を把握し、このプロジェクトのツリーを構築できます。
簡単にするため、依存関係がdebugだけのnpmプロジェクトでこのプラグインを実行します。debug自体もmsに依存しています。
storedPackagesオブジェクトは、このプロジェクトの依存関係一覧を取得するためのエントリーポイントです。また、このオブジェクトには実際のプロジェクト名のエントリーも含まれており、workspace: keyという参照で示されます。
storedPackagesのMapで、debugの依存関係がどのように表示されるか見てみましょう。
debugのエントリーには、識別用の一意なハッシュ、解決済みバージョンなどのメタデータ、そしてdebugが依存するパッケージを列挙した、依存関係のネストされたオブジェクトがあります。ただし、ネストされた依存関係オブジェクトに表示されるmsは解決済みではなく、バージョン範囲だけが示されています。
ネストされた依存関係を解決するには、descriptorHashを使ってstoredResolutionsマップを参照します。内容は次のとおりです。
msのdescriptorHashは0742408cf974a8f1cd5081a9aec19656dc8016eec3c6e2358f302902e6f1f87241f601911cb45e855f3b0d26160c1520715ae79904c5ed1d29f5383ab906440eです。これはstoredResolutionsの3番目の要素で、ハッシュ9455a02525b0e2c50eca4e204d71900a775107249d4245c1ea1f95e3f124c8a1d27484b29ccea934895da4d0273b22dc95cefd0561c39490cd7c86ab4404ca33を参照しています。このハッシュはさらにstoredPackagesマップ内の依存関係エントリーに対応しており、今度はmsの解決済みメタデータを取得できます。
Yarn 2プラグインのまとめ
Yarn 2はまだ新しく、ユーザーへの普及やコミュニティからのフィードバックを取り入れている段階です。プラグインに取り組むには絶好のタイミングです。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。
