【NPM】モノレポスコープ @xxx をどうするか問題
こんにちは、フリーランスエンジニアの太田雅昭です。
モノレポのスコープ問題
モノレポの場合、パッケージ毎にpackage.jsonを使用します。その際にnameを指定するのですが、下記が理想です。
- @xxx/yyy のように、スコープを指定したい
- スコープはNPMに存在しないものを指定したい
- わざわざ新しくNPMで取得することはしたくない
大規模なプロジェクトならNPM上でスコープを取得してPrivate運営することもあるでしょうが、ほとんどはそこまではいきません。単純に、ローカルで使うだけのためのスコープが欲しいのです。とはいえ、NPMとは被りたくない。
スコープ名の制限
スコープは下記の制限があります。
https://github.com/npm/validate-npm-package-name#naming-rules
- package name length should be greater than zero
- all the characters in the package name must be lowercase i.e., no uppercase or mixed case names are allowed
- package name can consist of hyphens
- package name must not contain any non-url-safe characters (since name ends up being part of a URL)
- package name should not start with
.
or_
- package name should not contain any spaces
- package name should not contain any of the following characters:
~)('!*
- package name cannot be the same as a node.js/io.js core module nor a reserved/blacklisted name. For example, the following names are invalid:
- http
- stream
- node_modules
- favicon.ico
- package name length cannot exceed 214
たとえば@abc/abcといった名前は使えますが、NPMとバッティングする可能性があります。かといって、@/などといったスコープは使用できません。
import validate from 'validate-npm-package-name';
console.log(validate('@abc/abc')) // OK
console.log(validate('@/abc')); // ERROR: name can only contain URL-friendly characters
console.log(validate('@_/abc')); // ERROR: name can only contain URL-friendly characters
安全に使えるスコープがある
NPM公式ではありませんが、@localrepo は安全に使えるとされています。
https://www.npmjs.com/package/@localrepo/pledge
これはBenjieさんによって作成されています。Benjieさんはスポンサーページを見ると、2025年6月30日時点で現在:77, 過去:172名がスポンサーとなっています。すごい。Graphql関連のライブラリがFeatureされています。実績があるため、相応の信頼性も担保されているかと思います。
なぜNPMは対応しないのか
モノレポ構成の場合、こうしたローカル限定のスコープの需要があるのは明確かと。にもかかわらずNPMが公式で対応しないのはなぜでしょう。勝手な考えですが、おそらくPrivateの課金アカウントへの誘導の意図があるものと推測できます。そう考えると、致し方ないのかなとは思います。