2017-09-11 2 views
1

私はDockerで開発するためにEmacsを使用しています。 Emacsはコードを含むボリュームでホスト上で動作し、Dockerコンテナ内で実行され、テストされます。コンパイルコマンドをグローバルに変更する

私はいくつかのEmacsモードの編集を開始し、コマンドプレフィックスとしてドッカーを許可する変数を追加しました。したがって、.dir-localsを使用すると、Dockerコンテナの内部にrspecのようなコマンドを実行することができます。しかし、私はそこに行くためにrspec-modeのコードを変更しなければならなかった。私が長い間見てきたモードは共通しているので、Emacsのコマンドであるcompileを使ってコマンドを実行しています。

compile関数や何かをcomintにグローバルに展開して、Docker内でコンパイルされた外部コマンドを実行する接頭辞を追加する機会があるのだろうかと思います。例えば。 rspecdocker-compose exec app rspecに変換されます。理想的には、これは.dir-localsで行われ、プロジェクト固有のプレフィックスを許可します。

これにより、コードを変更することなくどのモードでも動作するはずのはるかに一般的な解決策になります。 Dockerに限定されず、コマンドに特別な接頭辞が必要なモードもあります。

残念ながら、私はこの実行のようなものを得る方法はありません。

+0

私はドッカーを使用していませんが、トランプ拡張機能があるようです:https://www.emacswiki.org/emacs/TrampAndDocker。あなたがコンテナ内のファイルやディレクトリを開くことができるようで、コンパイルコマンドは自動的にそこで実行されるはずです(ssh上のリモートマシンと同じように)。また、マルチコンパイルもチェックしてください。私はそれを使ってコンパイルコマンドを整理します。 – jpkotta

+0

私はTrampを試していませんでしたが、私が読んだ限り、私のローカルソースツリーのファイルを編集する利点はありません。マルチコンパイルは興味深いように見えますが、私はこれをさらに調べる必要があります。別のアプローチは 'compile'を再定義して各コマンドに追加される接頭辞を取ることでした。 Dockerコンテナの内部に存在しないグローバルファイルパスを使用する拡張機能がいくつかあります。私の次のアイデアは、 '.dir-locals'プロジェクトルート変数を追加することです。ローカル変数でグローバルパスを置き換えることができます。 –

+0

'compile'はデフォルトで' make'を実行します。適切な 'Makefile'を書いて、あなたがしなければならないことはできませんか? – Nick

答えて

0

私は今、次のを思い付いた:

私のEmacsの初期化ファイルでは、私はいくつかのVARSを追加して、次のようにcompileコマンドを変更:

(defvar compilation-command-prefix nil 
"Using environments like docker, this can be used to 
add a command prefix which is executed before each compile command. 
Last given char in most cases should be whitespace.") 

(defvar compilation-project-root nil 
"When set to a projecet root dir, parameters which contain that dir 
get subsituted, which makes them relative to the root path.") 

(defun compile (command &optional comint) 
    (interactive 
    (list 
     (let ((command (eval compile-command))) 
     (if (or compilation-read-command current-prefix-arg) 
     (compilation-read-command command) 
    command)) 
     (consp current-prefix-arg))) 
    (unless (equal command (eval compile-command)) 
     (setq compile-command command)) 
    (save-some-buffers (not compilation-ask-about-save) 
         compilation-save-buffers-predicate) 
    (setq-default compilation-directory default-directory) 
    (compilation-start (concat compilation-command-prefix (replace-regexp-in-string compilation-project-root "" command)) comint)) 

のでcompilation-command-prefixcompilation-project-rootが与えられたとき、最初のファイルはcommandのプレフィックスとして使用され、2番目のファイルはcommandから削除され、相対ファイルパスが取得されます。

対応.dir-locals.elは次のとおりです。

((nil 
    . ((compilation-command-prefix . "/usr/local/bin/docker-compose exec app ") 
    (eval setq compilation-project-root 
      (replace-regexp-in-string "~" (getenv "HOME") (locate-dominating-file default-directory ".dir-locals.el")))))) 

これはcompileで前フックのいくつかの並べ替えは、よりエレガントな解決策になる場合でも、私のために動作します。

関連する問題