A Day In The Boy's Life -23ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

最近、クラウド化の勢いによって新規システム構築やリプレイスの案件においてオンプレミスでやろうということが少なくなってきました。

クラウドを利用することのメリットは、構築のコスト削減というだけでなくリリースまでのスピード感や保守・運用の手間を軽減することなどがありますので、システム部門ではない人にとってはこの部分のメリットがどうしても魅力的に感じるようです(実際はどうなのかはおいといて)。


しかし、クラウドを利用することにより、システム部門の存在意義が薄くなるだけでなく、今までその分野を支えてきたエンジニアの質の変化というのも起きていたりして、企業全体にとっての歪みが生まれているようにも感じたりします。



捨てる技術と注ぐ技術


クラウドによるサービス構築をするということは、そのシステムを作らず業務に注力できるということにはなりますが、今まで自部門で構築していたものがなくなったとなれば、当然その分野における技術力というのは低下していきます。


少なくとも、運用フェーズにおいても何らかの改善のための要件決めや他システムとのインターフェース部分の作りこみや業務の組み立て方などで話ができるレベルの人材というのは必要になってきますが、あくまで話ができるレベルであって、その構築や内部設計レベルで対応・理解できる人材というのは存在意義がなくなるため希薄になります


この辺のことは、企業内のキャリアパスにおいてエンジニアとしてある一定の経験を積めば上流工程の仕事を任せていくという流れがあったりもして、経験を積めば積むほどエンジニアの職人技を磨いていかせるというよりは、より単価の高い仕事を取らせるための人材育成に持ち込もうという方針もあったりでその流れを加速させる結果になっている気もします。

まぁ、クラウド化したのが単なるウェブシステムというのであれば、単に労力を削減したぐらいで済む話ではありますけど、その技術がどこでどう関連しているのかということを理解せずに捨て去ってしまうと、後々のトラブルが発生した際に対応できるエンジニアが全然いなくってベンダー任せになったり、自社の運用は手放したといってもその分野の技術を利用したシステム構築案件を受注したりしたときにわかる人がいないといった事態にもなるために注意が必要です。


自社のコアコンピタンスとなる分野の技術を捨てるということはないでしょうけど、技術は関連するために少なからずエンジニアの能力も失われている部分が出てきます。

こういったことは別にIT業界だけの話ではなくって、時代の変化によってニッチとなってしまった分野の職人さんが減っているというのも同じことで、失ったことでどうなるのかという未来を考えておかなくてはなりません。

それがレガシーな技術であって新しいものに取って代わられているのであれば単に時代錯誤な代物として見切ってもよいかもしれませんが、その技術が完全に死なない以上、何らかのかかわりを持たざるを得ないことはよくあることです。


例えば、メールは死んだなんてことは数年前から言われていますけど、現在でもビジネスでの情報交換の主流はメールになってますし、じゃあそれを見切るかといってもシステムからメールを飛ばしたいなんて要件は当たり前についてきます。

プログラム的には単にメール送信のメソッドを呼び出すだけでよいのかもしれませんけど、そのメールの配送経路やプロトコルまで理解しておかないと組み立てられないシステムもあったりして、専門のエンジニアがいない場合に現場で困ることにもなったり、トラブルが起きたときに調査・対応ができる人がいないとなると致命的な状況に陥る可能性があります



クラウドを操る技術の汎用性


クラウドサービスを利用する際に、単に表向きのシステムを使うということだけでなく、自社のシステムと連携させて使うといったケースがあったりします。

この際にクラウド側で用意しているAPIを通して連携させたりもするのですが、そういったクラウドを利用するAPIの知識というのはそのサービス特有のものであったりして、他でも同様の事ができるわけでもありません

確かに、プロトコル的にHTTP(S)をつかってRESTなAPIを叩くというようなコアになる部分は同じかもしれませんが、一度作ればそういったところもラッピングされてしまうため、単にパラメータの変更だけで保守が成り立ってしまうことにもなります(それが一つのメリットであることは確かなのですが)。


こういった状況が続けば、当然高度な知識を持っていないエンジニアでも対応できるようになるわけですから組織としてのスキルレベルが低下することにもなるでしょうし、エンジニア自身もそのサービスでのやり方しか理解できなくなって応用が利かない状況にもなります。

これは現実問題としてよくある、レガシーなシステムを数十年触っていてそのシステムの仕事しかできない人材が出来上がったという状況と変わらないわけで、単にそれがクラウドという名の今風な環境に変わったというだけです。


こうやって溜め込まれていくナレッジというのは、現場のエンジニアに対してシステム構築や保守・運用の中核を担うためのスキルというよりは、サービスやツールを扱うためのマニュアルのようなものであって、現にそういったマニュアルを細かくアップデートすることを何度もやらせているのもよく見る光景です。

そして、そのマニュアルが多ければ多いほど現場のスキルが充実していっていると勘違いしていることもよく起きていることだったりします。


クラウドという名の雲の中に複雑な技術を隠してしまっているわけで、その中の技術というものに誰も興味を示さなくなるのでその分野のスキルを磨こうという人が出てきません。

今までの煩雑な保守・運用から開放された!という喜びの中で、使わなくなったスキルを何時までも維持したいと思う人は少ないでしょう。

しかし、そこで得た新たなスキルというのは利用しているクラウドの中で閉じた世界であって、汎用性があるものでなかったりします。


別にクラウド自体を否定しているわけではなくて、要は使いどころをきちんと考えようとか、それを使ったときに使わなくなる技術(つまりはその分野のエンジニアがいなくなるリスク)って何だっけ、ってちゃんと考えた方がいいよと思うわけです。

オンプレ万歳という時代がくるということは無いと思いますが、クライド化への傾倒によって自社の技術レベルが失われ競争力も低下するリスクが出てこないのかということをちゃんと考えとかないとシステム部門としても何かあった際にベンダーに丸投げするだけではますます存在価値がなくなってくることになってしまうと思います。





[Composer] PHPのパッケージ管理にComposerを使う の続き。

composerの管理に使うcomposer.jsonファイルの中身についての解説です。


composer.jsonの基本フォーマット


前回のエントリ内で書いたcomposer.jsonは下記の内容でした。


{
  "require": {
    "squizlabs/php_codesniffer": "dev-master",
    "pear/pear_exception": "1.0.*@dev",
    "pear/log": "dev-master"
  }
}

この中で、requireキーにはComposerで管理する対象パッケージとバージョンを「:」で区切り(というかJSONの配列フォーマット)で記述します。

Packagistを見ながらインストールする場合、requireキーの書き方は記載があるので参照しながら書いていくのがよいと思います。


特定のバージョンをインストールしたい場合は、バージョン欄に番号やブランチ名などを指定します。

バージョンの番号はワイルドカードやレンジで指定することもできます。

「1.0.*」とした場合、1.0系の全てのバージョン(1.0.1や1.0.2など)が対象となります。

「1.*」とした場合、1系の全てのバージョン(1.1や1.2、1.1.1や1.1.10など)が対象となります。


下記のようにレンジを指定した場合、その範囲のバージョンが対象となります。


{
  "require": {
    "squizlabs/php_codesniffer": "1.0 - 2.0",
    "pear/pear_exception": ">=1.0,<1.1"
  }
}

squizlabs/php_codesnifferのレンジの指定の仕方では、バージョン1.0から2.0まで(1.0や2.0を含む)が対象となります(つまり、1.1や1.1.10、1.9など)。

pear/pear_exceptionの場合は、バージョン1.0から1.1まで(1.1を含まない)が対象となります(つまり、1.0.1や1.0.10など)。

結構細かい制御ができるみたいで、「~1.2」と書くと1.2以上、2.0未満を対象にしたりといろんな書き方が用意されているみたいなので詳細はマニュアル も参照してください。


もう1つ最初のcomposer.jsonの例の中で


"pear/pear_exception":1.0.*@dev,

という書き方がありますが、最後の@devはスタビリティフラグと呼ばれるものらしいです。

これはそのパッケージの安定性を示すフラグで、デフォルトではstable(安定版)となっています。

ちょっとパッケージの例を変えますが、nette/utils というパッケージの最新版をインストールするには


"nette/utils":2.3.*@dev

という書き方をしますが、スタビリティフラグ(@dev)を削除して


"nette/utils": "2.3.*"

のような書き方をすると「2.3.*@stable」という扱いになるのでパッケージが見つからないというエラーが出てしまいます。


$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - The requested package nette/utils could not be found in any version, there may be a typo in the package name.

Potential causes:
 - A typo in the package name
 - The package is not available in a stable-enough version according to your minimum-stability setting
   see  for more details.

Read  for further common problems.

最初の設定例のpear/exceptionでも同様なのですが、こちらには@dev以外にも安定板のバージョン1.0.0が公開されているため、エラー無くインストールできたりします。

この場合、@devの1.0.x-devのバージョンではなくstableのバージョン1.0.0がインストールされてるわけですが、この2つはエイリアスになっているので結局は一緒のものがインストールされてます。


デフォルトのスタビリティフラグを変えたい場合、minimum-stabilityという属性をセットすることで変更することができます。


{
  "minimum-stability": "dev",
  "require": {
    "nette/utils": "2.3.*"
  }
}

上記の例であればうまくインストールができますが、パッケージ全体のスタビリティフラグが変わるため、安定しないバージョンのパッケージがインストールされる可能性があり、通常は変更せずにパッケージごとに必要に応じてスタビリティフラグを明記したほうがよいと思います。

この辺の話は、下記の記事が詳しく書かれています。


Composerがパッケージのstabilityを解決するしくみ @ オープンソースこねこね



その他の便利なオプションとか


依存関係を無視してインストールする


composer.jsonに設定できるその他の便利なオプションとして、依存関係を無視するprovideオプションがあります。

例えば、pear/logパッケージはpear/pear_exceptionパッケージを必要としますが、下記の様に書くことでpear/pear_exceptionをインストールしなくてもpear/logパッケージを導入できます(それで動くか動かないかは別にして)。


{
  "provide": {
    "pear/pear_exception": "*"
  },
  "require": {
    "pear/log": "dev-master"
  }
}

ソースだけダウンロードしたい場合や依存関係にあるもののその機能をまったく使わないといった場合は便利なオプションかもしれません。


リポジトリを指定する


デフォルトでcomposerがパッケージを検索、取得するリポジトリはpackagistからになりますが、別のリポジトリを指定することもできます。

例えば、PEARパッケージはpackagistでも提供されていますが、PEARのリポジトリからもインストール可能です。


{
  "repositories": [
    {
      "type": "pear",
      "url": "http://pear.php.net/"
    }
  ],
  "require": {
    "pear-pear.php.net/PEAR" : "*"
  }
}

上記のようにrepositoriesの属性を追加します。


$ composer install
Loading composer repositories with package information
Initializing PEAR repository http://pear.php.net
Installing dependencies (including require-dev)
  - Installing pear-pear.php.net/xml_util (1.2.3)
    Downloading: 100%         
  - Installing pear-pear.php.net/console_getopt (1.3.1)
    Downloading: 100%         
  - Installing pear-pear.php.net/structures_graph (1.0.4)
    Downloading: 100%         
  - Installing pear-pear.php.net/archive_tar (1.3.13)
    Downloading: 100%         
  - Installing pear-pear.php.net/pear (1.9.5)
    Downloading: 100%         
Writing lock file
Generating autoload files

上記のようにPEARサイトからインストールされていることがわかります。 packagistからインストールした場合の表示はこんな感じ。


$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing pear/pear_exception (v1.0.0)
    Loading from cache

  - Installing pear/xml_util (1.2.3)
    Downloading: 100%         

  - Installing pear/console_getopt (v1.3.1)
    Downloading: 100%         

  - Installing pear/structures_graph (dev-trunk 6331691)
    Cloning 633169128f282e749b1efdbda77b2760a8b110d0

  - Installing pear/archive_tar (1.3.11)
    Downloading: 100%         

  - Installing pear/pear (dev-master d346efa)
    Cloning d346efa9809bdf0e53d711fbffd385d070207f96

pear/pear suggests installing pear/pear_frontend_gtk (For GTK support)
pear/pear suggests installing pear/pear_frontend_web (For Web support)
Writing lock file
Generating autoload files

ちなみに、repositoriesの属性はその他のリポジトリからもソースをダウンロードできたりして、例えばcomposerを通してjQueryをインストールする(インストールというかソースのダウンロード)というようなこともできたりします。


{
  "repositories": [
    {
      "type": "pear",
      "url": "http://pear.php.net/"
    },
    {
      "type": "package",
      "package": {
        "name": "jquery/jquery",
        "version": "2.1.3",
        "type": "jquery",
        "dist": {
          "url": "http://code.jquery.com/jquery-2.1.3.js",
          "type": "file"
        }
      }
    }
  ],
  "require": {
    "pear-pear.php.net/PEAR" : "*",
    "jquery/jquery": "*"
  }
}

上記のようにpackageのタイプを追加し、ダウンロード先のURLなどの情報を書いておき、requireでjqueryを指定すればインストールできます。


$ composer update
Loading composer repositories with package information
Initializing PEAR repository http://pear.php.net
Updating dependencies (including require-dev)
  - Installing jquery/jquery (2.1.3)
    Downloading: 100%         
Writing lock file
Generating autoload files

まぁ、使い道の良し悪しはあるもののパッケージ管理という観点では楽になるかもしれません。

詳細はマニュアル も参照してください。


インストール前後でスクリプトを実行する


インストールやアップデートをトリガーとしてとあるバッチを動かしたいといったことも可能です。

例えば、パッケージが更新されたらメール通知を行うといったことができます。


{
  "autoload": {
    "psr-0": {
        "MyVendor\\MyClass": ""
    }
  },
  "scripts": {
      "post-package-install": [
          "MyVendor\\MyClass::postPackageInstall"
      ],
      "post-package-update": [
          "MyVendor\\MyClass::postPackageInstall"
      ]
  },
  "require": {
    "nette/utils": "2.3.*@dev"
  }
}

scriptsの属性が設定箇所で、post-package-installやpost-package-updateがトリガーとなるイベント名です。

それぞれ、パッケージがインストール/更新が発生した際にMyClass.phpのpostPackageInstall()を呼び出すという処理になります。

設定できるトリガーはマニュアル 参照。


MyClass.phpは下記のようなものです。


<?php

namespace MyVendor;

use Composer\Script\Event;

class MyClass
{
    public static function postPackageInstall(Event $event)
    {
        $installedPackage = $event->getOperation()->getPackage()->getName();
        var_dump($installedPackage);
    }
}


このファイルは、Composerのルートディレクトリ内(composer.jsonが配置されているのと同じディレクトリ)のMyVendor/MyClass.phpとして保存しています。

パスの通し方は、Composerがオートロードできる箇所ならどこでもよいのですが、composerのautoloadの設定にてパスを指定していればそのプログラムが呼び出されます。


余談ですが、インストール/更新されたパッケージ名を取り出すことをしているのですが、$event->getOperation()->getPackage()はパッケージがインストールされた場合しか呼び出せません。

ですので、post-update-cmdやpost-install-cmdのイベントで呼び出そうとすると下記のようにPHPエラーが発生します。


Fatal error: Call to undefined method Composer\Script\CommandEvent::getOperation() 

実際にcomposerのスクリプト内を見ればわかりますが、post-update-cmdではCommandEventクラスが呼び出され、post-package-updateはPackageEventクラスが呼び出されているからです。

後はスクリプト次第なので、運用・保守で必要なロジックを書いていけばよいかと思います。





今までPHPの外部ライブラリを使う場合はPEARを使ってたんですが、最近は廃れてきて変わってComposerというパッケージ管理ツールが主流となっているようなのでその使い方のメモです。


PEARの場合、root権限が必要だったりするので導入の障壁が高かったんですが、Composerの場合は一般ユーザーでパッケージを導入できるので、ユーザー環境ごとに異なるパッケージやバージョンなどを使うといったメリットがあったりします。



Composerをインストールする


とりあえずインストール方法は、下記のコマンドを叩きます。


$ curl -sS https://getcomposer.org/installer | php

社内環境などプロキシを介してインターネット接続する必要がある場合は、環境変数のHTTP(S)_PROXYをセットしておきましょう。


export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080

下記のようにPHPのエラーが出た場合はメッセージのとおり、detect_unicodeオプションをOFFにセットしなおします。


#!/usr/bin/env php
Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The detect_unicode setting must be disabled.
Add the following to the end of your `php.ini`:
    detect_unicode = Off

The php.ini used by your command-line PHP is: /usr/local/lib/php.ini
If you can not modify the ini file, you can also run `php -d option=value` to modify ini values on the fly. You can use -d multiple 

times.


まぁ、php.ini自体rootじゃないと触れないじゃんって環境の人は、下記のように実行することでもComposerのインストールが可能です。


$ curl -sS https://getcomposer.org/installer | php -d detect_unicode=Off
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /home/foo/composer.phar
Use it: php composer.phar


が、このやり方をとってしまうとcomposer実行時に毎回detect_unicodeオプションを指定しないといけないので、素直にphp.iniを変更したほうがよさそうです。

オプションなしで実行すると下記のようにエラーが出て実行できません。


$ composer
????

先ほどのダウンロードのメッセージが表示されたらインストールは完了で、実行ディレクトリにcomposer.pharというファイルが保存されています。


あとは、PATHが通っている適当なディレクトリへ(名前が少し長いのでお好みで変更して)保存しておきます。


# mv composer.phar /usr/local/bin/composer

Composerが動くかどうかは一度実行してみましょう。


$ composer 
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.0-dev (1d8f05f1dd0e390f253f79ea86cd505178360019) 2015-02-11 11:31:57

Usage:
 [options] command [arguments]

Options:
 --help (-h)           Display this help message.
 --quiet (-q)          Do not output any message.
 --verbose (-v|vv|vvv) Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug.
 --version (-V)        Display this application version.
 --ansi                Force ANSI output.
 --no-ansi             Disable ANSI output.
 --no-interaction (-n) Do not ask any interactive question.
 --profile             Display timing and memory usage information
 --working-dir (-d)    If specified, use the given directory as working directory.

Available commands:
 about            Short information about Composer
 archive          Create an archive of this composer package
 browse           Opens the package's repository URL or homepage in your browser.
 clear-cache      Clears composer's internal package cache.
 clearcache       Clears composer's internal package cache.
 config           Set config options
 create-project   Create new project from a package into given directory.
 depends          Shows which packages depend on the given package
 diagnose         Diagnoses the system to identify common errors.
 dump-autoload    Dumps the autoloader
 dumpautoload     Dumps the autoloader
 global           Allows running commands in the global composer dir ($COMPOSER_HOME).
 help             Displays help for a command
 home             Opens the package's repository URL or homepage in your browser.
 info             Show information about packages
 init             Creates a basic composer.json file in current directory.
 install          Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
 licenses         Show information about licenses of dependencies
 list             Lists commands
 remove           Removes a package from the require or require-dev
 require          Adds required packages to your composer.json and installs them
 run-script       Run the scripts defined in composer.json.
 search           Search for packages
 self-update      Updates composer.phar to the latest version.
 selfupdate       Updates composer.phar to the latest version.
 show             Show information about packages
 status           Show a list of locally modified packages
 update           Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.
 validate         Validates a composer.json


Composerの使い方


PEARの場合はパッケージ名を直接指定してインストールしますが、Composerの場合はJSONファイルに必要なパッケージのリストを定義して管理します。
インストールしたいパッケージは、下記のサイトから見つけることができますが、全てではないので使いたいパッケージがComposerに対応しているかは個別に確認していくほうがよさそうです。


https://packagist.org/


今回はPEARの時にも使っていたPHP_CodeSniffer をインストールしてみたいと思います。

余談ですがPHP_CodeSnifferの使い方は以前に書いた「PHP_CodeSnifferでコーディング規約に準拠しているかチェックをする 」を参照してください。


PHP_CodeSnifferをインストールするためにcomposer.jsonというファイルを作り、下記のように書いておきます。


composer.json
{
  "require": {
    "squizlabs/php_codesniffer": "dev-master"
  }
}

これでインストールを実行してみます。


$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing squizlabs/php_codesniffer (dev-master ecd984a)
    Cloning ecd984a526a6ba78967fdaaf2b313cc0dea4b60f
    Failed to download squizlabs/php_codesniffer from source: The process "git clone --no-checkout 

'https://github.com/squizlabs/PHP_CodeSniffer.git' '/home/foo/workspace/vendor/squizlabs/php_codesniffer' && cd 

'/home/foo/workspace/vendor/squizlabs/php_codesniffer' && git remote add composer 'https://github.com/squizlabs/PHP_CodeSniffer.git' 

&& git fetch composer" exceeded the timeout of 300 seconds.
    Now trying to download from dist
  - Installing squizlabs/php_codesniffer (dev-master ecd984a)
    Downloading: 100%         

Writing lock file
Generating autoload files

インストールが完了するとカレントディレクトリ内にvendorディレクトリができ、その中にダウンロードしたファイルが格納されています。
PHP_CodeSnifferの場合、インストールされるのはコマンドとなりますが、vendor/binにphpcsコマンドが格納されています。


$ ./vendor/bin/phpcs test.php

FILE: /home/foo/workspace/test.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 2 | ERROR | Missing file doc comment
----------------------------------------------------------------------

Time: 58ms; Memory: 6Mb


必要に応じてvendor/binにPATHをを通しておけば便利でしょう。

PHP_CodeSnifferの場合、コマンドにインストールとなるためプログラムの組み込みとか不要ですが、ライブラリ系で自前のプログラムに組み込んで使いたいといった場合、venter/autoload.phpをrequireするだけで利用が可能となります。


例としてpear/log を使って見たいと思いますが、その前にインストールを行います。

先ほどのcomposer.jsonにpear/logの情報を追記します。


{
  "require": {
    "squizlabs/php_codesniffer": "dev-master",
    "pear/log": "dev-master"
  }
}


これでinstallオプションで実行といいたいところですが実際に実行してもインストールされません。


$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run 

update to update them.
Nothing to install or update
Generating autoload files


composerの設定ファイルにはcomposer.json以外にcomposer.lockというファイルがあり、こちらが優先されます。
メッセージのとおりcomposer.lockが更新されていないので特にやること無いよって言われて処理がストップしています。
そこで、更新処理を実行します。


$ composer update  
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for pear/log dev-master -> satisfiable by pear/log[dev-master].
    - pear/log dev-master requires pear/pear_exception 1.0-beta1 -> no matching package found.

Potential causes:
 - A typo in the package name
 - The package is not available in a stable-enough version according to your minimum-stability setting
   see  for more details.

Read  for further common problems.


ただ、上記のようにエラーが出てインストールされません。

メッセージの内容から依存関係があるパッケージが存在しないとあり、Packagistにも依存関係のあるパッケージの情報が記載されています。



※ 厳密に言うとこのメッセージは依存関係のエラーというよりはスタビリティに対応するパッケージ名が見つからないというものです。詳細は「[Composer] composer.jsonを読み解く 」を参照してください。


pear/logの依存関係


ってことで、その情報も追加しておきます(複数のパッケージを書く場合は、JSONの配列表記に注意)。



{
  "require": {
    "squizlabs/php_codesniffer": "dev-master",
    "pear/pear_exception": "1.0.*@dev",
    "pear/log": "dev-master"
  }
}


これでもう一度updateを実行してみます。


$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing pear/pear_exception (1.0-beta1)
    Downloading: 100%         

  - Installing pear/log (dev-master df7aa17)
    Cloning df7aa179cb596a217d6d3eb8c5e900f3a63b9dbe

pear/log suggests installing pear/db (Install optionally via your project's composer.json)
Writing lock file
Generating autoload files


だいぶ話がそれましたがこれでpear/logが新規にインストールされたので早速使ってみます。
通常なら、vendor/pear/log/Log.phpをrequireするところですが、Composerのautoload.phpをrequireすればインストールしているパッケージが利用可能になります。


<?php

require_once './vendor/autoload.php';

$console = Log::factory('console', '', 'TEST');
$console->log('Logging to the console.');

最後にパッケージの削除方法ですが、composer.jsonから不要なパッケージを削除してupdateすれば削除されます。

先ほど追加したpear/pear_exceptionおよびpear/logの行を削除してupdateをしてみます。


$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Removing pear/log (dev-master)
  - Removing pear/pear_exception (1.0-beta1)
Writing lock file
Generating autoload files


定義ファイルを書き換えていくやり方は少し戸惑いますが、慣れてしまえばそんな難しくもありません。

説明が長くなったので、その他の使い方などはまた別途書きたいと思います。