PHPでComposerのrequire-devを活用して開発専用パッケージを効率的に管理する方法

Composerのrequire-devは、PHPプロジェクトの開発環境において専用のパッケージを効率的に管理するための機能です。通常のrequireとは異なり、require-devで指定されたパッケージは、本番環境には含まれず、開発、テスト、デバッグといった開発プロセスでのみ使用されます。これにより、本番環境をシンプルで軽量に保ちながら、開発環境に必要なツールやライブラリを導入することが可能です。

本記事では、require-devの基本概念から設定方法、具体的な使用例までを詳しく解説し、開発プロセスを効率化する方法を紹介します。これを通じて、PHPプロジェクトの開発をよりスムーズに進めるための知識を習得しましょう。

目次

Composerとrequire-devの基本


Composerは、PHPのパッケージ管理ツールであり、プロジェクトで必要なライブラリや依存関係を簡単に管理することができます。Composerを使用することで、外部ライブラリのインストールやバージョン管理が自動化され、手作業による煩雑な管理が不要になります。

require-devは、Composerの機能の一つで、開発環境にのみ必要なパッケージを指定するためのオプションです。通常のrequireでは、本番環境でも利用されるパッケージがインストールされますが、require-devで指定されたパッケージは、開発環境でのみ使用され、本番環境へのデプロイ時にはインストールされません。これにより、開発用ツール(例:PHPUnitなどのテストフレームワーク、コード整形ツール)をプロジェクトに導入しながら、本番環境をシンプルに保つことができます。

require-devを使用するメリット


require-devを使用することで、開発環境専用のパッケージ管理が効率化され、さまざまなメリットが得られます。以下では、その具体的な利点を解説します。

1. 本番環境の軽量化


開発環境でのみ必要なパッケージをrequire-devに分類することで、本番環境には不要なライブラリを含めずに済みます。これにより、デプロイサイズが小さくなり、サーバーのリソース消費も抑えられるため、本番環境のパフォーマンス向上に寄与します。

2. 開発プロセスの効率化


テストフレームワークやデバッグツール、コード解析ツールなどをrequire-devで管理することで、開発作業が効率的に進められます。例えば、PHPUnitを用いた自動テストや、PHPCSを使ったコーディングスタイルチェックを容易に設定でき、開発の品質を高めることができます。

3. 環境ごとの依存関係の明確化


require-devを使用すると、開発環境と本番環境で必要とするパッケージの違いが明確になります。これにより、依存関係の混乱を防ぎ、プロジェクトの設定や保守が容易になります。例えば、開発環境にのみ存在するライブラリが本番環境でエラーを引き起こすリスクを減らせます。

4. CI/CDパイプラインでの柔軟な管理


継続的インテグレーション(CI)や継続的デリバリー(CD)のプロセスでは、require-devを使ってテストやコード分析を実行し、本番環境に不要なパッケージをインストールしないようにできます。これにより、CI/CDのパフォーマンスを向上させ、セキュリティリスクも軽減できます。

これらのメリットにより、require-devを活用することは、開発と本番環境の最適化において非常に重要なポイントとなります。

Composerのインストールと初期設定


Composerを使用するには、まずローカル環境にComposerをインストールする必要があります。以下では、Composerのインストール方法と、プロジェクトでの初期設定について説明します。

Composerのインストール手順


Composerをインストールする手順は以下の通りです:

  1. 公式サイトからインストーラーをダウンロード
    Composer公式サイトにアクセスし、最新のインストーラーをダウンロードします。
  2. インストールの実行
    ダウンロードしたインストーラーを実行し、インストール手順に従います。通常、コマンドラインから以下のコマンドでグローバルインストールできます:
   php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
   php composer-setup.php
   php -r "unlink('composer-setup.php');"
  1. システムのパスに追加
    Composerをシステムのパスに追加することで、どのディレクトリからでもcomposerコマンドを実行できるようになります。LinuxやmacOSではmv composer.phar /usr/local/bin/composerコマンドで設定できます。

プロジェクトの初期設定


Composerをプロジェクトで使用するために、次の初期設定を行います。

  1. composer.jsonの作成
    プロジェクトのルートディレクトリで以下のコマンドを実行し、composer.jsonファイルを生成します:
   composer init


コマンドを実行すると、プロジェクト名や説明、パッケージの依存関係などを設定する対話形式のプロンプトが表示されます。

  1. composer.jsonの設定項目
    composer.jsonには、プロジェクトに必要なパッケージやメタデータが記述されます。requirerequire-devセクションを追加して、必要なライブラリを指定します。
  2. 依存パッケージのインストール
    composer.jsonに指定したパッケージをインストールするには、以下のコマンドを実行します:
   composer install


これにより、vendorディレクトリにライブラリがインストールされ、依存関係が管理されます。

Composerのインストールと初期設定が完了すると、プロジェクトに必要なパッケージの管理が簡単に行えるようになります。

require-devでパッケージをインストールする方法


require-devを使用すると、開発環境専用のパッケージを簡単に管理できます。以下では、require-devオプションを使った開発環境用パッケージのインストール手順について詳しく説明します。

require-devでパッケージをインストールする

  1. インストールコマンドの基本構文
    開発専用のパッケージをインストールするには、composer requireコマンドに--devオプションを付けて実行します。
    例:PHPUnitをインストールする場合
   composer require --dev phpunit/phpunit


このコマンドを実行すると、phpunit/phpunitが開発専用パッケージとしてcomposer.jsonrequire-devセクションに追加されます。

  1. バージョン指定の方法
    インストールするパッケージのバージョンを明示的に指定することもできます。たとえば、特定のバージョンのPHPUnitをインストールする場合は、以下のように指定します:
   composer require --dev phpunit/phpunit:^9.5


これにより、バージョン9.5以上、10未満のPHPUnitがインストールされます。

インストールされたパッケージの確認

  1. composer.jsonファイルの確認
    composer.jsonファイルのrequire-devセクションに、インストールしたパッケージが記載されていることを確認できます。
   {
       "require-dev": {
           "phpunit/phpunit": "^9.5"
       }
   }
  1. composer.lockファイルの役割
    composer.lockには、インストールされたパッケージの具体的なバージョン情報が記録されます。これにより、他の開発者と同じバージョンのパッケージをインストールすることが保証されます。

パッケージのインストールディレクトリ


インストールされたパッケージは、プロジェクトのvendorディレクトリ内に配置されます。このディレクトリには、開発環境専用のパッケージも含まれますが、本番環境にデプロイする際には、--no-devオプションを使用して開発専用パッケージを除外することが可能です。

インストール後の確認方法


開発専用パッケージが正しくインストールされたかどうかを確認するには、以下のコマンドでインストール済みパッケージの一覧を表示します:

composer show --dev

このようにして、require-devオプションを使った開発専用パッケージの管理が容易になります。

composer.jsonファイルの役割と設定


composer.jsonは、Composerを使用するプロジェクトで依存関係を管理するための設定ファイルです。ここには、プロジェクトで必要なパッケージやメタデータ、スクリプト、オートロード設定などが記述されます。require-devセクションもこのファイルに記載され、開発環境専用のパッケージを管理します。

composer.jsonの基本構造


composer.jsonファイルの基本的な構造は以下のようになっています:

{
    "name": "yourname/yourproject",
    "description": "プロジェクトの説明",
    "type": "project",
    "require": {
        "monolog/monolog": "^2.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^9.5"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "test": "phpunit"
    }
}


上記の例では、requireに本番環境用のパッケージ、require-devに開発専用のパッケージを記述しています。

require-devセクションの設定方法


require-devセクションには、開発環境専用のパッケージを指定します。これにより、テストツールやデバッグ用ライブラリを開発環境でのみインストールすることができます。

  • パッケージの追加
    composer require --devコマンドでパッケージを追加すると、自動的にrequire-devセクションに追記されます。手動で追記する場合は、以下のように記述します:
  "require-dev": {
      "phpunit/phpunit": "^9.5",
      "squizlabs/php_codesniffer": "^3.6"
  }

autoloadとautoload-devの設定


autoloadは、Composerのオートローディング機能を利用して、指定したディレクトリ内のクラスを自動的にロードするための設定です。一方、autoload-devは、開発環境専用のオートロード設定を行うために使用されます。

  • autoloadの設定例
    本番環境のクラスをsrc/ディレクトリに配置する場合:
  "autoload": {
      "psr-4": {
          "App\\": "src/"
      }
  }
  • autoload-devの設定例
    テスト用のクラスをtests/ディレクトリに配置する場合:
  "autoload-dev": {
      "psr-4": {
          "Tests\\": "tests/"
      }
  }

scriptsセクションの活用


scriptsセクションを使用すると、Composerのコマンド実行時にカスタムスクリプトを設定することができます。たとえば、テストスクリプトを定義することで、composer testコマンドでPHPUnitを実行できます。

"scripts": {
    "test": "phpunit"
}

これらの設定により、composer.jsonファイルを活用してプロジェクトの依存関係やオートロード設定を管理し、開発環境の効率を高めることが可能です。

パッケージのアップデートと削除の方法


開発専用のパッケージを管理する際には、定期的なアップデートや不要になったパッケージの削除が必要です。Composerは、これらの操作を簡単に行うためのコマンドを提供しています。以下では、開発専用パッケージのアップデートと削除の手順を詳しく説明します。

パッケージのアップデート方法


Composerでは、composer updateコマンドを使ってパッケージをアップデートすることができます。

  1. 特定のパッケージをアップデートする場合
    開発専用パッケージをアップデートするには、--devオプションを使用して特定のパッケージを指定します。例として、PHPUnitをアップデートする場合は以下のコマンドを実行します:
   composer update phpunit/phpunit --dev


このコマンドにより、require-devセクションに含まれるPHPUnitのバージョンが最新に更新されます。

  1. すべての開発専用パッケージをアップデートする場合
    すべての開発専用パッケージを一括でアップデートするには、以下のコマンドを実行します:
   composer update --dev


これにより、require-devセクションのすべてのパッケージが更新されます。

composer.lockファイルの更新


composer updateコマンドを実行すると、composer.lockファイルも自動的に更新されます。このファイルには、インストールされたパッケージの正確なバージョンが記録されており、他の開発者と同じ環境を再現するために重要です。

パッケージの削除方法


不要になった開発専用パッケージは、composer removeコマンドで削除できます。

  1. 特定のパッケージを削除する場合
    例として、PHPUnitを削除する場合は以下のコマンドを実行します:
   composer remove phpunit/phpunit --dev


このコマンドにより、composer.jsonrequire-devセクションからパッケージが削除され、vendorディレクトリからも関連ファイルが削除されます。

  1. 削除後のファイル整理
    パッケージを削除した後、composer installを実行すると、composer.lockおよびvendorディレクトリが整理され、不要な依存関係が自動的にクリアされます。

バージョン管理とロールバックの注意点


パッケージのアップデートや削除を行う前に、バージョン管理システム(例:Git)でプロジェクトの状態を保存しておくことをお勧めします。これにより、万が一のトラブルが発生した場合でも、簡単に以前の状態に戻すことができます。

Composerを使ったパッケージのアップデートと削除は非常にシンプルですが、プロジェクトの安定性を保つためには慎重な管理が求められます。

autoload-devの設定と活用法


autoload-devは、開発環境専用のクラスやテスト用のコードを自動的にロードするための設定です。通常のautoload設定とは異なり、autoload-devで指定された設定は、本番環境には適用されず、開発やテスト時にのみ利用されます。以下では、autoload-devの設定方法と、その活用法について説明します。

autoload-devの設定方法


composer.jsonファイルの中で、autoload-devセクションを使って開発専用のクラスや名前空間のマッピングを設定します。一般的には、テストコードや開発用スクリプトが配置されるディレクトリを指定します。

  • 基本的な設定例
    以下の例では、tests/ディレクトリにあるテストクラスをTestsという名前空間でオートロードする設定です:
  "autoload-dev": {
      "psr-4": {
          "Tests\\": "tests/"
      }
  }


この設定により、tests/ディレクトリに配置されたクラスがTests名前空間で自動的に読み込まれるようになります。

  • 複数のディレクトリの設定
    複数のディレクトリをautoload-devで設定することも可能です。例えば、テスト用の補助的なスクリプトが別のディレクトリにある場合:
  "autoload-dev": {
      "psr-4": {
          "Tests\\": "tests/",
          "Helpers\\": "helpers/"
      }
  }


このように設定することで、複数の開発専用ディレクトリをオートロードの対象とすることができます。

autoload-devの再生成


新たにautoload-devの設定を追加したり、既存の設定を変更した場合は、以下のコマンドを実行してオートロードファイルを再生成します:

composer dump-autoload


これにより、Composerはvendor/autoload.phpファイルを更新し、新しいクラスマッピングを反映させます。

autoload-devの活用法


autoload-devを活用することで、開発環境での作業が効率化されます。以下にその具体的な使用例を示します。

  • ユニットテストの実行
    autoload-devを設定することで、テストフレームワーク(例:PHPUnit)がテストクラスを自動的に読み込み、スムーズにテストを実行できます。Tests名前空間を利用することで、テストコードが本番コードと衝突することなく管理できます。
  • 開発用ツールの導入
    require-devで開発ツール(例:PHPCS、PHPStan)をインストールし、それに関連する補助的なスクリプトや設定ファイルもautoload-devに登録することで、開発プロセス全体を自動化できます。
  • CI/CDパイプラインでの利用
    継続的インテグレーション(CI)環境で、composer install --no-devオプションを使って本番環境向けの依存関係をインストールする際には、autoload-devの設定は無視されます。これにより、本番環境には開発専用のコードが含まれず、セキュリティとパフォーマンスの向上につながります。

autoload-devを効果的に活用することで、開発環境専用の設定やツールを適切に管理し、開発プロジェクトを効率化することができます。

CI環境でのrequire-devの管理方法


継続的インテグレーション(CI)環境での開発専用パッケージの管理は、プロジェクトの品質を高めるために重要です。require-devを活用することで、開発環境専用のパッケージをCIパイプラインで効率的に管理し、テストやコード解析を自動化することができます。以下では、CI環境でのrequire-devの活用方法と注意点を解説します。

require-devパッケージのインストール


CI環境でテストやコード解析を実行するためには、開発専用パッケージをインストールする必要があります。通常、CIパイプラインで以下のコマンドを使用してrequire-devパッケージを含めたすべての依存関係をインストールします:

composer install


このコマンドを実行すると、requireおよびrequire-devに指定されたすべてのパッケージがインストールされ、開発専用ツールを使用したテストやコード解析が可能になります。

本番環境へのデプロイ時の注意点


本番環境へのデプロイを行う際には、開発専用パッケージを含めないようにすることが重要です。これを実現するには、以下のオプションを使ってcomposer installを実行します:

composer install --no-dev --optimize-autoloader
  • --no-devオプションは、require-devセクションに指定されたパッケージをインストールしないようにします。
  • --optimize-autoloaderオプションは、オートロードの最適化を行い、本番環境のパフォーマンスを向上させます。

CI/CDパイプラインでのスクリプト設定


CI/CD環境では、composer.jsonscriptsセクションを活用することで、自動的にテストを実行したり、コード解析ツールを使って静的解析を行うことができます。以下は、composer.jsonでの設定例です:

"scripts": {
    "test": "phpunit",
    "analyse": "phpstan analyse src"
}


これにより、CIパイプラインでcomposer run testcomposer run analyseを実行するだけで、PHPUnitによるテストやPHPStanによる静的解析が行われます。

複数のCIジョブでのrequire-devの管理


複数のジョブでrequire-devを管理する場合、以下のようなシナリオが考えられます。

  1. テストジョブ
    開発専用のパッケージをインストールして、ユニットテストや統合テストを実行します。
   composer install
   vendor/bin/phpunit
  1. コード品質チェックジョブ
    コードスタイルチェックや静的解析ツールを用いたコード品質の検証も、require-devのパッケージを使用して行います。
   composer install
   vendor/bin/phpcs --standard=PSR12 src/
   vendor/bin/phpstan analyse src/
  1. デプロイジョブ
    デプロイ時には、本番環境向けの軽量なインストールを行います。
   composer install --no-dev --optimize-autoloader

CI環境でのキャッシュ管理


CIパイプラインでは、依存関係のインストール時間を短縮するために、vendorディレクトリやcomposer.lockファイルをキャッシュすることが推奨されます。多くのCIサービス(例:GitHub Actions、GitLab CI、CircleCI)では、キャッシュ機能を使用してパッケージの再インストールを高速化できます。

以下は、GitHub Actionsでのキャッシュ設定の例です:

- name: Cache Composer dependencies
  uses: actions/cache@v3
  with:
    path: vendor
    key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
    restore-keys: |
      ${{ runner.os }}-composer-

このように、require-devをCI環境で適切に管理することで、開発プロセスを効率化し、プロジェクトの品質向上につなげることができます。

実際のプロジェクトでの使用例


開発プロジェクトでrequire-devを活用することで、開発環境専用のツールやライブラリを効率的に管理できます。ここでは、具体的なプロジェクトでの使用例を紹介し、どのようにrequire-devを設定し、活用するかを解説します。

ユニットテストの導入と実行


PHPプロジェクトでユニットテストを実施する際には、require-devを使用してテストフレームワーク(例:PHPUnit)をインストールします。

  1. PHPUnitのインストール
    開発環境でのみPHPUnitを使用するため、以下のコマンドでインストールします:
   composer require --dev phpunit/phpunit:^9.5


これにより、composer.jsonrequire-devセクションにPHPUnitが追加され、vendor/bin/phpunitでテストを実行できるようになります。

  1. テストコードの作成
    プロジェクトにtests/ディレクトリを作成し、その中にテストコードを配置します。例えば、tests/SampleTest.phpに以下のようなテストを作成します:
   <?php
   use PHPUnit\Framework\TestCase;

   class SampleTest extends TestCase
   {
       public function testAddition()
       {
           $this->assertEquals(2, 1 + 1);
       }
   }

このコードは、シンプルな加算テストを行う例です。

  1. テストの実行
    vendor/bin/phpunit testsを実行することで、テストを自動的に実行できます。このコマンドは、autoload-devで設定したテストクラスを読み込んで実行します。

コード品質ツールの利用


プロジェクトのコード品質を保つために、静的解析ツール(例:PHPStan)やコードスタイルチェッカー(例:PHPCS)を導入するのもrequire-devの一般的な活用方法です。

  1. PHPStanのインストール
    静的解析ツールPHPStanをインストールします:
   composer require --dev phpstan/phpstan
  1. コード解析の設定
    PHPStanの設定ファイル(phpstan.neon)をプロジェクトのルートに作成し、解析の設定を行います:
   parameters:
       level: max
       paths:
           - src
  1. 静的解析の実行
    vendor/bin/phpstan analyseコマンドでコード解析を実行し、コードの問題点を検出します。

コードフォーマッタの導入と設定


コーディングスタイルを統一するために、PHPCSやPHP CS Fixerなどのツールをrequire-devで導入します。

  1. PHPCSのインストール
    コードスタイルチェックツールPHPCSをインストールします:
   composer require --dev squizlabs/php_codesniffer
  1. コーディング標準の設定
    プロジェクトのルートディレクトリでPHPCSのコーディング標準を指定します。例えば、PSR-12標準を使用する場合:
   vendor/bin/phpcs --config-set default_standard PSR12
  1. コードスタイルチェックの実行
    vendor/bin/phpcs src/を実行すると、指定したディレクトリ内のPHPファイルがPSR-12に準拠しているかをチェックします。

プロジェクトでの開発ツールの一括管理


複数の開発ツールを使用する場合、composer.jsonscriptsセクションに一括でコマンドを定義しておくと便利です。以下は、テストや静的解析、コードスタイルチェックを一括で実行する設定例です:

"scripts": {
    "test": "phpunit",
    "analyse": "phpstan analyse",
    "check-style": "phpcs"
}

この設定により、composer run testcomposer run analysecomposer run check-styleといったコマンドを使って、各種チェックを容易に実行できます。

Docker環境でのrequire-devの活用


開発環境をDockerコンテナで統一する場合でも、require-devを活用して開発専用のツールをインストールすることができます。Dockerfileで以下のようにComposerコマンドを指定し、開発環境と本番環境を切り分けます。

  • 開発環境用のDockerfile設定
  FROM php:8.0-cli

  COPY . /app
  WORKDIR /app

  RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
  RUN composer install

  CMD ["phpunit"]
  • 本番環境用のDockerfile設定
  FROM php:8.0-cli

  COPY . /app
  WORKDIR /app

  RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
  RUN composer install --no-dev --optimize-autoloader

  CMD ["php", "index.php"]

このように、require-devを活用することで、実際のプロジェクトでの開発環境が整備され、開発がスムーズに進むようになります。

よくあるトラブルと対策


require-devを使用する際には、さまざまなトラブルが発生する可能性があります。しかし、これらの問題を理解し、適切に対処することで、開発プロセスをよりスムーズに進めることができます。以下では、require-dev関連のよくあるトラブルとその解決方法を紹介します。

1. パッケージがインストールされない


require-devで指定したパッケージがインストールされない場合、以下の原因が考えられます:

  • インストール時に--no-devオプションが使用されている
    composer installコマンドを実行する際に、--no-devオプションを付けると、require-devセクションに指定されたパッケージがインストールされません。開発環境で使用する場合は、--no-devを省略して以下のように実行します:
  composer install
  • composer.jsonが正しく設定されていない
    composer.jsonファイルに誤った記述があると、パッケージが正しくインストールされません。構文エラーや依存関係の記述ミスがないか確認しましょう。

2. パッケージのバージョン競合


プロジェクトの依存関係において、異なるパッケージが同じライブラリの異なるバージョンを要求することがあります。この場合、Composerはバージョンの競合を解決できず、エラーが発生します。

  • 競合を解消する方法
    composer.jsonで依存関係のバージョンを調整するか、特定のバージョン範囲を許容するように設定します。
    例:
  "require-dev": {
      "phpunit/phpunit": "^9.5",
      "other/package": "^1.2"
  }


この設定で、phpunit/phpunitother/packageが互換性のあるバージョンで共存するように調整します。

3. パッケージがautoloadされない


インストールしたパッケージがautoload-dev設定に反映されていない場合、クラスが正しく読み込まれず、エラーが発生することがあります。

  • autoloadファイルの再生成
    composer dump-autoloadコマンドを実行して、オートロードファイルを再生成します。これにより、autoload-dev設定が最新の状態に更新されます。

4. composer.lockファイルの問題


composer.lockファイルが他の開発者と異なると、パッケージのバージョンの不一致が発生する可能性があります。

  • composer.lockの同期
    チーム開発では、composer.lockファイルをバージョン管理システム(例:Git)で共有することで、すべての開発者が同じ依存関係を使用できます。composer.lockファイルが更新された場合は、composer installを実行して最新の依存関係に同期します。

5. CI環境でのトラブル


CI環境では、require-devパッケージの扱いに関連する問題が発生することがあります。

  • 本番環境用のインストール時にエラーが発生する
    CIで本番環境向けにcomposer install --no-devを実行する際にエラーが出る場合は、composer.jsonの依存関係を再確認し、本番環境に不要なパッケージが含まれていないかチェックします。
  • 依存関係のキャッシュによる問題
    依存関係のキャッシュを使っている場合、キャッシュが古くなり問題を引き起こすことがあります。CI環境でキャッシュをクリアし、最新の依存関係を再インストールすることで解決できます。

6. 互換性の問題によるエラー


PHPのバージョンや他のライブラリのバージョンによって、パッケージが動作しないことがあります。

  • PHPバージョンを指定する
    composer.jsonで互換性のあるPHPのバージョンを指定することで、環境ごとに適切な依存関係がインストールされるようにします:
  "config": {
      "platform": {
          "php": "8.0.0"
      }
  }

これらの対策を講じることで、require-devに関連するトラブルを効率的に解決し、プロジェクトの開発が円滑に進むようにできます。

まとめ


本記事では、require-devを活用したPHPプロジェクトにおける開発専用パッケージの管理方法について解説しました。require-devを使用することで、本番環境を軽量化しつつ、開発環境で必要なツールやライブラリを効率的に管理できます。また、ユニットテストやコード解析、CI環境での活用方法、よくあるトラブルへの対策も紹介しました。

適切にrequire-devを活用することで、開発の効率と品質を向上させ、プロジェクト全体をより効果的に管理することが可能です。

コメント

コメントする

目次