インスパイヤされて掲示板を作りたくなった(番外篇2)

あっぷっぷ…

*(この記事は前回更新のあと半年もさぼったあと再開したいなと思って書いたよ)*

## 過去ログ

| スレ | 内容 |
|----|----|
| [インスパイヤされて掲示板を作りたくなった(1)](http://qiita.com/tadsan/items/cdbbb5b08591af2b110d) | PHPとComposer、あとべんりなライブラリ |
| [インスパイヤされて掲示板を作りたくなった(2)](http://qiita.com/tadsan/items/adaade6b675ac344f373) | SQLite3のスキーマ設計とTwigテンプレート |
| [インスパイヤされて掲示板を作りたくなった(3)](http://qiita.com/tadsan/items/498710c5199349e6d7a8) | ルーティングとモデルの説明 |
| [インスパイヤされて掲示板を作りたくなった(4)](http://qiita.com/tadsan/items/c9798a6eddaea153f42e) | ドキュメント生成とモデル、SQL |
| [インスパイヤされて掲示板を作りたくなった(番外篇)](http://qiita.com/tadsan/items/5717befa36572dd5d86c) | PsySHでアプリケーションと対話する |
| インスパイヤされて掲示板を作りたくなった(番外篇2) | ← イマココ |

## 半年ぶりにアプリを更新する

作りはじめて時間も経てば、依存パッケージの更新も重なっていきます。機能追加されてることもあれば、パフォーマンス改善、セキュリティフィックスなど理由はさまざまです。

依存してるパッケージの更新情報を一覧するには`composer outdated`を利用します。

```sh
% composer outdated --no-interaction --no-ansi 
filp/whoops                           2.0.0   2.1.3   php error handling for cool ...
justinrainbow/json-schema             1.6.1   3.0.1   A library to validate a json...
kdyby/events                          v2.4.0  v3.0.2  Events for Nette Framework
latte/latte                           v2.3.4  v2.4.1  Latte: the amazing template ...
nette/application                     v2.3.11 v2.4.1  Nette Application MVC Component
nette/bootstrap                       v2.3.4  v2.4.1  Nette Bootstrap
nette/caching                         v2.4.4  v2.5.1  Nette Caching Component
nette/component-model                 v2.2.4  v2.3.0  Nette Component Model
nette/di                              v2.3.9  v2.4.2  Nette Dependency Injection C...
nette/finder                          v2.3.2  v2.4.0  Nette Finder: Files Searching
nette/http                            v2.3.4  v2.4.0  Nette HTTP Component
nette/mail                            v2.3.4  v2.4.1  Nette Mail: Sending E-mails
nette/neon                            v2.3.4  v2.4.0  Nette NEON: parser & generat...
nette/php-generator                   v2.3.5  v2.4.1  Nette PHP Generator
nette/reflection                      v2.3.1  v2.4.0  Nette PHP Reflection Component
nette/robot-loader                    v2.3.1  v2.4.0  Nette RobotLoader: comfortab...
nette/safe-stream                     v2.3.1  v2.3.2  Nette SafeStream: Atomic Ope...
nette/security                        v2.3.1  v2.4.0  Nette Security: Access Contr...
nette/utils                           v2.3.7  v2.4.0  Nette Utility Classes
nikic/php-parser                      v1.3.0  v2.1.0  A PHP parser written in PHP
phpunit/php-timer                     1.0.7   1.0.8   Utility class for timing
psy/psysh                             v0.7.0  v0.7.2  An interactive shell for mod...
symfony/console                       v2.8.2  v3.1.3  Symfony Console Component
symfony/options-resolver              v2.6.13 v3.1.3  Symfony OptionsResolver Comp...
symfony/polyfill-mbstring             v1.1.0  v1.2.0  Symfony polyfill for the Mbs...
symfony/var-dumper                    v3.0.2  v3.1.3  Symfony mechanism for explor...
symfony/yaml                          v2.8.2  v3.1.3  Symfony Yaml Component
tracy/tracy                           v2.3.9  v2.4.2  Tracy: useful PHP debugger
twig/twig                             v1.24.0 v1.24.1 Twig, the flexible, fast, an...
vlucas/phpdotenv                      v2.2.0  v2.3.0  Loads environment variables ...
zonuexe/tetosql                       0.0.1   0.0.3   Simple and secure SQL templa...

Compilation finished at Sun Aug 28 02:09:48
```

おお、たまっとるたまっとる。みんながんばっとるな。

このうち、自分で`composer.json`に書いた覚えのないものについては、放っておきます。更新を無視するとまづそうなら、upstreamにPRを送ります。

さて、バージョンアップの方針を立てるには、「セマンティックバージョニング(semver)」の概念を知る必要があります。これは、「わかりやすいバージョン番号をつけようね」といふ指針のひとつです。

[セマンティック バージョニング 2.0.0 - Semantic Versioning](http://semver.org/lang/ja/)より引用します。

> バージョンナンバーは、`メジャー.マイナー.パッチ`とし、バージョンを上げるには、
>
>  1. APIの変更に互換性のない場合はメジャーバージョンを、
>  2. 後方互換性があり機能性を追加した場合はマイナーバージョンを、
>  3. 後方互換性を伴うバグ修正をした場合はパッチバージョンを上げます。
>
> プレリリースやビルドナンバーなどのラベルに関しては、`メジャー.マイナー.パッチ`の形式を拡張する形で利用することができます。

「後方互換性」とは、更新に伴って利用側の変更なしでそのまま利用できる性質のことです。メソッドの引数変更、クラス名変更などがあった場合はメジャーバージョンが上がります。

次にバージョン記法についてです。こちらの意味については[Versions - Composer](https://getcomposer.org/doc/articles/versions.md)に定義があります。

`>=1.2.3`、`~1.2.3`、`^1.2.3`などの似た意味の演算子がありますが、以下の表のような差があります。

| 演算子     | 意味  |
|-----------|------|
| `>=1.2.3` | (`1.2.3`以上すべて) |
| `~1.2.3`  | `>=1.2.3 <1.3.0` |
| `^1.2.3`  | `>=1.2.3 <2.0.0` |

ここは半年の間にちょっと悩んで、まだ結論が出てないのですがアプリケーションそのものに影響するライブラリである`require`は`~1.2.3`方式で慎重に、`require-dev`は`^1.2`方式でざっくりとアップデートしていくのがべんりかなと感じてます。

ので、この方針に従って更新してみる。

```composer.json.diff
diff --git a/composer.json b/composer.json
index 90b2b29..9e370a2 100644
--- a/composer.json
+++ b/composer.json
@@ -11,17 +11,17 @@
         }
     },
     "require": {
-        "vlucas/phpdotenv": "^2.2",
-        "twig/twig": "^1.24",
-        "twig/extensions": "^1.3",
-        "zonuexe/simple-routing": "^0.5.0",
-        "zonuexe/objectsystem": "^0.5.3",
-        "zonuexe/tetosql": "^0.0.1",
-        "apigen/apigen": "^4.1"
+        "vlucas/phpdotenv": "~2.3.0",
+        "twig/twig": "~1.24.1",
+        "twig/extensions": "~1.3.0",
+        "zonuexe/simple-routing": "~0.5.0",
+        "zonuexe/objectsystem": "~0.5.3",
+        "zonuexe/tetosql": "~0.0.3"
     },
     "require-dev": {
         "filp/whoops": "^2.0",
-        "psy/psysh": "^0.7.0"
+        "psy/psysh": "^0.7",
+        "apigen/apigen": "^4.1"
     },
     "scripts": {
         "doc": "apigen generate"
```

この変更をした状態で`composer update`コマンドを利用すると`composer.lock`も更新されます。

[`composer.lock`を含めた差分](https://github.com/zonuexe/inspire-bbs/commit/c447d2a8140c45198773997deb0840af6afb1bea)の[patch](https://github.com/zonuexe/inspire-bbs/commit/c447d2a8140c45198773997deb0840af6afb1bea.patch)

あとはこれで動けば、だいたい良さそうな感じがしますね。本当はユニットテストがあれば問題なく動作することを確認できるのですが、今回は省略します。。。

## あとがき

みなさんはとっくに掲示板を動かしてる頃だと思ふので、僕も早く追ひつきたい… 三三三ヾ(〃＞＜)ﾉﾞ