Composer (
getcomposer.org )は比較的新しく、すでにかなり人気のあるPHP用の依存関係マネージャーです。 プロジェクトが依存するライブラリを説明すると、Composerが必要なライブラリをインストールします! さらに、Composerは古典的な意味でのパッケージマネージャーではありません。 はい、「パッケージ」またはライブラリと呼ばれるエンティティで動作しますが、グローバルではなく各プロジェクト内に個別にインストールされます(これは古き良きPEARとの主な違いの1つです)。
手短に、それがどのように機能するか:
- 複数のライブラリに依存するプロジェクトがあります。
- これらのライブラリの一部は、他のライブラリに依存しています。
- プロジェクトで、コードが直接依存するライブラリを記述します。
- Composerは、プロジェクト全体に必要なライブラリの必要なバージョンを見つけてダウンロードし、プロジェクトのフォルダーにインストールします。
Composerを作成する際、著者は同様のプロジェクト(Node.jsのnpmとRubyのBundler)からアイデアとインスピレーションを引き出しました。
元々は
Nils Adermannと
Jordi Boggianoの 2人が設計および開発し、現在20人以上の貢献者がプロジェクトに参加しています。このプロジェクトはMITライセンスの下で配布され、
githubで入手できます。
最初のコミットは2011年4月に行われ、現在Composerはalpha3ステージにあります。 ただし、すでに非常に安定しており、多くの一般的なPHPプロジェクト(たとえば、
Symfony 2 )で使用されています。 Composerを使用するプロジェクトのリストは、公式のComposerパッケージリポジトリである
packagist.orgにあります。 ところで、最近のDevconf 2012カンファレンスで、Yiiフレームワークの開発者は、レポートで
Yii2もComposerを使用する可能性が高いと述べました。
この記事では、Composerの主な機能について簡単に説明し、Composerを使用してデモプロジェクトを作成し、必要なライブラリをダウンロードしてみます。 すべての例は、github.comおよびbitbucket.orgで入手できます。
Composerでできること
- パッケージとその依存関係をダウンロードします。
- デフォルトでは、パッケージは公式のpackagist.orgリポジトリからダウンロードされます。 誰でも自由にパッケージを追加して、インストールを世界中で簡単かつ便利にすることができます。
- パッケージは、packagist.orgからだけでなく、git、mercurial、またはsvnリポジトリからもダウンロードできます。
- github.comまたはbitbucket.orgからパッケージをダウンロードするには、インストールされているバージョン管理システム(gitまたはhg)は必要ありません。ComposerはこれらのサイトのAPIを介して動作します。
- パッケージを含むgit / hg / svnリポジトリは、上記のサイトの1つだけでなく、たとえば企業のローカルネットワークや一般的なローカルハードドライブなど、他の場所にも配置できます。
- さらに、インストールされたライブラリをComposerパッケージとしてコンパイルする必要はなく、任意の構造の任意のgit / hg / svnリポジトリからインストールできます。
- 最後に、インストールされたパッケージはgit / hg / svnリポジトリである必要はなく、uriからアクセス可能な任意のzipファイルにすることができます!
- すべてのパッケージは現在のディレクトリ(インストールコマンドが実行された場所)にインストールされます。これにより、異なるプロジェクトで並行して作業するときに、複数の異なるバージョンのライブラリを使用できます。
- updateコマンドは、インストールされている(または誤って削除された)パッケージをすべて最新バージョンに更新します。 または、特別なcomposer.lockファイルを作成すると、バージョンが最新に更新されない場合があります。これにより、プロジェクトで使用されるすべてのライブラリの安定バージョンの組み合わせを修正できます。
- パッケージをインストールすると、autoload.phpが自動的に生成され、プロジェクトコードでインストールされたライブラリに接続できます。 Composerパッケージを準備する場合、phpファイルの場所と命名の標準であるPSR-0を使用することをお勧めします。これにより、autoloadで簡単に見つけることができます。 いずれの場合でも、パッケージの作成者は、特定のクラスまたは名前空間のファイルをオートロードが検索するルールを説明できます。 Composerパッケージとしてフレーム化されていないライブラリ(たとえば、githubを備えた任意のgitリポジトリ)をインストールする場合、自動ロードルールを記述するタスクはあなたの肩にかかっています。 したがって、生成されたautoload.phpには魔法はありません-すべてをロードできます(クラス外の一連の関数を持つライブラリを含む)。主なことは、ルールを(ライブラリの作成者またはあなたが)記述することです。
作業例:プロジェクトでComposerを使用する
Composerの使用方法を理解するために、PHPで「スーパーハローワールド」という小さなプロジェクションを作成します。 車輪を再発明してコードを「最初から」書きたくないので、既製のライブラリとフレームワークを使用します。
次のライブラリを使用します。
- Silexマイクロフレームワーク(packagist.orgのComposerパッケージとして入手可能)、
- Twigテンプレートエンジン(packagist.orgのComposerパッケージとして利用可能)、
- Composerパッケージとして設計し、githubで公開したSuperLoggerへの訪問のロガー
- 古くから愛されているsuperlibレガシーライブラリ。名前空間のないクラスのハッシュとクラスのない関数で構成されています。 ライブラリはgithubで公開されていますが、コンポーザーパッケージではありません
前と同じように、必要なフレームワークとライブラリをダウンロードし、それらを展開する場所を考えて、プロジェクト内に一連のrequire(または信頼性のためにrequire_once)を作成しました。
どうすればそれを行うことができます:Composerを使用します-すべてのライブラリをダウンロードし、autoload.phpを生成します。 さらに、同僚に「スーパーハローワールド」を表示したい場合は、プロジェクトのコードをgithub(または他の場所)で公開するだけで十分です。リポジトリに必要なすべてのライブラリを含めず、それらをインストールするための長い手順を準備しません。 同僚が「Super Hello World」をダウンロード(クローン)してコマンドを実行するだけで十分です。
php composer.phar install
Composerは単一の
composer.pharファイルとして配布されます(
pharはphpアーカイブです)-実際には、いくつかのコマンド(インストール、更新など)を取り、ライブラリをダウンロードおよび解凍できるPHPスクリプトです。
ところで、スタートアップ構文について少し説明します。
Windowsで作業している場合、ほとんどの場合、次のように記述します。
php C:\path\to\composer.phar install
composer.batを作成し、それを%PATH%に入れることで、あなたの人生を単純化できます。
LinuxおよびOS Xでは、次のようなコマンドを構成できます。
composer install
composer.json
これで、Super Hello Worldプロジェクトを作成する準備が整いました。 そして、私はそれを書きました:
http :
//github.com/pqr/superhelloworld このコードは、webディレクトリにある1つのindex.phpファイルと、viewsディレクトリにあるlayout.twigテンプレートで構成されています。
すべての先頭は
composer.jsonファイルです。 これは、プロジェクトのルート、この場合は、webディレクトリとviewディレクトリの隣にある必要があります。 このファイルでは、プロジェクトが依存するライブラリを指定する必要があります。 さらに、これらのライブラリがComposerパッケージとして設計されていない場合、インストールされたライブラリに関する追加情報を指定する必要があります(たとえば、autoload.phpのオートロードクラスと関数のルールを記述します)。
composer.jsonは、ご想像のとおり、JSONデータ形式です。 「
なぜ正確にJSONなのか? 」という質問に対して、Composer開発者は「
理由。それを受け入れてください。 」
と答えます。
すべての命令が配置される1つのjsオブジェクトを記述する必要があります。 最初で最も重要な指示:
require 。
packagist.orgからパッケージを接続します
{ "require": { "php":">=5.3.0", "silex/silex":"dev-master", "twig/twig":">=1.8,<2.0-dev" } }
ここでは、PHPバージョン5.3.0以降、silex(マイクロフレームワーク)、およびtwig(テンプレートエンジン)に対するプロジェクトの依存関係について説明しました。 SilexとTwigはpackagist.orgで作曲家パッケージとして利用できるため、追加の構成は不要です。 Silexは、さらにいくつかのパッケージに依存していることに注意してください。それらはすべて自動的にダウンロードおよびインストールされます。
パッケージ名は、スラッシュで区切られた2つの部分で構成されて
います 。ベンダー名と
ライブラリ名です。 サプライヤーの名前は、多くの場合、著者のニックネームまたは会社名です。 プロバイダーの名前がライブラリ自体またはフレームワークの名前と一致する場合があります。
パッケージごとに、バージョン番号を指定する必要があります。 たとえば、「dev-master」のようにリポジトリ内でブランチすることができます。devプレフィックスはブランチ名であることを示し、ブランチ自体は「マスター」と呼ばれます。 水銀リポジトリの場合、同様のエントリは「dev-default」のようになります。 バージョン番号として、比較演算子を使用してより複雑なルールを指定できます。 ところで、リモートリポジトリからコードをダウンロードすると、Composerはこのリポジトリ内のタグとブランチ名をスキャンして、バージョン番号に似たものを探します。たとえば、タグ「v1.2.3」はバージョン1.2.3へのポインタとして使用されます。
独自のCompsoerパッケージに接続します
次に、適切に設計されているが、packagist.orgではなくgithubで公開されている独自のSuperLoggerパッケージを接続しましょう。
{ "require": { "php":">=5.3.0", "silex/silex":"dev-master", "twig/twig":">=1.8,<2.0-dev", "mycompany/superlogger":"dev-master" }, "repositories":[ { "type":"git", "url":"http://github.com/pqr/superlogger" } ] }
Composerに「mycompany / superlogger」パッケージの検索場所を知らせるために、対応するgithubリポジトリへのリンクを含む
リポジトリの配列を追加しました。 リポジトリ配列のエントリはrequireブロックに直接関連していないことに注意してください-パッケージとリポジトリの間に対応関係はありません。 私の知る限り、Composerは指定されたすべてのリポジトリ(packagist.orgサイトを含む)で必要なすべてのパッケージを検索し、いくつかの内部優先順位に一致するものをダウンロードします。 もっと深く私はまだこの瞬間を理解していませんでした、誰かが詳細を知っていれば私を修正してください。
任意のGitリポジトリを接続する
ここで、GitHubにあるsuperlibレガシーライブラリを接続しますが、コンポーザパッケージではありません。 彼女はとても古いです。
{ "require":{ "php":">=5.3.0", "silex/silex":"dev-master", "twig/twig":">=1.8,<2.0-dev", "mycompany/superlogger":"dev-master", "pqr/superlib":"1.2.3" }, "repositories":[ { "type":"git", "url":"http://github.com/pqr/superlogger" }, { "type":"package", "package":{ "name":"pqr/superlib", "version":"1.2.3", "source":{ "type":"git", "url":"http://github.com/pqr/superlib", "reference":"master" }, "autoload":{ "classmap":["timer.php"], "files":["lib_functions.php"] } } } ] }
pqr / superlibパッケージを完全に説明するオブジェクトがリポジトリ配列に追加されました。 実際、これはライブラリの作成者が作成し、自分のリポジトリに入れるべき記述です。 ただし、タスクの条件に応じて、superlibはコンポーザーパッケージではないため、Super Hello Worldプロジェクトの一部として記述を作成する必要がありました。 同様に、次のような他のライブラリを接続できます。 シンプルなzipファイル。
シンプルなzipファイルを接続します
たとえば、svnソースを含むzipファイルとして配布されるSmartyテンプレートエンジンへの依存の説明は、次のようになります。
{ "repositories":[ { "type":"package", "package":{ "name":"smarty/smarty", "version":"3.1.7", "dist":{ "url":"http://www.smarty.net/files/Smarty-3.1.7.zip", "type":"zip" }, "source":{ "url":"http://smarty-php.googlecode.com/svn/", "type":"svn", "reference":"tags/Smarty_3_1_7/distribution/" } } } ], "require":{ "smarty/smarty":"3.1.*" } }
自動ロード命令
プロジェクトに戻りましょう。
pqr / superlibについて説明するために、
autoloadステートメントを追加しました。 これはファイルtimer.phpを示します。このファイルでは、将来のオートローダーがクラスを検索し、関数lib_functions.phpでファイルを指定します-autoload.phpの開始時に接続を強制されます。
したがって、私たちのプロジェクトは以下で構成されています:
- ルートファイルはcomposer.jsonです。
- ルートはwebおよびviewsディレクトリです。
- Webディレクトリ内には、アプリケーションの「ビジネスロジック」を含むファイルがあります。index.php;
- viewsディレクトリ内には、layout.twigテンプレートファイルがあります。
- さらに、webフォルダーに、mod_rewrite / url rewriterルールを使用して.htaccess(apacheの場合)およびweb.config(IIS 7.5の場合)を配置します。これらはComposerの設定とは直接関係がありません。
すべてを起動する準備ができています。
composer installを実行します
php composer.phar install
Composerはリポジトリを複製し、必要なバージョンで
ベンダーディレクトリに展開します。
ベンダーディレクトリはプロジェクトルートに作成します。 開梱後、ベンダーディレクトリに次の情報があります。
- ファイルautoload.php
- サービスディレクトリ.composerおよびcomposer
- にきび-Silexマイクロフレームワークとともに引っ張られたパッケージ
- silex-マイクロフレームワーク自体、依存関係を記述するときに明示的に要求しました
- symfony-Silexが動作するために必要なSymfony 2のコンポーネント
- twigは、明示的にリクエストしたテンプレートエンジンです
- mycompany-このディレクトリ内には、githubからダウンロードされたスーパーロガーリポジトリがあります
- pqr-このディレクトリ内にはsuperlibリポジトリがあり、githubからもダウンロードされます
web / index.phpファイルの先頭にあるautoload.phpに接続するだけで(「../vendor/autoload.php」が必要)、すべてのライブラリと機能が利用可能になります!
独自の作曲家パッケージを作成する方法は?
このプロジェクトでは、コンシューマライブラリの観点からComposerを使用しました。 しかし、他の人が使用できるようにComposerパッケージを自分で作成する方法は?
実際、この記事の例を準備するときにこれらのパッケージの1つを作成しました。 スーパーロガーリポジトリのルートには、同様の構造の
composer.jsonファイルがあり、パッケージ自体とその依存関係が記述されています(スーパーロガーの場合、依存関係はありません)。 他の例:ベンダーフォルダーにダウンロードしたsilexおよびtwigリポジトリ-それらはすべてルートにcomposer.jsonファイルがあります-見て、学んでください!
そして、もちろん、公式の
getcomposer.org/doc/ウェブサイトのドキュメントを忘れないでください。
このトピックは、あなた自身で勉強するために残しておきます。
まとめると
この記事では、Composerとは何か、その歴史について話し、主な機能について説明しました。 あなたと私は、Composerを使用してpackagist.orgおよび独自のリポジトリからパッケージをインストールするプロジェクトを作成しようとしました。
試してみる時間です!- Composerをダウンロード( getcomposer.org/download/ )
- superhelloworldをダウンロード(git clone git://github.com/pqr/superhelloworld.git)
- 依存関係のインストール(cd superhelloworld && php composer.phar install)
- 表示されるベンダーフォルダーと、生成されたautoload.phpを調べます
- プロジェクトでComposerを使用する
... - 利益!!!
関連するリンクをいくつか追加するには:
作曲家:パート1-何と理由作曲家:パート2-影響PS
作業プロジェクトでは、Mercurialバージョン管理システムを使用しています。 また、bitbucket.orgのComposerからこの例をダウンロードしてインストールすることもできます:
http ://bitbucket.org/pqr/superhelloworld
警告 :残念ながら、WindowsマシンでMercurialリポジトリでComposerを使用すると、1つのバグが見つかりました。 システムドライブ以外のドライブにあるプロジェクトに依存関係をインストールすると、エラーが発生します。 たとえば、C:システムドライブで、プロジェクトをD:\ someprojectフォルダーのどこかに展開すると、プロジェクトはMercurialリポジトリとして公開されたライブラリに依存します-Composerはそれらを正しく読み取ることができません。 近い将来このバグを修正し、プルリクエストを公式のComposerリポジトリに送信します。