ディレクトリごとにnpmrcを切り替える

2022-04-24

privateなパッケージの管理に外部のレジストリを利用しているが、個人のプロジェクトでは標準のレジストリを利用したい ディレクトリの管理を下記のようにユーザーごとにわけており、 company 配下のリポジトリのみregistryを切り替えたい

~
└── work
    ├── kkenya # 標準のregistryを利用
    │   └── todo-app
    └── company1 # 配下でregistryを切り替えたい
        ├── project1
        └── project2

結論

あるディレクトリ配下全てのプロジェクトで設定を共有することはできず、プロジェクトごとに .npmrc を追加するか Scoped packges を利用する必要があった

プロジェクトごとの .npmrc を配置する

.npmrc.company1 のように切り替えたい設定を記述した設定ファイルを用意し、適用させたいプロジェクト配下に .npmrc をシンボリックリンクで作成するシェルスクリプトを作成した

Scoped packages

@company1/project1 のように複数のパッケージを同一のスコープに分類し、npm configでスコープに紐づくregistryを設定することで、npm install で設定したスコープのパッケージのみ特定のレジストリからインストールすることができる

npm config set @myco:registry http://reg.example.com

詳細

npmの設定ファイルである .npmrc の評価には4つの優先順位がある

  • プロジェクトごとの設定ファイル(~/work/company1/project2/.npmrc)
  • ユーザーごとの設定ファイル(~/.npmrc)
  • グルーバルの設定ファイル($PREFIX/etc/npmrc)
  • npmにビルドインされた設定ファイル

プロジェクトごとの設定ファイルでは .npmrc を配置したディレクトリ以下全てに設定を適用させることはできず、適用させたいプロジェクト直下にそれぞれ .npmrc を配置する必要がある

~
├── .npmrc
└── work
    └── company1
        ├── .npmrc # サブディレクトリに影響しない
        ├── project1 # ~/.npmrcが読み込まれる
        └── project2 # ~/.npmrcが読み込まれる
~
├── .npmrc
└── work
    └── company1
        ├── project1 # ~/work/company1/project1/.npmrcが読み込まれる
        │   └── .npmrc -> ~/.npmrc.company1
        └── project2 # ~/work/company1/project2/.npmrcが読み込まれる
            └── .npmrc -> ~/.npmrc.company1

対応として .npmrc.company1 のように切り替えたい設定を記述した設定ファイルを用意し、適用させたいプロジェクト配下に .npmrc をシンボリックリンクで作成するシェルスクリプトを作成した

利用するregistryを記述した設定ファイル .npmrc.company1 をホームディレクトリに配置

registry=https://registryexample.test

シェルスクリプトを作成 カレントディレクトリ上でディレクトリのみを取得し、それぞれのディレクトリごとに .npmrc.company1 を参照するシンボリックリンク .npmrc を作成するシェルスクリプトを作成する

#!/bin/bash

readonly NPMRC=".npmrc.company1"

directories=(`find $(pwd) -type d -mindepth 1 -maxdepth 1`)
for dir in ${directories[@]}
do
    ln -s ${HOME}/${NPMRC} ${dir}/.npmrc
done

小ネタ

registryの参照が切り替わっているか確認する

プロジェクトごとに .npmrc が切り替わっていれば registry が設定されていることを確認できる

% npm config list
# ...
registry = "https://registryexample.test"

参考


Web系ソフトウェアエンジニアの備忘録

Contact: 3982ne@gmail.com