将带Webpacker的Rails应用部署至Heroku失败求助
环境信息
- Rails 5.1.5
- webpack 3.11.0
报错内容
remote: Webpacker已安装 🎉 🍰
remote: 使用/tmp/build_a60546bb726d2fa7f4b8b4ac052f461e/config/webpacker.yml文件配置webpack路径
remote: 编译中…
remote: 编译失败:
remote: bundler: 无法加载命令: webpack (/tmp/build_a60546bb726d2fa7f4b8b4ac052f461e/vendor/bundle/ruby/2.3.0/bin/webpack)
remote: Errno::ENOENT: 没有该文件或目录 - /tmp/build_a60546bb726d2fa7f4b8b4ac052f461e/node_modules/.bin/webpack
我之前部署Rails项目时也踩过这个webpacker的坑,结合你的情况,给你几个靠谱的解决方向:
确保部署流程里执行了npm/yarn安装依赖
这个错误最常见的原因就是部署时跳过了Node.js依赖的安装。Webpacker依赖本地安装在node_modules里的webpack,而不是全局的。你需要在部署脚本里,在bundle install之后加上npm install --production(用yarn的话就是yarn install --production),确保所有Node依赖都被正确安装到部署目录的node_modules下。核对webpacker.yml里的webpack路径配置
错误提示里已经说明用了/tmp/.../config/webpacker.yml来配置webpack路径,你需要打开这个文件,找到webpack相关的配置项,确认它指向的是本地的webpack可执行文件:webpack: ./node_modules/.bin/webpack别写错成全局的webpack路径(比如
/usr/bin/webpack),否则bundler会找不到本地的命令。检查Webpacker和webpack的版本兼容性
Rails 5.1.5对应的Webpacker版本应该是3.x系列,如果你用的Webpacker版本太高,可能会和webpack 3.11.0不兼容。可以在Gemfile里锁定Webpacker的版本:gem 'webpacker', '~> 3.5'然后重新执行
bundle install,再删除node_modules重新安装npm依赖:rm -rf node_modules && npm install。清理缓存后重新构建
有时候部署缓存会导致依赖缺失,你可以在部署前先清理Rails的tmp缓存:rails tmp:clear,同时清理Node的缓存:npm cache clean --force,然后重新执行依赖安装和编译步骤。
内容的提问来源于stack exchange,提问作者Hidehiro NAGAOKA

