Composer-PHPの依存関係マネージャー

Composergetcomposer.org )は比較的新しく、すでにかなり人気のあるPHP用の依存関係マネージャーです。 プロジェクトが依存するライブラリを説明すると、Composerが必要なライブラリをインストールします! さらに、Composerは古典的な意味でのパッケージマネージャーではありません。 はい、「パッケージ」またはライブラリと呼ばれるエンティティで動作しますが、グローバルではなく各プロジェクト内に個別にインストールされます(これは古き良きPEARとの主な違いの1つです)。



手短に、それがどのように機能するか:

  1. 複数のライブラリに依存するプロジェクトがあります。
  2. これらのライブラリの一部は、他のライブラリに依存しています。
  3. プロジェクトで、コードが直接依存するライブラリを記述します。
  4. Composerは、プロジェクト全体に必要なライブラリの必要なバージョンを見つけてダウンロードし、プロジェクトのフォルダーにインストールします。


Composerを作成する際、著者は同様のプロジェクト(Node.jsのnpmとRubyのBundler)からアイデアとインスピレーションを引き出しました。



元々はNils AdermannJordi 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でできること







作業例:プロジェクトでComposerを使用する



Composerの使用方法を理解するために、PHPで「スーパーハローワールド」という小さなプロジェクションを作成します。 車輪を再発明してコードを「最初から」書きたくないので、既製のライブラリとフレームワークを使用します。



次のライブラリを使用します。

  1. Silexマイクロフレームワーク(packagist.orgのComposerパッケージとして入手可能)、
  2. Twigテンプレートエンジン(packagist.orgのComposerパッケージとして利用可能)、
  3. Composerパッケージとして設計し、githubで公開したSuperLoggerへの訪問のロガー
  4. 古くから愛されている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 installを実行します


 php composer.phar install
      
      





Composerはリポジトリを複製し、必要なバージョンでベンダーディレクトリに展開します。 ベンダーディレクトリはプロジェクトルートに作成します。 開梱後、ベンダーディレクトリに次の情報があります。



web / index.phpファイルの先頭にあるautoload.phpに接続するだけで(「../vendor/autoload.php」が必要)、すべてのライブラリと機能が利用可能になります!



独自の作曲家パッケージを作成する方法は?


このプロジェクトでは、コンシューマライブラリの観点からComposerを使用しました。 しかし、他の人が使用できるようにComposerパッケージを自分で作成する方法は?



実際、この記事の例を準備するときにこれらのパッケージの1つを作成しました。 スーパーロガーリポジトリのルートには、同様の構造のcomposer.jsonファイルがあり、パッケージ自体とその依存関係が記述されています(スーパーロガーの場合、依存関係はありません)。 他の例:ベンダーフォルダーにダウンロードしたsilexおよびtwigリポジトリ-それらはすべてルートにcomposer.jsonファイルがあります-見て、学んでください!



そして、もちろん、公式のgetcomposer.org/doc/ウェブサイトのドキュメントを忘れないでください。

このトピックは、あなた自身で勉強するために残しておきます。



まとめると



この記事では、Composerとは何か、その歴史について話し、主な機能について説明しました。 あなたと私は、Composerを使用してpackagist.orgおよび独自のリポジトリからパッケージをインストールするプロジェクトを作成しようとしました。



試してみる時間です!

  1. Composerをダウンロード( getcomposer.org/download/
  2. superhelloworldをダウンロード(git clone git://github.com/pqr/superhelloworld.git)
  3. 依存関係のインストール(cd superhelloworld && php composer.phar install)
  4. 表示されるベンダーフォルダーと、生成されたautoload.phpを調べます
  5. プロジェクトでComposerを使用する

    ...
  6. 利益!!!




関連するリンクをいくつか追加するには:

作曲家:パート1-何と理由

作曲家:パート2-影響



PS



作業プロジェクトでは、Mercurialバージョン管理システムを使用しています。 また、bitbucket.orgのComposerからこの例をダウンロードしてインストールすることもできます: http ://bitbucket.org/pqr/superhelloworld



警告 :残念ながら、WindowsマシンでMercurialリポジトリでComposerを使用すると、1つのバグが見つかりました。 システムドライブ以外のドライブにあるプロジェクトに依存関係をインストールすると、エラーが発生します。 たとえば、C:システムドライブで、プロジェクトをD:\ someprojectフォルダーのどこかに展開すると、プロジェクトはMercurialリポジトリとして公開されたライブラリに依存します-Composerはそれらを正しく読み取ることができません。 近い将来このバグを修正し、プルリクエストを公式のComposerリポジトリに送信します。



All Articles