REST APIとコマンドラインを使用したJetBrains IDEコードナビゲーション

画像







アプリケーションを開発するとき、例外スタックトレース出力を(ログで、またはデバッグ中に)表示する必要があることがよくあります。 ブラウザまたはターミナルでスタックトレースの出力の行をクリックすることで、コードの適切な場所に自動的に移動できるようにしたいと思います。







最新のJetBrains製品(特にPhpStorm)のいずれかのユーザーである場合、これらの目的で内部REST API(ブラウザーからの移動用)およびコマンドラインランチャー(ターミナル内の移動用)を使用できます。







ブラウザナビゲーション



JetBrains REST API IDEメソッドの部分的な説明はここにあります:







» Http://develar.org/idea-rest-api/







このAPIのメソッドの1つは、プロジェクトファイルを開き、IDE内のこのファイル内の任意の位置に移動する機能です。







APIメソッド呼び出しは、 http://localhost:63342/



呼び出しを介してアクセスされます







ファイルを開くためのAPI呼び出しの例は次のようになります。







http://localhost:63342/api/file?file=src/path/to/file.php&line=100&column=34









ここで:







file-相対または絶対ファイルパス

line-カーソルを移動するファイル内の行

column-指定された行の位置







警戒







IDEでAPIが呼び出されるたびに表示されるメッセージを削除するには、設定で「署名されていない要求を許可するをチェックします: Build, Execution, Deployment → Debugger



(またはダイアログの[OK]ボタンをクリックするたびに)。







設定







PHPで標準のgetTraceAsString()の出力を処理する例



以下は、 getTraceAsString()を介した例外からの標準スタックトレース出力を処理する正規表現を示しています。







 try { // some code }(\Exception $e){ $traceAsString = preg_replace('/#(\d+) (.+?\.php)\((\d+)\):/', '#$1 <a href="#" onclick="_goToEditorCodeLine(\'$2\', \'$3\'); return false;">$2($3):</a>', $e->getTraceAsString() ); // some code }
      
      





例外の各行はリンクになり、クリックすると目的の行のIDEファイルが開きます。







APIメソッドを直接「プル」するJS関数を接続する必要もあります。







 function _goToEditorCodeLine(file, line){ var xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", "http://localhost:63342/api/file?file=" + file + "&line=" + line, true); xmlhttp.send(); }
      
      





Symfony 3での例外処理の実装例



現在Symfonyで作業しているので、IDEファイルで開くことを実装するために標準の例外でページを修正する方法を具体的な例で示します。







例外ページの出力を担当するテンプレートの一部をオーバーライドするには、 app/Resources/TwigBundle/views/Exception/



folderに2つのファイルを作成する必要があります









exception.html.twigファイルに、最も単純な関数_goToEditorCodeLine()



追加します。このコードについては上記で説明しています。







ファイルtrace.html.twigで、行が表示されている場所を見つけ、最後に矢印を追加します。矢印をクリックすると、IDEでファイルが開きます。







  in {{ trace.file|format_file(trace.line) }} <a href="#" onclick="_goToEditorCodeLine('{{ trace.file }}', '{{ trace.line }}'); return false;">&rarr;</a>&nbsp;
      
      





その後、スタックトレース行に矢印が表示されます。矢印をクリックすると、IDEでファイルが開き、カーソルが目的の位置に移動します。







symfonyの例外







Symfony 3の2つのファイルの最終バージョンは、 こちらにあります







iTerm2のコマンドライン統合



MacOSで作業しており、iTerm2を使用している場合、iTerm2およびコマンドラインランチャーを対応するIDEに統合できます。これにより、ターミナルから直接IDEのファイルを開くことができます。







ランチャーをインストールするには、IDEでメニューの[ Tool → Create Command-line Launcher...



] Tool → Create Command-line Launcher...



]を呼び出し、ダイアログボックスでランチャーのインストール先のパスを確認します。 私の場合、これは/usr/local/bin/phpstorm



(または以前のバージョンの場合は/usr/local/bin/phpstorm



)で、IntelliJ IDEAは/usr/local/bin/idea



です。







このランチャーを使用すると、コマンドラインから呼び出されたときにファイルを開き、目的の行に移動できます。







呼び出し例:







/usr/local/bin/phpstorm --line 40 /path/to/file









または







/usr/local/bin/phpstorm /path/to/file:40









どちらの場合も、ファイル/path/to/file



は40行目で開かれ/path/to/file









次に、コマンドラインランチャーとiTerm2を統合します。 セッションの編集→詳細設定に移動します。







iTerm







[ Semantic History



セクションのドロップダウンリストから、[ run command...



run command...



を選択し、次のように入力します。







/usr/local/bin/phpstorm --line \2 \1









これで、Cmdを押して、ターミナル内の任意のファイルにカーソルを合わせると、リンクになり、クリックするとIDEで開きます。







ログの形式が/path/to/file/:40



場合、つまり ファイルの後のコロンの後に行番号が示されます-IDEはこの行でファイルを直接開きます。







php-exceptionログの問題は、出力が/path/to/file/(40)



の形式、つまり ファイル内の行は括弧で囲まれています。 この結果、ファイルは開かれますが、目的の行には移動しません。







この問題を解決するには、sedストリームエディターを使用して、ログ出力を必要な形式に変換します。







sed -E 's/#([0-9]+) (.+\.php)\(([0-9]+)\):/#\1 \2:\3/g'









テール関数の出力処理の例







tail test.log | sed -E 's/#([0-9]+) (.+\.php)\(([0-9]+)\):/#\1 \2:\3/g'









結論として、このスキームがほぼすべての言語とJetBrains IDEで機能することをもう一度強調したいと思います。








All Articles