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で機能することをもう一度強調したいと思います。



Source: https://habr.com/ru/post/J315690/


All Articles