【JS】packages.jsonのprivate:trueは不要かも
こんにちは!JavaScriptのパッケージ管理の行く末がすごく気になるMizutani(@sirycity)です。どうなるんだろ?
今回はそんなJSのパッケージ管理のファイル、packages.json
に設定するprivate:true
は不要じゃない?って話です。
はじめに結論
確かに不要だけど別に書いときゃいいんじゃないかな
基礎知識
npmとは
JSのパッケージマネージャー。かんたんに言うとライブラリ管理するやつ。みんな使うよね。
packages.jsonとは
npmでどのライブラリを使ってるかがひと目で分かる便利ファイルです。
…いや他にもいろんな機能があるんだけど、メイン機能はライブラリ管理。
npmの他の機能
npmはライブラリを管理するだけじゃなくてライブラリを公開する時にも使います。こっちの機能は使わない人も多いんじゃないかな。
「ライブラリを公開ってどういうこと?」って思うよね。公開してるのはGitHubじゃないの?って思うよね。JSのライブラリはGitHubで開発してnpmで公開みたいにしてる例も多いです。例えばこんな感じ(この辺ちょっと間違ってたらごめん)
ライブラリを作る人はGitHubにコミットして、ライブラリを公開する時にnpmにリリース。んでライブラリを使う人はnpmからインストール。みたいな感じ。
たいていの人はライブラリを作ったりしない?
実際そうだよね。npmをライブラリ管理にだけ使って、ライブラリ公開になんて使わない人がほとんどだと思います。
なので、npmは後者(ライブラリ公開)の機能だけを無効化する設定があります。それがこちら。
{
"private": true
}
こんだけ。これをpackages.json
に書くだけ。これでnpm使ってライブラリ公開はできなくなる。
なぜこんな設定があるの?
だって、npmでライブラリ公開するのってコマンド1つなんですよ。npm publish
ってこんだけ。省略コマンドもあるし。
逆に言うと公開したくないコードがなんかの拍子に押し間違えて公開されちゃったりする可能性も…なくはないわけです。その対策。
このprivate: true
の設定はweb開発の際にはわりと当たり前のように書かれてたりします。例えばこんな感じに。
{
"private": true,
"name": "foo",
"version": "1.0.0",
"description": "foo",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "foo",
"license": "MIT",
"dependencies": {},
"devDependencies": {}
}
でも、privateは不要じゃない?
ここまで言っといてなんですが、別にprivate:trueは不要じゃない? と思えます。
理由
間違って公開しないようにprivate:true
を書いてるんだから、要は誤公開を防止できれば別の方法でも良いわけです。その方法とは…
nameを書かない。
そう、nameを書かない。nameを書かなければそもそもnpmにライブラリを公開できません。
もうちょい詳しく言うと、nameとversionのどっちかが抜けてると公開できません。んで、nameとかversionの欄は正直ライブラリ管理の用途としては不要です。
…一応nameとか書いておくとnodeの環境変数として参照できたりするんですが、日本語が使えないので定数としては使い勝手が悪いです。
nameも、versionも、privateも。全部消しちゃいましょ。こんな感じに。
{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {},
"devDependencies": {}
}
scripts、dependencies、devDependencies。この3つだけでもとりあえず動きます。ライブラリによっては警告されるけどね。
さいごに
そこまでしてprivateを消す意味とは…特にないです。まあでも、情報量が少ない方が見やすいよね?(苦し紛れ)
本日は以上です。ご清聴ありがとうございました。