"webpack binstubs not found." on Heroku

I’ve spun up a new rails project with the following command: rails new <package-name> -d postgresql --skip-spring --skip-test --webpack=react

Following this, I created my database, added <%= javascript_pack_tag 'hello_react' %> to application.html.erb and generated a homepage.

I then ran:

rails s # tab 1
bin/webpack-dev-server # tab 2

This all works fine and I can see “Hello World!” at localhost:3000.

However, when I try to push to Heroku, the build fails at webpack binstubs not found.. I can confirm that bin/webpack does exist, doing rails webpack:install:react does nothing.

I’ve followed the instructions at webpacker/deployment.md at master · rails/webpacker · GitHub to no avail, still getting the exact same error. I’ve even tried setting compile: true in config/webpacker.yml, in the production section. Nothing.

This seems odd as this is a new project with nothing special in it; I’m confused as to why it cannot seem to find the declaration of bin/webpack. It is not in my .gitignore.

Any help would be great.

Cheers.

Full build logs:

-----> Node.js app detected
       
-----> Creating runtime environment
       
       NPM_CONFIG_LOGLEVEL=error
       USE_YARN_CACHE=true
       NODE_ENV=production
       NODE_MODULES_CACHE=true
       NODE_VERBOSE=false
       
-----> Installing binaries
       engines.node (package.json):  unspecified
       engines.npm (package.json):   unspecified (use default)
       engines.yarn (package.json):  unspecified (use default)
       
       Resolving node version 12.x...
       Downloading and installing node 12.19.1...
       Using default npm version: 6.14.8
       Resolving yarn version 1.22.x...
       Downloading and installing yarn (1.22.10)
       Installed yarn 1.22.10
       
-----> Installing dependencies
       Installing node modules (yarn.lock)
       yarn install v1.22.10
       [1/4] Resolving packages...
       [2/4] Fetching packages...
       info fsevents@2.1.3: The platform "linux" is incompatible with this module.
       info "fsevents@2.1.3" is an optional dependency and failed compatibility check. Excluding it from installation.
       info fsevents@1.2.13: The platform "linux" is incompatible with this module.
       info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
       [3/4] Linking dependencies...
       warning " > @babel/preset-react@7.12.7" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-display-name@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx@7.12.7" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx-development@7.12.7" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx-self@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx-source@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-pure-annotations@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx > @babel/plugin-syntax-jsx@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning " > webpack-dev-server@3.11.0" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
       warning "webpack-dev-server > webpack-dev-middleware@3.7.2" has unmet peer dependency "webpack@^4.0.0".
       [4/4] Building fresh packages...
       Done in 29.74s.
       
-----> Build
       
-----> Pruning devDependencies
       yarn install v1.22.10
       [1/4] Resolving packages...
       [2/4] Fetching packages...
       info fsevents@2.1.3: The platform "linux" is incompatible with this module.
       info "fsevents@2.1.3" is an optional dependency and failed compatibility check. Excluding it from installation.
       info fsevents@1.2.13: The platform "linux" is incompatible with this module.
       info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
       [3/4] Linking dependencies...
       warning " > @babel/preset-react@7.12.7" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-display-name@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx@7.12.7" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx-development@7.12.7" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx-self@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx-source@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-pure-annotations@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx > @babel/plugin-syntax-jsx@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning " > webpack-dev-server@3.11.0" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
       warning "webpack-dev-server > webpack-dev-middleware@3.7.2" has unmet peer dependency "webpack@^4.0.0".
       [4/4] Building fresh packages...
       warning Ignored scripts due to flag.
       Done in 5.82s.
       
-----> Caching build
       - yarn cache
       
-----> Build succeeded!
 !     This app may not specify any way to start a node process
       https://devcenter.heroku.com/articles/nodejs-support#default-web-process-type
 !     Unmet dependencies don't fail yarn install but may cause runtime issues
       https://github.com/npm/npm/issues/7494
-----> Ruby app detected
-----> Installing bundler 2.1.4
-----> Removing BUNDLED WITH version in the Gemfile.lock
-----> Compiling Ruby/Rails
-----> Using Ruby version: ruby-2.7.2
-----> Installing dependencies using bundler 2.1.4
       Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4
       The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
       Fetching gem metadata from https://rubygems.org/............
       Fetching rake 13.0.1
       Installing rake 13.0.1
       Fetching concurrent-ruby 1.1.7
       Fetching thread_safe 0.3.6
       Fetching minitest 5.14.2
       Installing thread_safe 0.3.6
       Installing minitest 5.14.2
       Installing concurrent-ruby 1.1.7
       Fetching zeitwerk 2.4.1
       Installing zeitwerk 2.4.1
       Fetching builder 3.2.4
       Fetching erubi 1.10.0
       Installing builder 3.2.4
       Installing erubi 1.10.0
       Fetching mini_portile2 2.4.0
       Fetching crass 1.0.6
       Installing mini_portile2 2.4.0
       Installing crass 1.0.6
       Fetching rack 2.2.3
       Installing rack 2.2.3
       Fetching nio4r 2.5.4
       Installing nio4r 2.5.4 with native extensions
       Fetching websocket-extensions 0.1.5
       Installing websocket-extensions 0.1.5
       Fetching mimemagic 0.3.5
       Fetching mini_mime 1.0.2
       Installing mini_mime 1.0.2
       Installing mimemagic 0.3.5
       Fetching msgpack 1.3.3
       Installing msgpack 1.3.3 with native extensions
       Using bundler 2.1.4
       Fetching ffi 1.13.1
       Installing ffi 1.13.1 with native extensions
       Fetching method_source 1.0.0
       Installing method_source 1.0.0
       Fetching pg 1.2.3
       Installing pg 1.2.3 with native extensions
       Fetching thor 1.0.1
       Installing thor 1.0.1
       Fetching tilt 2.0.10
       Installing tilt 2.0.10
       Fetching turbolinks-source 5.2.0
       Installing turbolinks-source 5.2.0
       Fetching tzinfo 1.2.8
       Installing tzinfo 1.2.8
       Fetching nokogiri 1.10.10
       Installing nokogiri 1.10.10 with native extensions
       Fetching i18n 1.8.5
       Installing i18n 1.8.5
       Fetching rack-test 1.1.0
       Installing rack-test 1.1.0
       Fetching rack-proxy 0.6.5
       Installing rack-proxy 0.6.5
       Fetching sprockets 4.0.2
       Installing sprockets 4.0.2
       Fetching websocket-driver 0.7.3
       Installing websocket-driver 0.7.3 with native extensions
       Fetching mail 2.7.1
       Installing mail 2.7.1
       Fetching marcel 0.3.3
       Installing marcel 0.3.3
       Fetching puma 4.3.6
       Installing puma 4.3.6 with native extensions
       Fetching bootsnap 1.5.1
       Installing bootsnap 1.5.1 with native extensions
       Fetching turbolinks 5.2.1
       Installing turbolinks 5.2.1
       Fetching sassc 2.4.0
       Installing sassc 2.4.0 with native extensions
       Fetching activesupport 6.0.3.4
       Installing activesupport 6.0.3.4
       Fetching loofah 2.7.0
       Installing loofah 2.7.0
       Fetching rails-dom-testing 2.0.3
       Installing rails-dom-testing 2.0.3
       Fetching globalid 0.4.2
       Installing globalid 0.4.2
       Fetching activemodel 6.0.3.4
       Installing activemodel 6.0.3.4
       Fetching jbuilder 2.10.1
       Installing jbuilder 2.10.1
       Fetching rails-html-sanitizer 1.3.0
       Installing rails-html-sanitizer 1.3.0
       Fetching activejob 6.0.3.4
       Fetching activerecord 6.0.3.4
       Installing activejob 6.0.3.4
       Installing activerecord 6.0.3.4
       Fetching actionview 6.0.3.4
       Installing actionview 6.0.3.4
       Fetching actionpack 6.0.3.4
       Installing actionpack 6.0.3.4
       Fetching actioncable 6.0.3.4
       Installing actioncable 6.0.3.4
       Fetching actionmailer 6.0.3.4
       Installing actionmailer 6.0.3.4
       Fetching railties 6.0.3.4
       Fetching sprockets-rails 3.2.2
       Installing sprockets-rails 3.2.2
       Installing railties 6.0.3.4
       Fetching activestorage 6.0.3.4
       Installing activestorage 6.0.3.4
       Fetching actionmailbox 6.0.3.4
       Installing actionmailbox 6.0.3.4
       Fetching actiontext 6.0.3.4
       Installing actiontext 6.0.3.4
       Fetching rails 6.0.3.4
       Fetching webpacker 4.3.0
       Installing rails 6.0.3.4
       Installing webpacker 4.3.0
       Fetching sassc-rails 2.1.2
       Installing sassc-rails 2.1.2
       Fetching sass-rails 6.0.0
       Installing sass-rails 6.0.0
       Bundle complete! 12 Gemfile dependencies, 57 gems now installed.
       Gems in the groups development and test were not installed.
       Bundled gems are installed into `./vendor/bundle`
       Post-install message from i18n:
       
       HEADS UP! i18n 1.1 changed fallbacks to exclude default locale.
       But that may break your application.
       
       If you are upgrading your Rails application from an older version of Rails:
       
       Please check your Rails app for 'config.i18n.fallbacks = true'.
       If you're using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be
       'config.i18n.fallbacks = [I18n.default_locale]'.
       If not, fallbacks will be broken in your app by I18n 1.1.x.
       
       If you are starting a NEW Rails application, you can ignore this notice.
       
       For more info see:
       https://github.com/svenfuchs/i18n/releases/tag/v1.1.0
       
       Bundle completed (208.33s)
       Cleaning up the bundler cache.
-----> Detecting rake tasks
-----> Preparing app for Rails asset pipeline
       Running: rake assets:precompile
       yarn install v1.22.10
       [1/4] Resolving packages...
       [2/4] Fetching packages...
       info fsevents@2.1.3: The platform "linux" is incompatible with this module.
       info "fsevents@2.1.3" is an optional dependency and failed compatibility check. Excluding it from installation.
       info fsevents@1.2.13: The platform "linux" is incompatible with this module.
       info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
       [3/4] Linking dependencies...
       warning " > @babel/preset-react@7.12.7" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-display-name@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx@7.12.7" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx-development@7.12.7" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx-self@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx-source@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-pure-annotations@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning "@babel/preset-react > @babel/plugin-transform-react-jsx > @babel/plugin-syntax-jsx@7.12.1" has unmet peer dependency "@babel/core@^7.0.0-0".
       warning " > webpack-dev-server@3.11.0" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
       warning "webpack-dev-server > webpack-dev-middleware@3.7.2" has unmet peer dependency "webpack@^4.0.0".
       [4/4] Building fresh packages...
       Done in 29.50s.
       I, [2020-11-25T12:02:13.452090 #3686]  INFO -- : Writing /tmp/build_6728f1b1/public/assets/manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js
       I, [2020-11-25T12:02:13.452388 #3686]  INFO -- : Writing /tmp/build_6728f1b1/public/assets/manifest-b4bf6e57a53c2bdb55b8998cc94cd00883793c1c37c5e5aea3ef6749b4f6d92b.js.gz
       I, [2020-11-25T12:02:13.452661 #3686]  INFO -- : Writing /tmp/build_6728f1b1/public/assets/application-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css
       I, [2020-11-25T12:02:13.452831 #3686]  INFO -- : Writing /tmp/build_6728f1b1/public/assets/application-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css.gz
       I, [2020-11-25T12:02:13.453156 #3686]  INFO -- : Writing /tmp/build_6728f1b1/public/assets/home-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css
       I, [2020-11-25T12:02:13.453335 #3686]  INFO -- : Writing /tmp/build_6728f1b1/public/assets/home-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css.gz
       webpack binstubs not found.
       Have you run rails webpacker:install ?
       Make sure the bin directory or binstubs are not included in .gitignore
       Exiting!
 !
 !     Precompiling assets failed.
 !
 !     Push rejected, failed to compile Ruby app.
 !     Push failed

SOLVED

Turns out bin/ is ignored by default in Rails. Oddly enough, I still can’t find the code which ignores bin/ for git; it doesn’t look like it’s in the main .gitignore

However, if you run

git add -f bin/webpack && git push heroku master # or main

everything should build.