Yarn 2 — JavaScript向けパッケージマネージャーの未来?
2020年4月3日
0 分で読めますYarn 2とは?
Yarn 2は、革新的で広く定着しているnpmパッケージマネージャーYarnの新バージョンです。Plug’n’Play、プラグインアーキテクチャ、モノレポ、ワークスペースのサポート強化、Zero-installsなどの改善が盛り込まれています。コミュニティのリポジトリはGitHubで公開されています:https://github.com/yarnpkg/berry。
なぜ新しいYarnが必要だったのでしょうか?
Yarn 2は、JavaScriptプロジェクトの管理方法をめぐって開発者の間で議論が続いてきた、いくつもの課題に応えています。
モノレポ
モノレポが好きかどうかにかかわらず、大規模なプロジェクトや複雑なワークフローをスムーズに管理し、成功させるには、適切なツールチェーンが必要です。
JavaScriptプロジェクトでモノレポを構築する一般的な方法は、Yarnのワークスペース(Yarn 1から利用可能)と、プロジェクト管理ツールのLernaを組み合わせることです。
Yarn 2では、パッケージマネージャーとプロジェクトマネージャーの両方の役割をYarnが担うようになり、モノレポを円滑に運用するための包括的な体験を提供します。
Plug’n’Play
node_modulesについて、これまでどれほど語られてきたでしょうか。新しいYarnのドキュメントでは、フォルダー構造としてのnode_modulesの欠点をさらに詳しく説明し、依存関係の管理方法を新たに考える必要性を示しています。
Plug’n’Playという戦略は、新しいYarnだけに限られたものではなく、エコシステムですでに見られたものです。Kat Marchánは、JSConf EU 2019で自身の発表を通じてTinkを紹介しました。ただし、TinkのPlug’n’PlayへのアプローチがYarnと同じというわけではありません。こうしたアイデアが、JavaScriptエコシステム全体でさまざまな実験を通じて、以前から広がってきたことは改めて押さえておく価値があります。
Yarn 2でPlug’n’Playを実装する方法には、セキュリティ面でも興味深い点があります。
ローカルキャッシュフォルダーの.yarn/cacheは読み取り専用としてマウントされるため、ファイルシステム上にインストール済みのパッケージを悪意ある方法で改変することはできません。
YarnのPlug’n’Playの仕組みにより、厳格なチェックを適用できます。たとえば、パッケージやプロジェクトの依存関係一覧に定義されていない、いわゆるファントムパッケージを参照することを禁止できます。
プラグイン
これはエンドユーザーよりも開発者やメンテナーの視点から見た話かもしれませんが、押さえておくべき重要な点です。Yarn 2をTypeScriptで構築するにあたり、プラグインアーキテクチャを導入して他の開発者がYarnを拡張できるようにすることで、コア部分の複雑さを軽減し、メンテナンスを容易にする機会が生まれました。
ほかにも機能がある?
dev.toでYarn 2のリリースを発表した記事で、Maël Nisonは、Yarn 2が今後のJavaScriptおよびNode.jsプロジェクトに適している理由となる機能と、その注意点について多くの見解を紹介しています。ぜひリリースブログと、さらに詳しい情報を掲載したYarn公式の機能紹介ページをお読みください。
Yarn 2を使い始める方法
Yarnはリポジトリ単位、つまりプロジェクト単位でインストールする方式を採用しています。そのため、最初のclassic版Yarnなどをグローバルにインストールしたまま、特定のプロジェクトでYarn 2に切り替えることができます。
Yarn 2を使い始めるには、最新のNode.jsが必要です。最低でもNode.js 10を用意してください。サポートとメンテナンスが継続されるNode.js LTSを常に優先して使うことをおすすめします。Node.js 10より前のバージョンはサポートが終了しており、バグ修正やセキュリティ修正も提供されません。
新しいYarnへの切り替え
まず、新しいプロジェクトを初期化するためのディレクトリを作成します。
yarn --versionで現在のYarnのバージョンを確認しましょう。Yarn 1.22より前のバージョンを使っている場合は、次のコマンドを入力してください。
ローカルのYarnが1.22以降の場合:
これでYarn 2が取得され、次のように表示されます。
yarn --versionでYarnのバージョンを確認できます。私の場合は次のように表示されました。
通常どおり、リポジトリ内で設定を共有するために、.yarnrcと.yarnrc.ymlをコミットすることをおすすめします。また、ここでは.yarnフォルダーが使われており、Yarnがキャッシュ、ランタイム、プラグインなどのデータを管理する点にも注目です。
Yarn 2のダウンロードポリシーを更新すると、最新リリースのコピーがローカルの.yarn/フォルダーにダウンロードされ、インストールされたバージョンのディスク上のパスを記録する.yarnrcが作成されます。
Yarn 2でnpmモジュールをインストールする
Node.jsのWebフレームワークFastifyを依存関係に追加しましょう。
Yarnの新しい出力には、すでにいくつかの変更が見られます。
インストール中に実行される関連タスクは、ひとまとまりにグループ化されます。
YarnはCLIの出力で各タスクグループを示します。問題が発生した場合も、簡単にトラブルシューティングできます。
ロックファイルは引き続き、依存関係のバージョンを固定し、再現可能で監査可能な状態にするためのYarnの推奨方式です。ただし、Yarn 2では適切なYAML構文が採用されました。
一般的なパッケージ管理コマンドは、以前のYarnバージョンから変更されていません。
yarn add [package] --devyarn remove [package]yarn up [package]
JavaScriptやNode.jsの実行にはYarnが必要
node_modulesディレクトリがなくなったため、node script.jsのようにスクリプトを直接実行しても、ファイルに記述された依存関係を解決できず、動作しません。そのため、yarn node script.jsを実行する必要があります。Yarnは、PnPを機能させるためのロジックをパッチする独自のファイルを使ってNodeプロセスを起動します。これはNodeに組み込まれた--require CLIフラグを使って実現しています。
なお、scriptsフィールドで定義されたスクリプト内ではyarn nodeは不要です(多くのツールはそもそもこの方法で実行されます)。nodeを呼び出すだけで十分です。説明してくれたMael、ありがとう!
次のステップ
Yarn 2が時を経ても通用し、実現し発展させてきた新しいアイデアによってJavaScriptコミュニティに認められるかどうかを見極めるには、まだ実績を積み、コミュニティの評価を得る必要があります。
次のプロジェクトで試す際は、Yarnのウェブサイトにある詳しいドキュメントをご覧ください:https://yarnpkg.com/cli/install。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。



