vscode 需手动配置 tasks.json、安装 chef workstation、显式指定 chef 全路径并设 cwd,否则 chef 命令报错;终端需 chef --version 有效;windows 要绕过 powershell 策略;macos/linux 需用 rbenv/rvm 正确路径;ruby 插件需配置 solargraph 支持 chef dsl。

VSCode 本身不支持 Chef Cookbook 的原生任务或语法高亮,必须靠手动配置 tasks.json + 安装 Ruby 环境 + 补全 Chef CLI 路径,否则 chef 命令在任务里直接报错“command not found”。
确认 Chef CLI 是否真正可用
Chef 开发依赖本地 Ruby 环境和 chef 可执行文件(来自 chef-workstation 或 chef-dk),不是装了 Ruby 就够——很多用户卡在这一步就停了。
- 在终端运行
chef --version,必须返回类似Chef Workstation version: 24.4.786才算有效;仅ruby --version成功 ≠ Chef 就绪 - Windows 用户注意:
chef默认是 PowerShell 脚本(chef.ps1),而 VSCode tasks 默认调用cmd.exe,会触发执行策略拦截,错误信息为File C:opscodechef-workstationinchef.ps1 cannot be loaded - macOS/Linux 用户若用 rbenv/rvm,确保
which chef输出的是工作站路径(如/opt/chef-workstation/bin/chef),而非 gem 安装的假路径
tasks.json 必须显式指定 shell 和 chef 全路径
VSCode 不继承你的交互式 shell 环境,"command": "chef" 几乎必败。正确做法是绕过环境变量,直指二进制。
- Windows:用
"type": "shell"+ 显式调用 PowerShell,并禁用策略(仅当前任务):"command": "powershell -ExecutionPolicy Bypass -Command "& 'C:\opscode\chef-workstation\bin\chef.ps1' generate cookbook ${fileBasenameNoExtension}"" - macOS/Linux:写死
chef绝对路径,例如:"command": "/opt/chef-workstation/bin/chef", "args": ["generate", "cookbook", "${fileBasenameNoExtension}"] - 所有平台都必须设
"options": { "cwd": "${workspaceFolder}" },否则chef generate会创建在用户主目录下
Cookbook 编辑时缺少语法检查和自动补全
Chef 的 metadata.rb、recipes/*.rb 是 Ruby 文件,但默认 Ruby 插件不会识别 Chef DSL 关键字(如 package、service、template),导致跳转失败、无参数提示。
- 安装插件
rebornix.ruby(非官方已弃用的wingrunr21.vscode-ruby)并启用"ruby.intellisense": "rubyLocate" - 在项目根目录加
.solargraph.yml,内容为:require: - chef - chef/dsl - chef/resource
然后运行solargraph bundle - 如果用
knife协作,记得在settings.json中配置"chef.knifePath"(需插件支持,如ms-vscode.chef-extension,但该插件已多年未更新,慎用)
执行 chef exec 类命令时环境变量丢失
像 chef exec rspec 或 chef exec bundle exec rake 这类命令,本质是启动一个隔离的 Ruby 环境,但 VSCode 任务默认不加载 Chef Workstation 的 PATH 和 GEM_HOME。
- 不要写
"command": "chef exec rspec"—— 这会 fallback 到系统 Ruby - 改用全路径调用:
"command": "/opt/chef-workstation/embedded/bin/ruby", "args": ["-I", "spec", "-S", "rspec", "spec/"] - 或者在
options.env中手动注入:"env": { "PATH": "/opt/chef-workstation/embedded/bin:/opt/chef-workstation/bin:${env:PATH}" } - Windows 下嵌套太多引号容易崩,建议把这类复杂命令封装成
./scripts/test.ps1或./scripts/test.sh再调用
最常被忽略的一点:Chef Workstation 更新后,/opt/chef-workstation/bin/chef 路径可能变(比如升级到 v25 后变成 /opt/chef-workstation-25.0.0/bin/chef),tasks.json 里的硬编码路径不会自动更新,一更新就失效。建议用软链接兜底,或把路径提取到 settings.json 里再引用。











