Visual Studio Codeにはタスク機能が存在し、テストやLintといったツールをVSCodeから実行できます。
npm等ではプロジェクトから自動でタスクを検出したりできるようですが、今回はRuby on Railsのサーバ起動タスクを手動で定義してみました。
環境
- Ruby 2.3.1
- Ruby on Rails 5.2.0
- Visual Studio Code 1.24.0
- Windows 10 Pro 17133.1 (April 2018 Update)
- Windows Subsystem for Linux
$ cat /etc/os-release | grep VERSION=
VERSION="16.04.4 LTS (Xenial Xerus)"
VSCodeタスクの定義
まずはやってみましょう。
- VSCodeを起動し、
Ctrl+Shift+Pでコマンドパレットを開きます -
>Tasks: Configure Taskでタスクを構成します -
テンプレートからtasks.jsonを生成を選択します -
Others 任意の外部コマンドを実行する例を選択します
.vscode/tasks.jsonが開き、サンプルとして下記のようなタスクが表示されます。
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "echo",
"type": "shell",
"command": "echo Hello"
}
]
}
とりあえず実行してみましょう。Ctrl+Pでコマンドパレットを開き、task echoを実行しタスクの出力をスキャンせずに実行します。
するとシェルコマンド$ echo Helloが実行され、ターミナル部分にHelloと実行されます。
これを応用し、bundle installからdb:migrate、Server立ち上げてlocalhost:3000を開く までを連続で行うタスクrails startを定義します。
Railsを起動するVSCodeタスクの定義
下記を順番に実行するタスクを定義します。
$ bundle install$ rails db:migrate-
$ kill -9で実行中のRailsを停止 $ rails server-
$ explorer.exeか$ openで、 http://localhost:3000 を開く
適当なRailsプロジェクトを開き、.vscode/tasks.jsonに下記を記述します。
{
"version": "2.0.0",
"tasks": [
{
"label": "bundle install",
"type": "shell",
"command": "bundle install --path vendor/bundle"
},
{
"label": "rails db:migrate",
"type": "shell",
"command": "bundle exec rails db:migrate",
"dependsOn": [
"bundle install"
],
},
{
"label": "rails server start",
"type": "shell",
"command": "bundle exec rails server --daemon",
"dependsOn": [
"rails server stop",
"rails db:migrate"
],
},
{
"label": "rails server stop",
"type": "shell",
"command": "test -e ./tmp/pids/server.pid && kill -9 `cat ./tmp/pids/server.pid` || true"
},
{
"label": "rails start",
"type": "shell",
"command": "open http://localhost:3000",
"windows": {
"command": "explorer.exe http://localhost:3000"
},
"presentation": {
"reveal": "always",
"panel": "shared"
},
"group": {
"kind": "build",
"isDefault": true
},
"dependsOn": [
"rails server start"
],
"problemMatcher": []
}
]
}
Ctrl+Shift+Bでrails startを実行し、Railsが起動して、自動的にブラウザでhttp://localhost:3000 が開いたら成功です。
詳細
| 設定項目 | 意味 |
|---|---|
| label | タスクの名前。コマンドパレットからこの名前で実行する。 |
| type |
shellとするとbash cmd PowerShell等のシェルコマンドとして解釈される |
| command | 実行するコマンド |
| windows | プラットフォームに応じて設定項目を変更できる。今回の例ではコマンドをMacでは$ open、Windowsでは$ explorer.exeとするために使っている。同様にlinuxとosxも設定できる。 |
| presentation.reveal | 統合ターミナルにフォーカスを当てるかどうか。always、neverの他に、エラー検出時しか表示しないsilentがあるが、今回はエラーを取り扱わないので使えない |
| presentation.panel | 複数のタスク間でターミナルを共有するかどうか。sharedで共有し、複数回実行時に同じターミナルを使いまわす。他にdedicatedとnewが選択できる。 |
| group.kind |
buildとするとビルドタスク扱いとなり、Ctrl+Shift+Bで実行できる |
| group.isDefault | デフォルトタスクとして扱い、選択しなくてもCtrl+Shift+Bするだけで実行できるようになる |
| dependsOn | 指定したタスクを並列で実行し、すべてが正常終了した場合にこのタスクを実行する |
| problemMatcher | 「今後このタスクの出力をスキャンしない」場合は空配列となる |
-
$ rails serverは入力を待ち受けてしまうと次のタスクに進まないので、--daemonでデーモンとして実行 - エラーコードが返ると次のタスクに進まないので、
rails server stopは(command) || trueで強制的に正常終了
まとめ
こうして、VSCodeからコマンド一発でRails Serverを起動することができました。
プラットフォーム別の設定などが使えるのは便利なのですが、やりたい事に対してjsonの記述量がちょっと冗長な感じもします。