パッケージ管理ツールのComposerとnpmの違いについて
こんにちは、ありあけこういちです。
パッケージ管理ツールでよくnpm とcomposerについてよく耳にすると思いますが、そもそも両者にはどのような違いがありますでしょうか?
Composerとnpmの一番大きな違い
Composerはphpのライブラリバージョン管理ツール
npmはnode.jsのライブラリバージョン管理ツール
Composerについて
Composerとは、特定のコマンドを打つだけでPHPのライブラリがインストールできるPHPのパッケージ管理ツールです。
Composerがライブラリやパッケージを管理しているファイルcomposer.jsonやcomposer.lockです。
composer.jsonとcomposer.lockについて
composer.jsonは、composerで管理する依存パッケージを定義するためのファイルです。composer installコマンドにてインストールされたパッケージは、composer.jsonと同じ階層にあるvendorフォルダ内に配置されます。
ただし、composer.jsonにて任意のパスが記されている場合、その指示のrフォルダ内に配置されます。
composer.lockは、composer install/updateコマンドでインストールされたパッケージのバージョンを記録します。composer.lockファイルをGit管理してチーム間で共有すると、チーム開発をどのように進めれば良いかはイメージが着きやすいと思います。
composer installの場合
composer.lockファイルがない場合は、composer.jsonをもとにライブラリをインストールし、composer.lockを生成します。
composer.lockファイルがある場合ば、composer.lockに記されたバージョンのパッケージがインストールされる。
composer updateの場合
composer.lockに記されたバージョンを無視し、composer.jsonの情報を基にライブラリが最新の状態に変更されます。
開発環境と本番環境にて使うパッケージを分けたい場合
開発時のみ必要で、本番環境では必要の無いパッケージは、インストールコマンド、composer requireにdevオプションをつけて実行することができます。
例は下記です。
{
"require": {
"{本番環境で必要なパッケージ}": "{本番環境で必要なパッケージのバージョン}"
},
"require-dev": {
"{開発環境で必要なパッケージ}": "{開発環境で必要なパッケージのバージョン}"
}
}
コマンドの例としては、devオプションをつけて流します。
composer require {本番環境で必要なパッケージ}
composer require --dev {開発環境で必要なパッケージ}
npmについて
npm とはNode.jsのパッケージを管理するパッケージ管理システムです。基本的にnode_modulesフォルダー配下にパッケージがインストールされます。
そもそも、Node.jsって何?
一言で言うと、JavaScript実行環境です。ブラウザ上という制限された環境でしか動けないJavaScriptをRubyやPythonのようにパソコン上で動かせるようにしてくれるのが「Node.js」です
Yarnについて
npmとよく一緒に紹介される別のnode.jsのライブラリバージョン管理ツールYarnについてですが、npmよりもインストールが速く、セキュリティーが高いなどの特徴を持つ、Facebookが開発したパッケージ管理システムです。npmと互換性があり、基本的にnpmの設定ファイルであるpackage.jsonが使用できます。
package.jsonおよびpackage-lock.jsonについて
package.json
Version Range(^、~など)が書ける。
package-lock.json
Version Range(^、~など)が書けず、現在のバージョン名が正確に明示されている。
npm installとnpm ciとの違い
npm install
npm ci と違い、npm install {パッケージ名} のコマンドで個別のパッケージをインストールできる。
速度が比較的遅い。
package-lock.jsonがない場合、package.jsonのdependenciesに記されたパッケージをインストールするが、この際に^(キャレット)もしくは~(チルダ)で記されている場合は最初にパッケージをインストールした時と異なるバージョンがインストールされる可能性がある。
npm ci
package-lock.jsonをもとにインストールされる。
npm installと違い、個別のパッケージをインストールするのは不可能。(一気に全てのプロジェクトをインストールする。)
速度が比較的速い。
既存の環境(最初にパッケージインストールした時と同じバージョン)でのインストールになり、協業やチーム同士で同じ開発環境を構築する場合に役立つ。
ご参考までに
composer.jsonやpackage.jsonファイルで、*(アスタリスク)で書かれている場合は可能なバージョンの中の一番新しいものを取得します。
^(キャレット)はメジャーバージョン固定の意味で、現在指定したバージョンの2桁目の範囲までにアップデート ex) ^4.0.2で指定されていると、アップデートされる範囲は <5.0.0
~(チルダ)はメジャーバージョン固定の意味で、現在指定したバージョンの最後の桁の範囲までにアップデート ex) ~4.0.2で指定されていると、アップデートされる範囲は <4.1.0