我使用 RVM 在基于 Mac 的开发环境中更改 Ruby 版本。
在 Visual Studio Code 中,当我打开一个常规的终端选项卡时,我进入了一个带有 -l
的 bash 登录 shell。选项,按照标准的默认配置,如 documented here :
// VSCode default settings
{
"terminal.integrated.shell.osx": "/bin/bash",
"terminal.integrated.shellArgs.osx": [
"-l"
]
}
默认情况下,从 VSCode 终端手动执行的 RVM 命令为我提供了该项目的预期 ruby 版本。
$ rvm list
ruby-2.0.0-p648 [ x86_64 ]
ruby-2.1.10 [ x86_64 ]
ruby-2.1.5 [ x86_64 ]
ruby-2.2.10 [ x86_64 ]
ruby-2.2.5 [ x86_64 ]
ruby-2.3.0 [ x86_64 ]
* ruby-2.3.1 [ x86_64 ]
=> ruby-2.3.7 [ x86_64 ]
# => - current
# =* - current && default
# * - default
但是,当我设置
.vscode/tasks.json
时文件来执行相同的命令,Ruby 版本不是正确的版本,而是系统上的默认版本。此外,我无法实际使用
rvm use
切换版本(见下面的错误信息)
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Check for RVM",
"type": "shell",
"command": "rvm list && rvm use 2.3.7",
"group": {
"kind": "test",
"isDefault": true
}
}
}
}
任务执行的输出,带有关于没有正确登录 shell 的错误消息。
> Executing task: rvm list && rvm use 2.3.7 <
ruby-2.0.0-p648 [ x86_64 ]
ruby-2.1.10 [ x86_64 ]
ruby-2.1.5 [ x86_64 ]
ruby-2.2.10 [ x86_64 ]
ruby-2.2.5 [ x86_64 ]
ruby-2.3.0 [ x86_64 ]
=* ruby-2.3.1 [ x86_64 ]
ruby-2.3.7 [ x86_64 ]
# => - current
# =* - current && default
# * - default
RVM is not a function, selecting rubies with 'rvm use ...' will not work.
You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for an example.
Terminal will be reused by tasks, press any key to close it.
我什至尝试专门添加
-l
bash 命令选项作为任务配置中的参数,但这不起作用。
"options": {
"shell": {
"args": "-l"
}
}
我的理解,通读后 this issue是不是终端 shell 配置和任务 shell 配置是一回事,那么终端 shell 和任务 shell 之间是否存在其他一些我遗漏的潜在不一致?如果不是,那么 RVM 是什么阻止它在任务 shell 内工作?
请您参考如下方法:
RVM 覆盖“cd”命令以检测 .ruby-version 和 .ruby-gemset 文件并自动设置您的环境。新启动的 vscode 终端不会触发它。它只使用 vscode 启动时的默认或当前设置,而不是你在 .ruby* 文件中定义的。
所以我通常运行cd $PWD
在 vscode 中启动新终端时。
在tasks.json中定义rake任务时,我的命令行是这样的:
{
"label": "rake db:migrate",
"type": "shell",
"command": "cd $PWD; rake db:migrate",
"problemMatcher": []
},
请注意
cd $PWD
前置到命令行,以 Hook 到 rvm。
很乱但到目前为止它对我有用。
我怀疑这种对 rvm/.ruby-gemset/.ruby-version 的不了解也阻止了 vscode 自动检测 Ruby 插件应该执行的 rake 任务,正如这里提到的 https://medium.com/hack-visual-studio-code/rake-task-auto-detection-in-vscode-ce548488755e .因此,我想通过 vscode 任务运行的任何 rake 任务都必须由我以这种方式手动定义。
希望这可以帮助。