pnpmでのNode-Modules設定オプション
node_modulesディレクトリを作成するには多くの方法があります。目標は最も厳格なディレクトリを作成することですが、それが不可能な場合は、緩やかなnode_modulesを作成するオプションもあります。
デフォルト設定
デフォルトでは、pnpm v5はセミストリクトなnode_modulesを作成します。セミストリクトとは、アプリケーションが`package.json`に依存関係として追加されたパッケージのみをrequireできることを意味します(いくつかの例外があります)。ただし、依存関係はすべてのパッケージにアクセスできます。
デフォルト設定は以下のようになります。
; All packages are hoisted to node_modules/.pnpm/node_modules
hoist-pattern[]=*
; All types are hoisted to the root in order to make TypeScript happy
public-hoist-pattern[]=*types*
; All ESLint-related packages are hoisted to the root as well
public-hoist-pattern[]=*eslint*
Plug'n'Play。最も厳格な設定
pnpmはv5.9からYarnのPlug'n'Playをサポートしています。PnPを使用すると、アプリケーションとアプリケーションの依存関係の両方が、宣言された依存関係のみにアクセスできます。これは`hoist=false`を設定するよりもさらに厳格です。なぜなら、モノレポ内では、アプリケーションはルートプロジェクトの依存関係にさえアクセスできないからです。
Plug'n'Playを使用するには、以下の設定を行ってください。
node-linker=pnp
symlink=false
厳格な従来のモジュールディレクトリ
まだPnPを使用する準備ができていない場合は、hoist設定をfalseに設定することで、パッケージが独自の依存関係にのみアクセスできるようにすることができます。
hoist=false
ただし、依存関係の一部が依存関係にないパッケージにアクセスしようとしている場合は、2つのオプションがあります。
-
`pnpmfile.js`を作成し、フックを使用して、不足している依存関係をパッケージのマニフェストに追加します。
-
`hoist-pattern`設定にパターンを追加します。たとえば、見つからないモジュールが`babel-core`の場合は、`.npmrc`に次の設定を追加します。
hoist-pattern[]=babel-core
最悪のケース - ルートへのホイスト
一部のツールは、すべてを仮想ストアのルートに、一部のパッケージをルートにホイストするpnpmのデフォルト設定でも動作しない場合があります。この場合、すべてまたは依存関係のサブセットをモジュールディレクトリのルートにホイストできます。
すべてをnode_modulesのルートにホイストする
shamefully-hoist=true
パターンに一致するパッケージのみをホイストする
public-hoist-pattern[]=babel-*