はじめに

実際にパッケージをインストールすることなく、package.json に良い感じで依存関係を追加する方法が無いか調べた。

※AWS Lambda の開発で docker-lambda に渡す package.json を手で書きたくなかった。

参考: docker-lambda を使って AWS Lambda Function を開発する方法

TL;DR

  • npm-add-dependencies を使えば OK
    • 標準コマンドでは対応不可
  • npm install -g npm-add-dependencies でインストール
  • npm-add-dependencies <package>package.json に追記

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. インストール
    2. 使い方
    3. 実行例
      1. 1パッケージ
      2. 複数パッケージ
      3. target 指定
      4. –no-overwrite 指定
      5. バージョン指定
  5. まとめ
  6. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.5
BuildVersion: 18F132

$ nodenv --version
nodenv 1.3.0

$ node --version
v12.7.0

$ npm --version
6.10.0

$ npm v npm-add-dependencies
npm-add-dependencies@0.1.5

詳細

node.js - How to npm install to only save dependency to package.json? - Stack Overflow によると、公式コマンドとしては存在しない(古いバージョンだといけた?)が、それ専用のパッケージがある。

  1. npm-add-dependencies - npm
  2. npm-add - npm
  3. adddep - npm

Last Commit などから npm-add-dependencies - npm を採用。

インストール

1
$ npm install npm-add-dependencies -g

使い方

1
$ npm-add-dependencies <dependencies> [target] [--no-overwrite]

複数インストールしたい場合はスペース区切りで記述。

1
$ npm-add-dependencies axios vue ...

target オプションで、記述先を変更できる。

  • 指定なし: "dependencies"
  • --dev: "devDependencies"
  • --peer: "peerDependencies"
  • --bundled: "bundledDependencies"
  • --optional: "optionalDependencies"

--no-overwrite は、すでに package.json に記述済みのものを上書きしないためのオプション。

実行例

1パッケージ

1パッケージのみで npm-add-dependencies を実行。

1
2
3
4
5
6
$ npm-add-dependencies axios
This script adds dependencies (latest versions) into the package.json file without installing them

Adding dependencies to 'dependencies'...
Processed: axios, latest version: 0.19.0
Done.

diff を確認、dependenciesaxios が追記されている。

1
2
3
4
5
6
7
8
9
10
     "test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
- "license": "ISC"
-}
+ "license": "ISC",
+ "dependencies": {
+ "axios": "^0.19.0"
+ }
+}

当然だがインストールしていないため、node_modules は存在しない。

1
2
$ ls node_modules
ls: node_modules: No such file or directory

複数パッケージ

複数パッケージでも、同じように dependencies に追記される。

1
$ npm-add-dependencies vue react
1
2
3
4
5
6
7
8
9
10
11
12
     "test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
- "license": "ISC"
-}
+ "license": "ISC",
+ "dependencies": {
+ "axios": "^0.19.0",
+ "react": "^16.9.0",
+ "vue": "^2.6.10"
+ }
+}

target 指定

開発環境向けに --dev を指定。

1
2
3
4
5
6
$ npm-add-dependencies --dev bulma
This script adds dependencies (latest versions) into the package.json file without installing them

Adding dependencies to 'devDependencies'...
Processed: bulma, latest version: 0.7.5
Done.

"devDependencies" に追記される。

1
2
3
4
5
6
7
8
9
10
     "test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
- "license": "ISC"
-}
+ "license": "ISC",
+ "devDependencies": {
+ "bulma": "^0.7.5"
+ }
+}

その他の指定種別は 使い方 を参照。

–no-overwrite 指定

--no-overwrite を指定することで、package.json に記載済みのパッケージの上書き(= バージョン変更)を防ぐことができる。

1
2
3
4
5
6
{
"name": "hoge",
"dependencies": {
"bulma": "0.7.0"
}
}

上記のような package.json がある状況で、npm-add-dependencies bulma とすると bulma は上書きされてしまう。

1
$ npm-add-dependencies axios bulma
1
2
3
4
5
6
7
8
 {
"name": "hoge",
"dependencies": {
- "bulma": "0.7.0"
+ "axios": "^0.19.0",
+ "bulma": "^0.7.5"
}
}

--no-overwrite を付けることで、bulma の上書きを防ぐことができる。

1
$ npm-add-dependencies axios bulma --no-overwrite
1
2
3
4
5
6
7
 {
"name": "hoge",
"dependencies": {
+ "axios": "^0.19.0",
"bulma": "0.7.0"
}
}

バージョン指定

npm install axios@0.18.0 のように npm-add-dependencies axios@0.18.0 とすると、うまく動かない。

1
$ npm-add-dependencies axios@0.18.0
1
2
3
4
5
6
{
"name": "hoge",
"dependencies": {
"axios@0.18.0": "^0.19.0"
}
}

Issue 作って、PR 送ったので、Merge されれば指定可能になる。

まとめ

  • npm-add-dependencies を使えば OK
  • npm install -g npm-add-dependencies でインストール
  • npm-add-dependencies <package>package.json に追記

参考文献

関連記事