ピクシブ開発基盤チームの超PHPerことうさみ(@tadsan)です ヾ(〃><)ノ゙
この記事はピクシブ株式会社 Advent Calendar 2017の16日めです。
私はVimのウルテクで華麗にリファクタリングとかよりは平凡な環境で地味に開発していくのが得意ですが、そのなかでも開発を効率化するための手段を紹介します。
背景
ピクシブ社内にもさまざまな言語のプロジェクトがありますが、そのなかでもpixivは2007年から続く社内最大のPHPプロジェクトです。その経緯から、pixivの普段の開発環境は共用のGNU/Linuxサーバと共用のMySQLなどのデータストア上に展開されます*1。
社内ネットワークのDNS、Apache HTTP ServerのVirtualDocumentRoot
と ワイルドカード証明書 (Common Nameに*
を含んだサーバ証明書の通称)の組み合せにより、開発者個人ごとに独立したTLS通信可能なPHP動作環境を持てるため、非常に快適です。
ただし問題はコーディングと動作確認の作業です。 pixiv開発者は、大別すると以下の手段のどれかを選ぶ必要があります。
- A: 共用サーバにSSHログインし、ターミナル上でスクリーンエディタ(Vim, Emacs, micro など)でコーディングする
- B: 作業マシン上の任意のエディタ・IDEでコーディングし、rsync, Gitなどを利用してファイルを共用サーバのホームディレクトリに展開
- C: 共用サーバのホームディレクトリを仮想ファイルシステムとして作業マシンにマウント(FUSE for macOS/SSHFS, Emacs TRAMP など)してファイルを同期
どの手法にも一長一短があります。
大雑把に一言でまとめると、Aは「ツール/エディタが限定されるが同期作業は不要」、Bは「ツールの自由度は上がるがファイルの同期作業が必要」、Cは「ツールの自由度があり明示的な同期作業も不要だがファイルの読み書きが遅い」など、それぞれ一長一短の問題があります。
私の入社時はAは比較的多かった印象です。一方で私は入社時からCです。SSHFSにはネットワーク接続がタイムアウトしたときにファイルシステムがアンマウントされるなどの問題がありますが、EmacsのTRAMPではそのような問題は起こりません。
(Dockerなどで各自のローカルマシンに開発環境を構築するといった方法も想定可能ですが、現状は開発用データの量と管理方法、関連ミドルウェアの問題などから困難があります)
2016年のEmacs
PHP開発のためのEmacs 2016 (pixiv <3 Emacs)のまとめから抜萃します。
- package.elの設定方法 package.el - Emacs JP
- Emacsの各機能を利用しやすくする 君は誰とEmacsる? (補完インターフェイス紹介篇)
- PHPファイル編集モード php-mode
- HTMLテンプレート編集モード web-mode
- プロジェクトの編集設定を共有する editorconfig-emacs
- べんりなGitクライアント Magit
- リポジトリ内からファイル開くやつ magit-find-file.el
- PHPの標準関数の引数を表示するやつ sabof/php-eldoc
- PHPUnitのテスト実行するやつ phpunit.el
- Composerを操作するやつ composer.el
- 編集中のファイルを自動的にチェックするやつ Flycheck
- Emacs内から対話的にPHPを実行するやつ - psysh.el
去年の記事を書いてからの報告なのですが、phpunit.elの共同メンテナとしてコミット権をいただき、PHP Modeのメインメンテナを引き継ぎました。
2017年のEmacs開発環境
ここからは、前回の記事からアップデートされたもの、多用するようになったもの、新規に作成したものを中心に紹介します。
GitHub: emacs-php
GitHubにemacs-phpのOrganizationを作成しました。それに伴って、拙作のPHP関連パッケージはこちらに移動しました。
.dir-locals.el
.dir-locals.el
はディレクトリで共通の変数設定するための仕組みです。
私はpixivのホームディレクトリに置いてる.dir-locals.el
ファイルはこんな感じです。
((nil . ((pixiv-dev-working-dir . "~/work/pixiv") (pixiv-dev-remote-working-dir . "/scp:x123:/home/tadsan/pixiv/") (pixiv-dev-repository-web . "https://gitlab.example.com/pixiv/pixiv") (phpunit-root-directory . "/scp:x123:/home/tadsan/pixiv/") (copy-file-on-save-dest-dir . "/scp:x123:/home/tadsan/pixiv/") (copy-file-on-save-ignore-patterns . ("/\\.dir-locals\\.el\\'" "/\\.git/" "/tpl_c")))))
なんか同じような記述を何回か繰り返してしまってますが、それぞれ独立したパッケージに対する設定なので仕方ないですね。 (いい感じに統合したいかもしれない)
php-mode.el
最近、メインメンテナを引き継ぎました。古いバージョンをずっと使ってる型も、地味な修正とか変更とかPHP7系の文法への対応も入ってるので、最新版にアップデートしてください。
現行バージョンは今月(2017年12月)にリリースした 1.18.4
です。
copy-file-on-save.el
私は入社して以来、仮想ファイルシステムとしてTRAMPを使ってSSH先の共有サーバーのファイルを読み書きしてましたが、ストレスを感じる要因として読み書きの遅さがあります。
また私はPhpStormも使って作業したいので、観念してローカルディスクにソースコードを git clone
することにしました。そこで登場するのがPhpStormのAuto Deployment機能です。
こりゃ便利だ! インスパイアされた私は、さっそくEmacsに実装しました。
仕様はいたって簡単で、バッファのファイルを保存した直後に 別のパス にコピーします。Emacs上で別のパスをコピーする際、そのファイルパスが/ssh:
や/scp:
などから始まるものならば、Emacsは透過的にSSH/SCPを使ってファイルを転送してくれます。
((nil . ((copy-file-on-save-dest-dir . "/scp:x123:/home/tadsan/pixiv/") (copy-file-on-save-ignore-patterns . ("/\\.dir-locals\\.el\\'" "/\\.git/" "/tpl_c")))))
今年に入ってからの開発スタイルの大きな変化は、このパッケージのお蔭でTRAMPを多用しなくなったことです。また、PhpStormも併用しやすくなりました。
ちなみにPhpStormは多段SSHの際に特別な工夫が必要ですが、Emacsにはそのような欠点はありません。
このcopy-file-on-saveは、保存時にファイルをコピーするだけの単機能に徹します。そのため複数ファイルやディレクトリの再帰的なコピー・同期は対応しません。そのため、作業方法によってはローカルとリモートのファイルに齟齬が生じます。 (特にローカルで git pull
などでほかの開発者の変更を取り込んだ後や、git checkout
で別の作業ブランチに移動した際などです)
そのような場合は、私はSSHでログインしてリモートでも手動で明示的にgit pull
やgit checkout
、git reset --hard
や git clean -f
をすることで対処します。(私は使ってませんが)Emacsだけで完結させたい場合にはemacs-ssh-deployパッケージがあるようです。
phpunit.el
去年に引き続きですが、最近また機能追加したのでお知らせします。
phpunit.el
は以前からリモートサーバー上での実行に対応してます。ところが先述したように、ファイルはローカルのファイルシステムにあるが、テストの実行環境はリモートのファイルシステムにある… といった場合に困ります。
phpunit-root-directory
を設定することで、特定のディレクトリでPHPUnitを実行できるようになります。
((nil . ((phpunit-root-directory . "/scp:x123:/home/tadsan/pixiv/")))
phan.el
PhanはPHPの静的解析ツールですが、その出力ログを読みやすくカラーリングするメジャーモードです。Phanの出力ファイル名は規定されてませんが、このモードでは phan.log
の名前で書き出されることを期待してます。
flycheck-phanclient
Phanをデーモンとして起動することで、メソッドの呼び出しミスや型の不整合などを編集中に検出できます。手動で起動する必要があるのはめんどくさいですが、これをうまく活用すればPhpStorm並に確実にエラーを補足しながらコーディングできるようになります。やりましたよ。
近い将来もっと手軽に手間を減らせるようにしたいですね。 ヾ(〃><)ノ゙
yasnippet-snippets
ないよりましレベルの実装ではありますが、構文やPHPDocタグの挿入補完ができます。
なんかスペースのとりかたとかファイル名の決定の仕方とか改善の余地はあるので、ぼちぼちやっていきます。
php-runtime.el
Emacs LispからPHPコードをeval
できます。実用ライブラリです。これはPHP Modeとの統合予定があります。
jetbrains.el
Emacsで編集中のプロジェクトでPhpStorm、IntelliJ IDEAなどのIDEを起動したり、編集中のファイルをIDE開き直すことができるコマンドです。べんり。
pixiv-dev.el
基本機能は去年と変りませんが、設定すればシェルはリモート実行できるようになりました。
まとめ
- 今年もEmacsでPHPを開発しやすくできるように細々と改善してました
- 今回紹介したパッケージで私がメンテナンスしてるのは以下の通りです
- copy-file-on-save.el
- jetbrains.el
- phan.el
- php-mode.el
- phpunit.el
- yasnippet-snippets (php)
- これらのパッケージへの苦情は私が対応しますので、遠慮せず安心して投げ付けてください
最後になりましたがピクシブ株式会社はエディタ不問企業です!! 言語もPHPだけじゃなくてRubyもScalaもGoもありますし、Jetbrains IDEも当然会社の経費で購入します!
そんなpixivを改善したり新規サービスを開発する仕事に興味があったり、暇なときにpixivに遊びに来たいとか思った型はTwitterとかで声かけていただければ対応します ヾ(〃><)ノ゙
不問とは言ったがVimに強いひととかEmacsに強いひととかもっと入ってくれると心強いので、いっぱい入社してほしい!!!!
twitter.com突然ですが、ピクシブで働きたい方居ませんか? 新卒・中途問はないので興味あるかたリプライとかDMとかください。いやまじで。
— tad3 (@tadsan) 2017年12月8日