.npmrc
pnpm は、コマンド行、環境変数、および .npmrc
ファイルから設定を取得します。
pnpm config
コマンドを使用して、ユーザーおよびグローバルの .npmrc
ファイルの内容を更新および編集することができます。
関連する4つのファイルは次のとおりです。
- プロジェクトごとの設定ファイル(
/path/to/my/project/.npmrc
) - ワークスペースごとの設定ファイル (
pnpm-workspace.yaml
ファイルが含まれているディレクトリー) - ユーザーごとの設定ファイル(
~/.npmrc
) - グローバルな設定ファイル (
/etc/npmrc
)
.npmrc
ファイルはすべて key = value
という INI形式 のパラメータのリストです。
.npmrc
ファイルの値には、 ${NAME}
構文を使用して環境変数を含めることができます。 また、 環境変数はデフォルト値と共に指定することもできます。 ${NAME-fallback}
は、 NAME
が設定されていない場合、fallback
を返します。 ${NAME:-fallback}
はNAME
が 設定されていないか空文字の場合に、fallback
を返します。
依存の巻き上げ設定
hoist
- デフォルト: true
- タイプ: boolean
true
の場合、すべての依存関係は node_modules/.pnpm/node_modules
に巻き上げられます。 これにより、リストされていない依存に、 node_modules
内のすべてのパッケージからアクセスできるようになります。
hoist-workspace-packages
Added in: v8.14.0
- デフォルト: false
- タイプ: boolean
When true
, packages from the workspaces are symlinked to either <workspace_root>/node_modules/.pnpm/node_modules
or to <workspace_root>/node_modules
depending on other hoisting settings (hoist-pattern
and public-hoist-pattern
).
hoist-pattern
- デフォルト: ['*']
- タイプ: string[]
どのパッケージを node_modules/.pnpm/node_modules
に巻き上げるかを指定します。 デフォルトでは、全てのパッケージが巻き上げられます。しかし、phantom dependency を持つ、扱いに困るパッケージの存在が分かっている場合には、このオプションにより、それらを除外して巻き上げることができます (推奨)。
例:
hoist-pattern[]=*eslint*
hoist-pattern[]=*babel*
!
を使用して巻き上げから除外するパターンを指定することもできます。
例:
hoist-pattern[]=*types*
hoist-pattern[]=!@types/react
public-hoist-pattern
- デフォルト: ['*eslint*', '*prettier*']
- タイプ: string[]
hoist-pattern
が仮想ストア内の隠しモジュールディレクトリに依存を巻き上げるのに対し、public-hoist-pattern
はパターンにマッチする依存をルートのモジュールディレクトリへと巻き上げます。 ルートのモジュールディレクトリへの巻き上げによって、アプリケーションのコードは phantom dependencies へアクセスできるようになります。たとえ依存関係の解決方法が不適切に変更されたとしてもアクセス可能です。
この設定は、依存関係を適切に解決していなくて扱いに困る、プラグイン可能なツールを利用する場合に便 利です。
例:
public-hoist-pattern[]=*plugin*
注意: shamefully-hoist
を true
に設定するのと public-hoist-pattern
を *
に設定するのは同じ効果があります。
!
を使用して巻き上げから除外するパターンを指定することもできます。
例:
public-hoist-pattern[]=*types*
public-hoist-pattern[]=!@types/react
shamefully-hoist
- デフォルト: false
- タイプ: Boolean
デフォルトでは、pnpm はそれなりに厳格な node_modules
を作成します。依存パッケージは定義されていない依存パッケージへアクセスできますが、node_modules
の外からはアクセスできません。 エコシステム内のほとんどのパッケージは、この方法で問題なく動作します。 しかし、ルートの node_modules
に依存パッケージが巻き上げられていないと動作しないツールがある場合には、この設定を true
にすることで巻き上げることができます。
node_modules に関する設定
store-dir
- デフォルト:
- $PNPM_HOME 環境変数が設定されている場合、 $PNPM_HOME/store
- $XDG_DATA_HOME 環境変数が設定されている場合、 $XDG_DATA_HOME/pnpm/store
- Windowsの場合: ~/AppData/Local/pnpm/store
- macOSの場合: ~/Library/pnpm/store
- Linuxの場合: ~/.local/share/pnpm/store
- タイプ: path
パッケージをディスク上のどこに保存するか指定します。
ストアはインストールを行うのと同じディスク状にある必要があります。つまり、ディスクごとに一つのストアを持つことになります。 現在のディスクにホームディレクトリがある場合は、その中にストアが作成されます。 ディスク上にホームディレクトリがない場合は、ストアはファイルシステムのルートに作られます。 例えば、/mnt
にマウントされたファイルシステム上でインストールを行なった場合、ストアは /mnt/.pnpm-store
に作られます。 Windows システムでも同様です。
異なるディスク上のストアを指定することも可能ですが、その場合 pnpm はハードリンクをせずにパッケージをコピーします。これは、ハードリンクは同一のファイルシステム上でのみ使用可能なためです。
modules-dir
- デフォルト: node_modules
- タイプ: path
(node_modules
の代わりに) 依存パッケージを インストールする場所を指定します。
node-linker
- デフォルト: isolated
- タイプ: isolated, hoisted, pnp
Node.js のパッケージをインストールするのに使用するリンカーを指定します。
- isolated - 依存関係は
node_modules/.pnpm
の仮想ストアからシンボリックリンクでインストールされます。 - hoisted - シンボリックリンクは作成されず、フラットな
node_modules
が作成されます。 npm や Yarn Classic によって作成されるnode_modules
と同じです。 この設定を使用すると、Yarnのライブラリーの 1 つが巻き上げに使用されます。 この設定を使用する合理的な理由は以下のとおりです:- 使っているツールはシンボリックリンクではうまく機能しない。 React Native のプロジェクトは、おそらく、巻き上げられた(hoisted)
node_modules
を使用する場合にのみ機能します。 - プロジェクトがサーバーレスホスティングにデプロイされる。 一部のサーバーレスサービスの提供者 (AWS Lambdaなど) はシンボリックリンクをサポートしていません。 この問題を解決する代替策は、デプロイ前にアプリケーションをバンドルすることです。
"bundledDependencies"
としてパッケージを公開したい場合- --preserve-symlinks フラグを指定して Node.js を実行している場合。
- 使っているツールはシンボリックリンクではうまく機能しない。 React Native のプロジェクトは、おそらく、巻き上げられた(hoisted)
- pnp -
node_modules
なし。 Plug'n'Play は Yarn で使用されている Node のための革新的な方式です。pnp
をリンカーとして使う場合には、symlink
をfalse
に設定することが推奨されます。
symlink
- デフォルト: true
- タイプ: Boolean
symlink
を false
に設定すると、pnpm は仮想ストアのディレクトリをシンボリックリンクを用いずに構成します。 この設定は node-linker=pnp
と組み合わせる際に役立ちます。
enable-modules-dir
- デフォルト: true
- タイプ: Boolean
false
を設定すると、pnpm はモジュールディレクトリ (node_modules
) にファイルを一切書き込みません。 この設定はユーザスペース上のファイルシステム (FUSE) にモジュールディレクトリがマウントされている場合に有用です。 node_module
ディレクトリを FUSE でマウントするのに使える実験的な CLIツールがあります: @pnpm/mount-modules
virtual-store-dir
- デフォルト: node_modules/.pnpm
- タイプ: path
ストアにリンクするディレクトリを指定する。 すべてのプロジェクトの直接および間接的な依存はこのディレクトリへリンクされる。
Windows 上でのパスの長さ上限に関する問題を解決するのに役立ちます。 何らかの非常に長いパスを持つ依存がある場合、ドライブ上のルートに仮想ストアを置くことが可能です。 (例: C:\my-project-store
)
もしくは、仮想ストアを .pnpm
にして .gitignore
に追記することもできます。 依存のディレクトリをひとつ上にすることで、スタックトレース上での表示がすっきりします。
注意: 仮想ストアは複数のプロジェクト間で共有することはできません。 すべてのプロジェクトはそれぞれ固有の仮想ストアを持つ必要があります。 (ルートが共通のワークスペース内のプロジェクトは除く)
package-import-method
- デフォルト: auto
- タイプ: auto, hardlink, copy, clone, clone-or-copy
Controls the way packages are imported from the store (if you want to disable symlinks inside node_modules
, then you need to change the node-linker setting, not this one).
- auto - ストアからパッケージをクローンしようとします。 クローンがサポートされていない場合、ストアからパッケージをハードリンクします。 クローンもリンクもできない場合は、コピーします。
- hardlink - ストアからパッケージをハードリンクします。
- clone-or-copy - ストアからパッケージをクローンしようとします。 クローンがサポートされていない場合、コピーにフォールバックします。
- copy - ストアからパッケージをコピーします。
- clone - ストアからパッケージをクローンします。 (別名: copy-on-write、 参照リンク)
クローンはパッケージを node_modules に書き込む最良の方法です。 最速かつ最も安全です。 クローンを使用している場合、node_modules 内のファイルを編集可能です(編集しても中央ストア側のファイルは変更されません)。
残念ながら、すべてのファイル システムがクローン作成をサポートしているわけではありません。 pnpmで最高の経験をするためには、コピーオンライト (CoW) ファイルシステム (例えばLinuxでは Ext4 の代わりに Btrfs) を使用することをお勧めします。
modules-cache-max-age
- デフォルト: 10080 (単位は分、7 日)
- タイプ: number
孤立したパッケージを node_module
デ ィレクトリから削除するまでの時間を分単位で指定します。 pnpm はパッケージのキャッシュを node_module
ディレクトリに保持します。 これにより、ブランチを切り替えたり、依存のダウングレードを行う際のインストールのスピードを速くします。
ロックファイル設定
lockfile
- デフォルト: true
- タイプ: Boolean
false
に設定すると、pnpm は pnpm-lock.yaml
を読み込んだり、書き込んだりしません。
prefer-frozen-lockfile
- デフォルト: true
- タイプ: Boolean
true
に設定すると、pnpm-lock.yaml
が存在して、 package.json
の依存指定の条件を満たす場合に、ヘッドレスインストールを行います。 ヘッドレスインストールでは、lockfile を変更する必要がないため、すべての依存関係の解決がスキップされます。
lockfile-include-tarball-url
- デフォルト: false
- タイプ: Boolean
pnpm-lock.yaml
のすべてのエントリに、パッケージの tarball への完全な URL を追加します。
git-branch-lockfile
- デフォルト: false
- タイプ: Boolean
When set to true
, the generated lockfile name after installation will be named based on the current branch name to completely avoid merge conflicts. For example, if the current branch name is feature-foo
, the corresponding lockfile name will be pnpm-lock.feature-foo.yaml
instead of pnpm-lock.yaml
. It is typically used in conjunction with the command line argument --merge-git-branch-lockfiles
or by setting merge-git-branch-lockfiles-branch-pattern
in the .npmrc
file.
merge-git-branch-lockfiles-branch-pattern
- デフォルト: null
- Type: Array or null
This configuration matches the current branch name to determine whether to merge all git branch lockfile files. By default, you need to manually pass the --merge-git-branch-lockfiles
command line parameter. This configuration allows this process to be automatically completed.
例:
merge-git-branch-lockfiles-branch-pattern[]=main
merge-git-branch-lockfiles-branch-pattern[]=release*
You may also exclude patterns using !
.
レジストリ & 認証設定
registry
- デフォルト: https://registry.npmjs.org/
- タイプ: url
npm パッケージレジストリのベースURL (末尾のスラッシュを含む)。
<scope>:registry
特定のスコープのパッケージに対して使うレジストリ。 例えば、 @babel:registry=https://example.com/packages/npm/
を設定すると、pnpm add @babel/core
やその他の @babel
スコープのパッケージをインストールする際に、デフォルトのレジストリの代わりに https://example.com/packages/npm
を使うように強制します。
<URL>:_authToken
レジストリにアクセスするときに使用する認証用の Bearer トークンを指定します。 例:
//registry.npmjs.org/:_authToken=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
環境変数を使用することもできます。 例:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
あるいは、 .npmrc
をまったく変更せずに、環境変数を直接使用することもできます。
npm_config_//registry.npmjs.org/:_authToken=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
<URL>:tokenHelper
tokenHelper とは、アクセストークンを出力する実行ファイルです。 これは、authToken が一定値ではなく定期的に更新されるような場合に使用します。 スクリプトやその他のツールが、既存のリフレッシュトークンを使って新しいアクセストークンを取得できるようになります。
helper へのパスの設定は、引数なしの絶対パスである必要があります。 安全性を高めるため、この値はユーザーの .npmrc
にのみ設定することが許されています。 そうしないと、プロジェクトがプロジェクトのローカルの .npmrc
に値を置いて、任意の実行ファイルを実行することができてしまいます。
デフォルトのレジストリに tokenHelper を設定します:
tokenHelper=/home/ivan/token-generator
指定されたレジストリに tokenHelper を設定します:
//registry.corp.com:tokenHelper=/home/ivan/token-generator