CodeIgniter4のプロジェクトファイルを簡単にアップグレードする

この記事は CodeIgniter Advent Calendar 2022 - Qiita の6日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

プロジェクトファイルの更新とは?

CodeIgniter4(フレームワーク)のアップグレードは、composer update でコマンド一発でできますが、systemフォルダ以外のプロジェクトファイルは必要に応じて手動で更新する必要があります。

プロジェクトファイルとは、要するに、vendor フォルダ以外のプロジェクト内のファイルのことです。

基本的には、マイナーバージョンアップではプロジェクトファイルを更新しなくても動作するはずですが、例外もあります。

例えば、4.2.0 では、index.phpspark が変更されたため、これらをアップグレードしないとシステムが全く動作しなくなりました。

更新が必要な場合は、ユーザガイドに記載されています。

とはいえ、手動で更新するのは面倒です。そこで、プロジェクトファイルの更新を自動化するツールを使います。

Tatter\Patches のインストール

まず、自動化ツールである Tatter\Patches をインストールします。

動作には、Git と shell が必要です。

$ composer require --dev tatter/patches

Tatter\Patches は vendoring(vendor/ 以下をGit管理すること)していると正常に動作しません。

4.1.9 を最新バージョンにアップグレードする

実際に、4.1.9 を最新の 4.2.10 にアップグレードしてみます。

まず、コミットされていない変更点があれば、コミットしてGitのワーキングツリーをクリーンな状態にします。

$ git add -u
$ git commit

patch の実行

それでは、patchコマンドを実行します。

$ vendor/bin/patch
git version 2.38.1
Composer version 2.4.4 2022-10-27 14:39:29
************************************
*          CONFIGURATION           *
************************************

Scripts Directory: /.../ci-app/vendor/tatter/patches/src
Project Directory: /.../ci-app
Target Version:    
Current Version:   
Source Package:    codeigniter4/framework
Base Branch:       main
Selected Items:    app/ public/ env spark

************************************
*             STAGING              *
************************************

Switched to a new branch 'tatter/scratch'
Loading composer repositories with package information
https://repo.packagist.org could not be fully loaded (curl error 6 while downloading https://repo.packagist.org/packages.json: Could not resolve host: repo.packagist.org), package information was loaded from the local cache and may be out of date
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Upgrading codeigniter4/framework (v4.1.9 => v4.2.10)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Upgrading codeigniter4/framework (v4.1.9 => v4.2.10): Extracting archive
Generating autoload files
28 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
infection/extension-installer: No extensions found
No security vulnerability advisories found
[tatter/scratch f7d71df] Patch framework
 28 files changed, 1136 insertions(+), 1001 deletions(-)
Switched to a new branch 'tatter/patches'
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 0 installs, 1 update, 0 removals
  - Downgrading codeigniter4/framework (v4.2.10 => v4.1.9): Extracting archive
Generating autoload files
28 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
************************************
*              MERGING             *
************************************

Auto-merging app/Config/Paths.php
[tatter/patches 3eb6855] Patch framework
 Date: Mon Dec 5 09:53:57 2022 +0900
 28 files changed, 1136 insertions(+), 1001 deletions(-)
************************************
*              SUCCESS             *
************************************

Patch successful! Updated files are available on branch tatter/patches.
Deleted branch tatter/scratch (was f7d71df).

成功しました。

現在、tatter/patchesブランチにいる状態です。

コンフリクトが発生した場合

なお、コンフリクトが発生しマージが失敗する可能性もあります。

その場合は、手動でコンフリクトを解消し、git add して、 git cherry-pick --continue してください。

codeigniter4/framework の更新

codeigniter4/framework はまだ 4.1.9 のままなので更新します。

$ composer update
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Upgrading codeigniter4/framework (v4.1.9 => v4.2.10)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Upgrading codeigniter4/framework (v4.1.9 => v4.2.10): Extracting archive
Generating autoload files
28 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
infection/extension-installer: No extensions found
No security vulnerability advisories found

これで、最新の 4.2.10 にアップグレードされました。動作可能なはずです。

sparkコマンドを実行してバージョンを確認してみましょう。

$ php spark

CodeIgniter v4.2.10 Command Line Tool - Server Time: 2022-12-06 19:00:29 UTC-06:00
...

動きました。

更新内容の確認

変更内容に問題ないか確認します。 テストがあれば実行してください。

Gitで差分を確認してください。

$ git diff main...HEAD
$ git diff main...HEAD --name-only app/Config/
app/Config/App.php
app/Config/Constants.php
app/Config/ContentSecurityPolicy.php
app/Config/Database.php
app/Config/Events.php
app/Config/Feature.php
app/Config/Filters.php
app/Config/Format.php
app/Config/Logger.php
app/Config/Mimes.php
app/Config/Paths.php
app/Config/Publisher.php
app/Config/Routes.php
app/Config/Security.php
app/Config/Validation.php
app/Config/View.php

設定ファイルが更新されていることがわかります。

なお、バージョンアップに伴い設定ファイルのデフォルト値が変更されている場合があります。そのような変更も自動的に適用されています。

フレームワークの動作が変わり、場合によりアプリが期待したように動作しなくなる可能性があります。設定値の差分を確認し、必要であれば元の値に戻すようにしてください。

public/index.php の差分を確認してみましょう。

$ git diff main...HEAD public/index.php
diff --git a/public/index.php b/public/index.php
index 7737302..96e7f45 100644
--- a/public/index.php
+++ b/public/index.php
@@ -1,8 +1,23 @@
 <?php

+// Check PHP version.
+$minPhpVersion = '7.4'; // If you update this, don't forget to update `spark`.
+if (version_compare(PHP_VERSION, $minPhpVersion, '<')) {
+    $message = sprintf(
+        'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s',
+        $minPhpVersion,
+        PHP_VERSION
+    );
+
+    exit($message);
+}
+
 // Path to the front controller (this file)
 define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR);

+// Ensure the current directory is pointing to the front controller's directory
+chdir(FCPATH);
+
 /*
  *---------------------------------------------------------------
  * BOOTSTRAP THE APPLICATION
@@ -12,20 +27,34 @@ define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR);
  * and fires up an environment-specific bootstrapping.
  */

-// Ensure the current directory is pointing to the front controller's directory
-chdir(__DIR__);
-
 // Load our paths config file
 // This is the line that might need to be changed, depending on your folder structure.
-$pathsConfig = FCPATH . '../app/Config/Paths.php';
-// ^^^ Change this if you move your application folder
-require realpath($pathsConfig) ?: $pathsConfig;
+require FCPATH . '../app/Config/Paths.php';
+// ^^^ Change this line if you move your application folder

 $paths = new Config\Paths();

 // Location of the framework bootstrap file.
-$bootstrap = rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php';
-$app       = require realpath($bootstrap) ?: $bootstrap;
+require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php';
+
+// Load environment settings from .env files into $_SERVER and $_ENV
+require_once SYSTEMPATH . 'Config/DotEnv.php';
+(new CodeIgniter\Config\DotEnv(ROOTPATH))->load();
+
+/*
+ * ---------------------------------------------------------------
+ * GRAB OUR CODEIGNITER INSTANCE
+ * ---------------------------------------------------------------
+ *
+ * The CodeIgniter class contains the core functionality to make
+ * the application run, and does all of the dirty work to get
+ * the pieces all working together.
+ */
+
+$app = Config\Services::codeigniter();
+$app->initialize();
+$context = is_cli() ? 'php-cli' : 'web';
+$app->setContext($context);

 /*
  *---------------------------------------------------------------
@@ -34,4 +63,5 @@ $app       = require realpath($bootstrap) ?: $bootstrap;
  * Now that everything is setup, it's time to actually fire
  * up the engines and make this app do its thang.
  */
+
 $app->run();

更新されていることがわかります。

Tatter\Patchesは、存在していなかったディレクトリにファイルが追加されると、プロジェクトのルートにそのファイルを追加します。

古いバージョンからアップグレードすると、Language/en/Validation.php が追加されるので、正しい位置(app/Language/en/)に移動してください。

変更内容のマージ

問題がなけば、メインのブランチにマージします。

$ git checkout main
$ git merge tatter/patches

これで完了です。

tatter/patchesブランチは削除してください。

この記事は CodeIgniter Advent Calendar 2022 - Qiita の6日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

参考

Date: 2022/12/06

Tags: codeigniter, codeigniter4