Open15

composer周りメモ

awonosukeawonosuke
  • composerとは?
  • 用語
  • composerのインストール
  • dockerでのcomposerのインストール
  • composerの使い方
  • composer利用する上での検討事項
  • composer昔話
  • composerの恩恵
awonosukeawonosuke

composerとは?
ドキュメントでは以下のように説明されてる。

ComposerはPHPでの依存関係を管理するツールの一つです。

Composer is a tool for dependency management in PHP.

ComposerはYumやAptのようなパッケージマネージャーではない。パッケージやライブラリを扱うが、プロジェクトごとにそれらを管理し、プロジェクトの内のディレクトリ(vedorディレクトリとか)にインストールする。デフォルトでは、グローバル環境には何もインストールしない。だから、依存関係を管理するツールである。便宜上、グローバルコマンドを利用することでグローバルプロジェクトもサポートしてます。

Composer is not a package manager in the same sense as Yum or Apt are. Yes, it deals with "packages" or libraries, but it manages them on a per-project basis, installing them in a directory (e.g. vendor) inside your project. By default, it does not install anything globally. Thus, it is a dependency manager. It does however support a "global" project for convenience via the global command.

https://getcomposer.org/doc/00-intro.md

composerが有益であるのは以下の要求がある時。

  • 開発中プロジェクトが複数のライブラリ、パッケージに依存している
  • そのライブラリ、パッケージの一部が他のライブラリに依存している

上記の要求をcomposerにインストール対象を指定することで、依存関係の解決などを行なってくれる。

awonosukeawonosuke

composerのインストール

最新のcomposerを利用したい場合、PHPが7.2.5以上が必要。(composerの2.2系ではPHP5系にも対応しているらしい)

https://getcomposer.org/doc/00-intro.md#installation-linux-unix-macos

下記リンクに従ってcomposerの実行ファイル(.phar)をダウンロードする。
https://getcomposer.org/download/

pharファイルとは

ダウンロードすると作業ディレクトリにcomposer.pharが用意されるだけなので、呼び出しやすいようにする。
方法は2つあり、今回はパスが通ってる場所に移動させる。(グローバルに利用したいか、特定ディレクトリ下で利用したいかも考えておく、自分はグローバルに利用する)

  • composer.pharをパスが通ってる場所に移動する
  • composer.pharがあるディレクトリにパスを通す

下記ドキュメント通りにmvすると、$ comoserで呼び出せる。
https://getcomposer.org/doc/00-intro.md#globally

awonosukeawonosuke

dockerでのcomposerのインストール

dockerのマルチステージビルドを利用することで簡単に、composerの最新バージョンを追従することができる。
→プロダクションコードでは、"正常に"動作するものをデプロイしたいので、思わぬところでコケないためにもlatestではなくバージョン指定が望ましいと思ってる。(経験浅いのでcomposerの最新を追従したいというシステム要求のシチュエーションがあんまり分からない、最新composerの機能テスト、パフォーマンス、バグ修正、セキュリティ対策とか?)

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

※マルチステージビルドの利用にはdockerのバージョンが17.05以上である必要がある

https://blog.hanhans.net/2019/01/08/docker-composer/
https://qiita.com/yatsbashy/items/02bbbebbfe7e5a5976bc

awonosukeawonosuke

composerがもたらす恩恵

先ほど、composerは依存関係を管理しながら外部ライブラリのインストールを楽にしてくれるものだと書いたが、それだけではなく以下の恩恵も受けることができる。

Composerはライブラリを含めた依存性をまとめてインストールしてくれるだけではなく、PHPが本来持つクラスのオートローディングの仕組みを使って、自前のコードとライブラリのコードを自然に統合してくれることにあります。

https://qiita.com/tadsan/items/86099d44d12f1103b0a0#composerが可能にすること

https://hara-chan.com/it/programming/php-autoload-composer/

https://www.php.net/manual/ja/language.oop5.autoload.php

https://getcomposer.org/doc/01-basic-usage.md#autoloading

awonosukeawonosuke

composer昔話

昔、というかcomposer 1系ではインストールに時間がかかるので、速くするプラグイン、ミラーサイトとかが用意されていた。

https://engineering.mercari.com/blog/entry/2016-02-01-164829/

現行の2系ではパフォーマンスについてcurlの並行処理をデフォルトで利用するようになっており、それらはあまり心配なくなったらしい?

https://qiita.com/ucan-lab/items/289009ffe5bb417c808e

awonosukeawonosuke

用語

<パッケージ>
composerで管理をする対象のこと。リポジトリに公開されていなくても、comopserの管理対象はパッケージと呼ぶ。

以下のドキュメントでは以下のように書いてある。
パッケージとは何かを含むディレクトリであり、composerではPHPコードのまとまりであれば何でもパッケージになり得る、的なニュアンス

Composer is a dependency manager. It installs packages locally. A package is essentially a directory containing something. In this case it is PHP code, but in theory it could be anything. And it contains a package description which has a name and a version. The name and the version are used to identify the package.

In fact, internally Composer sees every version as a separate package. While this distinction does not matter when you are using Composer, it's quite important when you want to change it.

https://getcomposer.org/doc/05-repositories.md#package

<リポジトリ>
パッケージの源流となるもの。パッケージをまとめ、そこからcomposerは指定されたパッケージを探しインストールを行う。デフォルトで登録されているリポジトリはPackagistだけだが、自分で追加可能。

A repository is a package source. It's a list of packages/versions. Composer will look in all your repositories to find the packages your project requires.

By default, only the Packagist.org repository is registered in Composer. You can add more repositories to your project by declaring them in composer.json.

https://getcomposer.org/doc/05-repositories.md#repository

<バージョン>
パッケージのバージョンを表す。通常セマンティックバージョニングが利用される

<Packagist>
デフォルトで有効になっているリポジトリ

Packagist is the main Composer repository. It aggregates public PHP packages installable with Composer.

https://packagist.org/

<PEAR>
Composerが主流になる前に利用されていた依存関係管理ツール

awonosukeawonosuke

http://blog.tojiru.net/article/440339824.html
https://nextat.co.jp/staff/archives/232
https://kin29.info/composer-の-prefer-distってよく使うけど何してる?/

  • --prefer-distオプションはzip形式でダウンロードするためのもの、一般的にこのオプションつけた方が高速
    • git cloneじゃなくて、wgetでzipファイルをダウンロードしてるらしい

composerベストプラクティス

  • config.platform項目の利用
    • 依存関係の情報を固定化することができる
    • composer updateしてplatformに設定したバージョンのライブラリがインストールされる
  • composer.lockをgit管理対象にする
  • composerダウンロード時のログを綺麗に保つ
    • --no-progressオプションの利用
  • オートローダーの高速化
    • composerの各コマンドで--optimize-autoloaderオプションの利用
  • なんでこのパッケージ入ってるんだっけ?
    • composer why package、なぜそのパッケージがインストールされてるか
    • composer why-not package、なぜそのパッケージがインストールされてないか
  • 新しいバージョンを調べる
    • composer outdated
  • パッケージを高速にインストールする
    • --prefer-distオプションを利用する
    • アクセストークンとか認証情報の設定ができてないとうまく動かないケースあり
    • zip形式でダウンロードする
    • パッケージごとに指定可能
      • config.preferd-installで設定することもできる
  • type=pathリポジトリ
    • 巨大化したリポジトリを仮想的に分離する
awonosukeawonosuke

require、includeの違い。
https://www.php.net/manual/ja/function.require.php
https://www.php.net/manual/ja/function.include.php

require、require_onceの違い。
https://www.php.net/manual/ja/function.require-once.php

https://qiita.com/awesam86/items/3fa28e23c95ca74caddc
https://itsakura.com/php-other-file
https://uxmilk.jp/15560

まとめ

  • 外部ファイルをあるスクリプト内で利用したい場合require、includeを使う
  • アプリケーション、ソフトウェアのコアな部分の読み込みはrequire、それ以外はinclude
  • 外部ファイルの内容を使用時に再読み込みが必要ない場合はonceで読み込む
awonosukeawonosuke

composerはrootユーザーで実行するのは非推奨。

Certain Composer commands, including exec, install, and update allow third party code to execute on your system. This is from its "plugins" and "scripts" features. Plugins and scripts have full access to the user account which runs Composer. For this reason, it is strongly advised to avoid running Composer as super-user/root. All commands also dispatch events which can be caught by plugins so unless explicitly disabled installed plugins will be loaded/executed by every Composer command.

https://getcomposer.org/doc/faqs/how-to-install-untrusted-packages-safely.md
https://www.itblog.jp/?p=9889