見出し画像

パッケージ管理ツールのComposerとnpmの違いについて

こんにちは、ありあけこういちです。
パッケージ管理ツールでよくnpm とcomposerについてよく耳にすると思いますが、そもそも両者にはどのような違いがありますでしょうか?

Composerとnpmの一番大きな違い

  • Composerはphpのライブラリバージョン管理ツール

  • npmはnode.jsのライブラリバージョン管理ツール

Composerについて

Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you.

composerの公式ドキュメントからの抜粋
https://getcomposer.org/doc/00-intro.md

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

参考記事


この記事が気に入ったらサポートをしてみませんか?