I have a Rails application using React, Webpack, and Yarn for the client side. I have everything relating to the client side within the /client directory. This includes my yarn.lock and package.json files. I have a Procfile that cds into /client and properly runs yarn run build
. This works locally with no errors. However, when I deploy/push to Heroku, my push is rejected and I get the following error:
remote: cd client && yarn run build:production
remote: sh: 1: yarn: not found
remote: rake aborted!
remote: Command failed with status (127): [cd client && yarn run build:production...]
What this says to me is that Heroku wasn't able to find a yarn.lock file in the root level. How do I get Heroku to use the yarn.lock
file within my /client directory?
Or is the cause of this error something else entirely?
Make sure to use both ruby and node buildpacks. I got this error when I didn't.
Execute these in your root folder:
heroku buildpacks:set heroku/ruby
heroku buildpacks:add --index 1 heroku/nodejs
Sources: https://devcenter.heroku.com/articles/using-multiple-buildpacks-for-an-app
https://github.com/shakacode/react_on_rails/blob/master/docs/additional-reading/heroku-deployment.md
Just been through a similar thing myself. You need to order the buildpacks so that node is first. If a yarn.lock is in your root dir (or yarn is in your "engines" key as in @remydib's answer), then the node buildpack will install yarn and then your packages. If you have a yarn.lock
in /client, put one in root, and add a postinstall
script to it that says cd client && yarn run build
.
In my case (rake assets:precompile calls yarn and fails), for some reason when the buildpacks go ruby -> node, Heroku doesn't wait for node to install before trying to run rake tasks, and we go kablooie.
Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With