Skip to main content

Yarn 2 — JavaScript向けパッケージマネージャーの未来?

著者
Plugin feature

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への切り替え

まず、新しいプロジェクトを初期化するためのディレクトリを作成します。

mkdir my-app
cd my-app

yarn --versionで現在のYarnのバージョンを確認しましょう。Yarn 1.22より前のバージョンを使っている場合は、次のコマンドを入力してください。

yarn policies set-version berry

ローカルのYarnが1.22以降の場合:

yarn set version berry

これでYarn 2が取得され、次のように表示されます。

Resolving berry to a url...
Downloading https://github.com/yarnpkg/berry/raw/master/packages/berry-cli/bin/berry.js...
Saving it into /private/tmp/my-app/.yarn/releases/yarn-berry.js...
Updating /private/tmp/my-app/.yarnrc...
Done!

yarn --versionでYarnのバージョンを確認できます。私の場合は次のように表示されました。

2.0.0-rc.30

通常どおり、リポジトリ内で設定を共有するために、.yarnrcと.yarnrc.ymlをコミットすることをおすすめします。また、ここでは.yarnフォルダーが使われており、Yarnがキャッシュ、ランタイム、プラグインなどのデータを管理する点にも注目です。

Yarn 2のダウンロードポリシーを更新すると、最新リリースのコピーがローカルの.yarn/フォルダーにダウンロードされ、インストールされたバージョンのディスク上のパスを記録する.yarnrcが作成されます。

Yarn 2でnpmモジュールをインストールする

Node.jsのWebフレームワークFastifyを依存関係に追加しましょう。

yarn add fastify

➤ YN0000: ┌ Resolution step
➤ YN0000: └ Completed in 2.45s
➤ YN0000: ┌ Fetch step
➤ YN0013: │ string-similarity@npm:4.0.1 can't be found in the cache and will be fetched from the remote registry
➤ YN0013: │ string_decoder@npm:1.3.0 can't be found in the cache and will be fetched from the remote registry
➤ YN0013: │ tiny-lru@npm:7.0.2 can't be found in the cache and will be fetched from the remote registry
➤ YN0013: │ uri-js@npm:4.2.2 can't be found in the cache and will be fetched from the remote registry
➤ YN0013: │ util-deprecate@npm:1.0.2 can't be found in the cache and will be fetched from the remote registry
➤ YN0000: └ Completed in 1.73s
➤ YN0000: ┌ Link step
➤ YN0000: └ Completed in 0.07s
➤ YN0000: Done in 4.26s

Yarnの新しい出力には、すでにいくつかの変更が見られます。

  1. インストール中に実行される関連タスクは、ひとまとまりにグループ化されます。

  2. YarnはCLIの出力で各タスクグループを示します。問題が発生した場合も、簡単にトラブルシューティングできます。

ロックファイルは引き続き、依存関係のバージョンを固定し、再現可能で監査可能な状態にするためのYarnの推奨方式です。ただし、Yarn 2では適切なYAML構文が採用されました。

一般的なパッケージ管理コマンドは、以前のYarnバージョンから変更されていません。

  • yarn add [package] --dev

  • yarn 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の課題の解き方を学びましょう。

カテゴリー:

続きを読む

Blog

Stadium Summer:Snyk Connect Fan Zone Tour

SnykのFan Zone Tourでは、8都市と3回のオンラインセッションで、AIセキュリティのワークショップやネットワーキング、楽しい競技を開催しました。参加者はスキルを磨き、アイデアを共有し、共に成長しました。

Blog

Snyk VulnBench JS 1.0:LLMは同じバグを2回見つけられるか?

Snyk VulnBench JS 1.0:300回の反復スキャンで、LLMのセキュリティ検出結果は実行ごとに異なる一方、SASTとモデルはそれぞれ異なる脆弱性の見落としを検出することが明らかに。

feature insights context
Blog

お客様と築くAIセキュリティ:Evoのデザインパートナープログラムから得た5つの教訓

SnykのEvoデザインパートナープログラムから得た5つの重要な教訓をご紹介します。AIの検出、リスクインテリジェンス、ポリシーの自動化によって、チームが生成AIを保護し、拡大するAI利用を大規模に統制する方法をご覧ください。