超PHPerになろう

Enjoy PHP Programming

PHP開発のためのEmacs 2017

ピクシブ開発基盤チームの超PHPerことうさみ(@tadsan)です ヾ(〃><)ノ゙

この記事はピクシブ株式会社 Advent Calendar 2017の16日めです。

私はVimのウルテクで華麗にリファクタリングとかよりは平凡な環境で地味に開発していくのが得意ですが、そのなかでも開発を効率化するための手段を紹介します。

背景

ピクシブ社内にもさまざまな言語のプロジェクトがありますが、そのなかでもpixivは2007年から続く社内最大のPHPプロジェクトです。その経緯から、pixivの普段の開発環境は共用のGNU/Linuxサーバと共用のMySQLなどのデータストア上に展開されます*1

社内ネットワークのDNSApache HTTP ServerのVirtualDocumentRootワイルドカード証明書 (Common Nameに*を含んだサーバ証明書の通称)の組み合せにより、開発者個人ごとに独立したTLS通信可能なPHP動作環境を持てるため、非常に快適です。

ただし問題はコーディングと動作確認の作業です。 pixiv開発者は、大別すると以下の手段のどれかを選ぶ必要があります。

どの手法にも一長一短があります。

大雑把に一言でまとめると、Aは「ツール/エディタが限定されるが同期作業は不要」、Bは「ツールの自由度は上がるがファイルの同期作業が必要」、Cは「ツールの自由度があり明示的な同期作業も不要だがファイルの読み書きが遅い」など、それぞれ一長一短の問題があります。

私の入社時はAは比較的多かった印象です。一方で私は入社時からCです。SSHFSにはネットワーク接続がタイムアウトしたときにファイルシステムがアンマウントされるなどの問題がありますが、EmacsのTRAMPではそのような問題は起こりません

(Dockerなどで各自のローカルマシンに開発環境を構築するといった方法も想定可能ですが、現状は開発用データの量と管理方法、関連ミドルウェアの問題などから困難があります)

2016年のEmacs

PHP開発のためのEmacs 2016 (pixiv <3 Emacs)のまとめから抜萃します。

去年の記事を書いてからの報告なのですが、phpunit.elの共同メンテナとしてコミット権をいただき、PHP Modeのメインメンテナを引き継ぎました

2017年のEmacs開発環境

ここからは、前回の記事からアップデートされたもの、多用するようになったもの、新規に作成したものを中心に紹介します。

GitHub: emacs-php

github.com

GitHubemacs-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

github.com

最近、メインメンテナを引き継ぎました。古いバージョンをずっと使ってる型も、地味な修正とか変更とかPHP7系の文法への対応も入ってるので、最新版にアップデートしてください。

現行バージョンは今月(2017年12月)にリリースした 1.18.4 です。

copy-file-on-save.el

github.com

私は入社して以来、仮想ファイルシステムとして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 pullgit checkoutgit reset --hardgit clean -f をすることで対処します。(私は使ってませんが)Emacsだけで完結させたい場合にはemacs-ssh-deployパッケージがあるようです。

phpunit.el

github.com

去年に引き続きですが、最近また機能追加したのでお知らせします。

phpunit.elは以前からリモートサーバー上での実行に対応してます。ところが先述したように、ファイルはローカルのファイルシステムにあるが、テストの実行環境はリモートのファイルシステムにある… といった場合に困ります。

phpunit-root-directory を設定することで、特定のディレクトリでPHPUnitを実行できるようになります。

((nil . ((phpunit-root-directory . "/scp:x123:/home/tadsan/pixiv/")))

phan.el

github.com

PhanはPHPの静的解析ツールですが、その出力ログを読みやすくカラーリングするメジャーモードです。Phanの出力ファイル名は規定されてませんが、このモードでは phan.log の名前で書き出されることを期待してます。

f:id:zonu_exe:20171215171419p:plain

flycheck-phanclient

github.com

Phanをデーモンとして起動することで、メソッドの呼び出しミスや型の不整合などを編集中に検出できます。手動で起動する必要があるのはめんどくさいですが、これをうまく活用すればPhpStorm並に確実にエラーを補足しながらコーディングできるようになります。やりましたよ。

f:id:zonu_exe:20171215195719p:plain

近い将来もっと手軽に手間を減らせるようにしたいですね。 ヾ(〃><)ノ゙

yasnippet-snippets

github.com

ないよりましレベルの実装ではありますが、構文やPHPDocタグの挿入補完ができます。

なんかスペースのとりかたとかファイル名の決定の仕方とか改善の余地はあるので、ぼちぼちやっていきます。

f:id:zonu_exe:20171215200815g:plain f:id:zonu_exe:20171215200838g:plain f:id:zonu_exe:20171215200841g:plain

php-runtime.el

github.com

Emacs LispからPHPコードをevalできます。実用ライブラリです。これはPHP Modeとの統合予定があります。

jetbrains.el

github.com

Emacsで編集中のプロジェクトでPhpStorm、IntelliJ IDEAなどのIDEを起動したり、編集中のファイルをIDE開き直すことができるコマンドです。べんり。

pixiv-dev.el

github.com

基本機能は去年と変りませんが、設定すればシェルはリモート実行できるようになりました。

まとめ

最後になりましたがピクシブ株式会社はエディタ不問企業です!! 言語もPHPだけじゃなくてRubyScalaもGoもありますし、Jetbrains IDEも当然会社の経費で購入します!

recruit.jobcan.jp

そんなpixivを改善したり新規サービスを開発する仕事に興味があったり、暇なときにpixivに遊びに来たいとか思った型はTwitterとかで声かけていただければ対応します ヾ(〃><)ノ゙

不問とは言ったがVimに強いひととかEmacsに強いひととかもっと入ってくれると心強いので、いっぱい入社してほしい!!!!

twitter.com

*1:ユニットテスト用のDBは別で、これらはユーザーごとにプロセスが起動されます