Atomで現在開いているスクリプトを簡単に実行して結果を見るためのscriptパッケージでbundle exec ruby
で実行しようとしたらちょっとハマったのでメモ。
問題
scriptは現在開いているスクリプトのファイルタイプに対応したコマンドでスクリプトを実行してくれます。例えばhoge.rbだったらruby hoge.rb
を実行した結果を表示してくれます。
しかしBundlerでGemを管理していたり、libディレクトリにあるクラスをrequireしたい場合などはruby
だけは依存パッケージを読み込めないのでbundle exec ruby -I ./lib
で実行させたい。
Atomのメニューからscript→Configure Scriptを開くとCommandという項目があるのでここにbundle exec ruby
と書けば実行してくれそうなのですが、エラーになってしまいます。
Configure Scriptのそれぞれの項目の意味
scriptパッケージのUsageにEnviroment Variablesについてだけは説明があるのですが、その他は具体例がないのでよく分からない感じです。
さすがにCurrent Working Directoryだけは実行するディレクトリの指定と想像が付くのですが、それ以外のオプションに何を入れるべきか分からなかったので調べてみました。
検索してみたところ、scriptパッケージのrunner.coffeeにあるRunnerクラスのrunメソッドの@bufferedProcess
に引数をセットして子プロセスを走らせているっぽいので、このあたりにconsole.logを仕掛けて追っかけてみました。
https://github.com/rgbkrk/atom-script/blob/master/lib/runner.coffee#L23
以下のような使われ方のようです
項目 | 用途 | 補足 |
---|---|---|
Command | 実行するコマンド。.rbだとデフォルト挙動はrubyが入る | スペース区切りで2つのコマンドを指定しようとしてもエラーになってしまう |
Command Arguments | Commandへの引数 | |
Program Arguments | 実行するスクリプトに渡す引数 |
つまり、hoge.rbに対してターミナルでruby -I ./lib hoge.rb hogehoge
として実行したい場合には以下のように指定すると意図通りに動いてくれます。
項目 | 入力 |
---|---|
Command | ruby |
Command Arguments | -I ./lib |
Program Arguments | hogehoge |
結論
ターミナルで実行するときのコマンドとConfigure Scriptの各オプションは以下のように対応しているようです。
${Command} ${Command Arguments} ${実行されるスクリプト} ${Program Arguments}
よって以下の設定をしてSave as profileで保存し、次回からはRun with profileで実行すればbundle exec付きで実行できます。
項目 | 入力 |
---|---|
Command | bundle |
Command Arguments | exec ruby -I ./lib |
補足
scriptパッケージのREADMEにも書いてありますが、Atom内でパスが通っていないためにコマンドが実行できないというのがありがちな問題としてあるそうです。
その場合はターミナルから
atom .
で起動することでシェルのPATHを引き継げるようです。