普段、PHPの開発でcomposerを使いまくるので改めて再入門を書きました。
対象読者
- 既にcomposerを使ったシステムの開発の経験がある
- ターミナル(黒い画面)さわれる
- composerのインストールと
composer install
,composer update
なら知ってる - composer.jsonの中身も見たことある
- composerの便利さは実感している
- これからcomposerを使ったプロジェクトを新規に始めるけど、やり方が分からない
composerを全く知らない方は、まずこちらの記事を読んで使ってみてください。
本記事は脱初心者向けの記事になります。
composerコマンドのおさらい
脱初心者したときによく使うコマンドを見ていきましょう。
composer install
- 説明不要。
composer.lock
に書かれたパッケージをインストール。
- 説明不要。
composer update
composer.json
をチェックしてcomposer.lock
を更新。さらにパッケージをインストール。
composer require
composer.json
に新しいパッケージを追加してcomposer.lock
を更新、パッケージをインストール。
composer init
- composerを使ったプロジェクトを始める時に最初に叩くコマンド。対話形式で
composer.json
を作成する。
- composerを使ったプロジェクトを始める時に最初に叩くコマンド。対話形式で
composer remove
composer.json
からパッケージを削除して、composer.lock
を(以下ry- vendorディレクトリ内のソースコードも削除してくれる。
composer search
- Packagist上のパッケージを検索。パッケージ名をど忘れした時に便利。
composer validate
composer.json
とcomposer.lock
を検証して、書き方が違ったら教えてくれる。
他にも使えるコマンドはたくさんありますが、この7つを覚えておけば困ることはありません。もっと知りたい人はターミナルにcomposer
と打ち込んで叩いて確認してください。
じゃあ脱初心者の人があんまり使ったことが無いであろう、composer require
, composer init
, composer search
の3つの使い方を紹介します。(なぜ使わないかというと、composer.jsonのメンテナンスをした経験が無いからです。逆に経験がある方は使い方を知ってます。)
紹介する順番は、require –> search –> initの順番で行きます。
composer requireコマンド
composerでインストールできるパッケージは、基本的にPackagistに公開されいるもののみです。(設定をすれば、Github上のパッケージもインストールできますが、そのうち書きます。)
例えば今開発しているプロジェクトに新しくswiftmailerをインストールする場合にcomposer require
コマンドを使います。
composer require swiftmailer/swiftmailer
パッケージ名は必ず「<ベンダー名>/<パッケージ名>」という構成になっています。なので、composer require swiftmailerではインストールできません。正しいパッケージ名を知るにはPackagist上で確認するか、ググれば確認できます。
実際に先程のコマンドを実行すると、
- Packagist上のパッケージを検索
composer.json
にパッケージ名と最新の安定バージョンを追記- パッケージの依存関係を解消して
composer.lock
の更新 - 必要なパッケージをPackagistからダウンロード
ということが行われます。
composer.json
をエディタで編集しても同じことが出来ますが、その場合は編集した後にcomposer update
を実行しないとインストールできませんし、記述ミスがあってもupdate実行時にならないと気づきません。
composer require
コマンドならすぐにインストールされるので、記述ミスが発生しません。
composer require --dev <パッケージ名>
コマンドも併せて紹介します。
phpunitやcodeceptionなど、開発環境でしか使わないパッケージをインストールする時に--dev
オプションを付けます。composer install --no-dev
を実行すると、開発環境でしか使わないパッケージをインストールしなくなります。よく分からないうちは使わない方が良いです。
composer searchコマンド
さて、パッケージを追加する方法は分かりましたが、何のパッケージをインストールすれば良いのか分からないときに使うのがcomposer search
コマンドです。あとは、パッケージ名をど忘れした時にも使います。(実は後者の方が多いと思う)
正しいパッケージ名を知るにはPackagistで検索すれば良いのですが、ターミナル上でも検索できます。ブラウザを開くのが好きか、ターミナルを開くのが好きかの違いだけです。
Fakerを使いたいんだけど、ベンダー名をど忘れした、今ターミナル開いてるからここで検索したい、というときはcomposer search faker
を実行します。
1 2 3 4 5 6 |
$ composer search faker fzaninotto/faker Faker is a PHP library that generates fake data for you. tomaj/faker Fork of php Faker PHP library with custom Data provider. gourmet/faker Faker support for CakePHP 3 bobthecow/faker The easiest way to generate fake data in PHP (以下略) |
名前がわかったのでcomposer require fzaninotto/faker
を実行します。
composer initコマンド
まだcomposer.json
が無い状態から、新しくプロジェクトを始める時に使うコマンドです。
- パッケージ名(<ベンダー名>/<パッケージ名>)
- ディスクリプション
- 著作者と連絡先メールアドレス
- 最低限のスタビリティ
- パッケージタイプ
- ライセンス
- 依存パッケージを追加
- 開発環境での依存パッケージを追加
composer.json
のプレビュー
という最低限最初にやらなくてはならないことを全部対話形式で設定し、最後にcomposer.json
を作成します。composer.json
をエディタで書いて作成しても良いのですが、記述ミスなどを考えるとコマンドでやってしまう方が楽です。
以下は、実行例です。参考にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
Welcome to the Composer config generator This command will guide you through creating your composer.json config. Package name (<vendor>/<name>) [tomotomo/composer-test]: Description []: hello world Author [tomotomo <tomotomo@example.com>, n to skip]: Minimum Stability []: Package Type (e.g. library, project, metapackage, composer-plugin) []: project License []: MIT Define your dependencies. Would you like to define your dependencies (require) interactively [yes]? Search for a package: swiftmailer Found 15 packages matching swiftmailer [0] swiftmailer/swiftmailer [1] typo3/swiftmailer [2] duncan3dc/swiftmailer [3] voku/swiftmailer [4] neos/swiftmailer [5] yiisoft/yii2-swiftmailer [6] djordje/li3_swiftmailer [7] symfony/swiftmailer-bundle [8] cspoo/swiftmailer-mailgun-bundle [9] wildbit/swiftmailer-postmark [10] accord/mandrill-swiftmailer [11] accord/mandrill-swiftmailer-bundle [12] openbuildings/swiftmailer-css-inliner [13] symfony/swiftmailer-bridge [14] aimeos/ai-swiftmailer Enter package # to add, or the complete package name if it is not listed: 0 Enter the version constraint to require (or leave blank to use the latest version): Using version ^5.4 for swiftmailer/swiftmailer Search for a package: Would you like to define your dev dependencies (require-dev) interactively [yes]? Search for a package: phpunit Found 15 packages matching phpunit [0] phpunit/phpunit [1] eher/phpunit [2] sugared-rim/phpunit [3] jbzoo/phpunit [4] backplane/phpunit [5] task/phpunit [6] phpunit/phpunit-mock-objects [7] phpunit/phpunit-selenium [8] phpunit/phpunit-story [9] phpunit/phpunit-skeleton-generator [10] phpunit/dbunit [11] phpunit/phpunit-dom-assertions [12] phpunit/phpunit-mink-trait [13] phpunit/phpcov [14] phpunit/php-token-stream Enter package # to add, or the complete package name if it is not listed: 0 Enter the version constraint to require (or leave blank to use the latest version): Using version ^5.6 for phpunit/phpunit Search for a package: { "name": "tomotomo/composer-test", "description": "hello world", "type": "project", "require": { "swiftmailer/swiftmailer": "^5.4" }, "require-dev": { "phpunit/phpunit": "^5.6" }, "license": "MIT", "authors": [ { "name": "tomotomo", "email": "tomotomo@example.com" } ] } Do you confirm generation [yes]? |
ぶっちゃけcomposer init
を使わずに、まっさらな状態からいきなりcomposer require
すればcomposer.json
を作成できますし、それでちゃんと動きます。オープンソースとして公開できるレベルのプログラムを作る時に役立つコマンドです。
composer.jsonとcomposer.lockファイル
この2つのファイルについて何度も触れたので既に分かっているかもしれませんが、改めて解説します。
composer.json
はcomposerの設定ファイルです。パッケージを追加したり削除するときは.jsonの方を編集します。(実際にはコマンドを使って編集しますが)
実際に何のパッケージを追加するのかを書いたのがcomposer.lock
ファイルです。composerは.lockファイルの中身を見て実際にインストールするパッケージを把握します。
composer.lock
はrequire,updateした時に自動的に更新されるファイルなので、絶対にエディタを使って更新しないでください。おかしくなったときは慌てずにcomposer update
を実行してください。
「実際に」ってどういうこと?
例えばPHPUnitを使う場合を例に説明します。composer require phpunit/phpunit
を実行してvendorディレクトリを見ると、、、
1 2 3 4 5 6 7 8 9 10 11 12 |
vendor ├── autoload.php ├── bin ├── composer ├── doctrine ├── myclabs ├── phpdocumentor ├── phpspec ├── phpunit ├── sebastian ├── symfony └── webmozart |
あれ?インストールした記憶のないdoctrine, myclabs, phpdocumentor, phpspec, sebastian, symfony, webmozartのベンダー名のディレクトリができてるぞ?※binとcomposerは特別なフォルダなので無視
実はPHPUnitが依存しているパッケージをcomposerがかき集めて自動的にインストールしています。Packagist上のPHPUnitの説明ページを見てみましょう。
phpunit/phpunit-mock-objectsのリンク先を見に行くと、また依存しているパッケージが確認できます。
なので、PHPUnitをインストールすると、依存している実際に必要なパッケージを全てインストールします。composer.lock
には実際にインストールしなくてはならないパッケージの情報が、漏れ無くダブり無く書かれているというわけです。
まとめ
Packagistには先人が作ってきてくれた素晴らしいPHPのライブラリがたくさんあります。上手く活用することでプログラミングする量を何分の1、何十分の1にも減らすことが出来ます。
その恩恵を受けるために今一度composerについて勉強し直してみましょう。
(PR)