当在Heroku上部署使用Webpacker的Rails应用程序时,可能会出现与yarn版本相关的错误问题

随着引入了webpacker,Rails变得更容易进行前端开发,使用了JavaScript资产。
实际上,我已经引入了webpacker并成功运行了一个本地应用程序,因此我尝试将其部署到Heroku并进行运行确认。然而,在此过程中遇到以下错误:

remote: -----> Installing node-v6.11.1-linux-x64
remote: -----> Installing yarn-0.22.0
remote: -----> Detecting rake tasks
remote: -----> Preparing app for Rails asset pipeline
remote:        Running: rake assets:precompile
remote:        Webpacker requires Yarn >= 0.25.2 and you are using 0.22.0
remote:        Please upgrade Yarn https://yarnpkg.com/lang/en/docs/install/
remote:  !
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote:
remote:  !     Push failed

本次是关于这个问题的应对方法。

版本

rails版本是5.1.0
webpacker版本是3.0.1

由于某种原因

webpacker3.0.1版本需要0.25.2以上的yarn版本,但由于在Heroku上安装了0.22.0版本,因此出现了错误。造成在Heroku上安装0.22.0版本的原因在于此处的评论,heroku-buildpack-ruby(一个在Heroku上构建Rails应用的工具)中硬编码了yarn的版本(相关代码)。截至2017年9月19日,已经有一份提升该版本的PR已经提交。如果被合并,以上问题应该不会再出现。

处理

在Heroku的官方文档中找到了这个解决方法,只需将heroku-buildpacks按照nodejs -> ruby的顺序进行配置,即可实现成功部署。使用命令行的话,可以执行以下指令。

$ heroku buildpacks:clear -a (アプリ名) # buildpacks を初期化する
$ heroku buildpacks:add heroku/nodejs -a (アプリ名)
$ heroku buildpacks:add heroku/ruby -a (アプリ名)

这将会在heroku-buildpack-nodejs中安装yarn(版本为0.28.4)。
需要指定版本时,请在应用的package.json中进行设置。

"engines": {
  "yarn": ">= 0.25.2"
}

根据上述写法,似乎heroku-buildpack-nodejs能够根据指定的版本进行安装。