middleman-imageoptim icon indicating copy to clipboard operation
middleman-imageoptim copied to clipboard

undefined method 'include?' for nil:Nilclass

Open hwhelchel opened this issue 8 years ago • 6 comments

I have a middleman site that I deploy to netlify.

When I try to use middleman-imageoptim in the build process, it breaks on netlify's server. With that said, I can get a build to successfully complete locally on my mac.

It appears to be mutating the sitemap somehow, causing middleman-inliner to fail

config.rb:

###
# Page options, layouts, aliases and proxies
###

# Per-page layout changes:
#
# With no layout
page '/*.xml', layout: false
page '/*.json', layout: false
page '/*.txt', layout: false

set :fonts_dir,  "fonts"

# With alternative layout
# page "/path/to/file.html", layout: :otherlayout

# Proxy pages (http://middlemanapp.com/basics/dynamic-pages/)
# proxy "/this-page-has-no-template.html", "/template-file.html", locals: {
#  which_fake_page: "Rendering a fake page with a local variable" }

# General configuration

# Reload the browser automatically whenever files change
activate :sprockets

require 'inline_svg/action_view/helpers'
InlineSvg.configure do |config|
  config.asset_finder = sprockets
end
helpers InlineSvg::ActionView::Helpers

if defined? RailsAssets
  RailsAssets.load_paths.each do |path|
    sprockets.append_path path
  end
end

configure :development do
  Slim::Engine.options[:pretty] = true
  activate :livereload
end

###
# Helpers
###

# Methods defined in the helpers block are available in templates
# helpers do
#   def some_helper
#     "Helping"
#   end
# end

# Build-specific configuration
activate :inliner
configure :build do
  activate :favicon_maker, :icons => {
    "_favicon_template.png" => [
      { icon: "apple-touch-icon-180x180-precomposed.png" },             # Same as apple-touch-icon-57x57.png, for iPhone 6 Plus with @3× display
      { icon: "apple-touch-icon-152x152-precomposed.png" },             # Same as apple-touch-icon-57x57.png, for retina iPad with iOS7.
      { icon: "apple-touch-icon-144x144-precomposed.png" },             # Same as apple-touch-icon-57x57.png, for retina iPad with iOS6 or prior.
      { icon: "apple-touch-icon-120x120-precomposed.png" },             # Same as apple-touch-icon-57x57.png, for retina iPhone with iOS7.
      { icon: "apple-touch-icon-114x114-precomposed.png" },             # Same as apple-touch-icon-57x57.png, for retina iPhone with iOS6 or prior.
      { icon: "apple-touch-icon-76x76-precomposed.png" },               # Same as apple-touch-icon-57x57.png, for non-retina iPad with iOS7.
      { icon: "apple-touch-icon-72x72-precomposed.png" },               # Same as apple-touch-icon-57x57.png, for non-retina iPad with iOS6 or prior.
      { icon: "apple-touch-icon-60x60-precomposed.png" },               # Same as apple-touch-icon-57x57.png, for non-retina iPhone with iOS7.
      { icon: "apple-touch-icon-57x57-precomposed.png" },               # iPhone and iPad users can turn web pages into icons on their home screen. Such link appears as a regular iOS native application. When this happens, the device looks for a specific picture. The 57x57 resolution is convenient for non-retina iPhone with iOS6 or prior. Learn more in Apple docs.
      { icon: "apple-touch-icon-precomposed.png", size: "57x57" },      # Same as apple-touch-icon.png, expect that is already have rounded corners (but neither drop shadow nor gloss effect).
      { icon: "apple-touch-icon.png", size: "57x57" },                  # Same as apple-touch-icon-57x57.png, for "default" requests, as some devices may look for this specific file. This picture may save some 404 errors in your HTTP logs. See Apple docs
      { icon: "favicon-196x196.png" },                                  # For Android Chrome M31+.
      { icon: "favicon-160x160.png" },                                  # For Opera Speed Dial (up to Opera 12; this icon is deprecated starting from Opera 15), although the optimal icon is not square but rather 256x160. If Opera is a major platform for you, you should create this icon yourself.
      { icon: "favicon-96x96.png" },                                    # For Google TV.
      { icon: "favicon-32x32.png" },                                    # For Safari on Mac OS.
      { icon: "favicon-16x16.png" },                                    # The classic favicon, displayed in the tabs.
      { icon: "favicon.png", size: "16x16" },                           # The classic favicon, displayed in the tabs.
      { icon: "favicon.ico", size: "64x64,32x32,24x24,16x16" },         # Used by IE, and also by some other browsers if we are not careful.
      { icon: "mstile-70x70.png", size: "70x70" },                      # For Windows 8 / IE11.
      { icon: "mstile-144x144.png", size: "144x144" },
      { icon: "mstile-150x150.png", size: "150x150" },
      { icon: "mstile-310x310.png", size: "310x310" },
      { icon: "mstile-310x150.png", size: "310x150" }
    ]
  }
  activate :directory_indexes # Pretty URLs
  activate :minify_css
  activate :minify_javascript
  activate :imageoptim do |options|
    options.manifest = true
    options.pngout = false
    options.svgo = false
  end
  activate :asset_hash # Enable cache buster
  activate :gzip
end

Stack Trace:

error build/demo/index.html
12:41:21 PM: undefined method `include?' for nil:NilClass
/opt/build/cache/bundle/ruby/2.3.0/bundler/gems/middleman-inliner-e57b7e1d47d6/lib/middleman-inliner.rb:12:in `block (2 levels) in inline_css'
/opt/build/cache/bundle/ruby/2.3.0/bundler/gems/middleman-inliner-e57b7e1d47d6/lib/middleman-inliner.rb:12:in `select'
/opt/build/cache/bundle/ruby/2.3.0/bundler/gems/middleman-inliner-e57b7e1d47d6/lib/middleman-inliner.rb:12:in `block in inline_css'
/opt/build/cache/bundle/ruby/2.3.0/bundler/gems/middleman-inliner-e57b7e1d47d6/lib/middleman-inliner.rb:10:in `map'
/opt/build/cache/bundle/ruby/2.3.0/bundler/gems/middleman-inliner-e57b7e1d47d6/lib/middleman-inliner.rb:10:in `inline_css'
layouts/layout.slim:41:in `block in singleton class'
layouts/layout.slim:-5:in `instance_eval'
layouts/layout.slim:-5:in `singleton class'
layouts/layout.slim:-7:in `__tilt_19116300'
/opt/build/cache/bundle/ruby/2.3.0/gems/tilt-2.0.6/lib/tilt/template.rb:161:in `call'
/opt/build/cache/bundle/ruby/2.3.0/gems/tilt-2.0.6/lib/tilt/template.rb:161:in `evaluate'
/opt/build/cache/bundle/ruby/2.3.0/gems/tilt-2.0.6/lib/tilt/template.rb:100:in `render'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/renderers/slim.rb:6:in `render'
/opt/build/cache/bundle/ruby/2.3.0/gems/padrino-helpers-0.13.3.3/lib/padrino/rendering.rb:17:in `render'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/file_renderer.rb:79:in `render'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_reference.rb:43:in `send_to'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/call_with.rb:76:in `call_with'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_handler.rb:138:in `block in redefine_method'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/template_renderer.rb:157:in `block in render'
/opt/build/cache/bundle/ruby/2.3.0/gems/activesupport-5.0.2/lib/active_support/notifications.rb:166:in `instrument'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/util.rb:21:in `instrument'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/template_renderer.rb:156:in `render'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_reference.rb:43:in `send_to'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/call_with.rb:76:in `call_with'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_handler.rb:138:in `block in redefine_method'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/sitemap/resource.rb:154:in `render'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_reference.rb:43:in `send_to'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/call_with.rb:76:in `call_with'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_handler.rb:138:in `block in redefine_method'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/rack.rb:112:in `process_request'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/rack.rb:66:in `block in call'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/rack.rb:65:in `catch'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/rack.rb:65:in `call'
/opt/build/cache/bundle/ruby/2.3.0/gems/rack-2.0.1/lib/rack/urlmap.rb:68:in `block in call'
/opt/build/cache/bundle/ruby/2.3.0/gems/rack-2.0.1/lib/rack/urlmap.rb:53:in `each'
/opt/build/cache/bundle/ruby/2.3.0/gems/rack-2.0.1/lib/rack/urlmap.rb:53:in `call'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/extensions/minify_javascript.rb:55:in `call'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/extensions/minify_css.rb:63:in `call'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/core_extensions/inline_url_rewriter.rb:74:in `call'
/opt/build/cache/bundle/ruby/2.3.0/gems/rack-2.0.1/lib/rack/head.rb:12:in `call'
/opt/build/cache/bundle/ruby/2.3.0/gems/rack-2.0.1/lib/rack/lint.rb:49:in `_call'
/opt/build/cache/bundle/ruby/2.3.0/gems/rack-2.0.1/lib/rack/lint.rb:37:in `call'
/opt/build/cache/bundle/ruby/2.3.0/gems/rack-2.0.1/lib/rack/builder.rb:153:in `call'
/opt/build/cache/bundle/ruby/2.3.0/gems/rack-2.0.1/lib/rack/mock.rb:74:in `request'
/opt/build/cache/bundle/ruby/2.3.0/gems/rack-2.0.1/lib/rack/mock.rb:56:in `get'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/builder.rb:232:in `block in output_resource'
/opt/build/cache/bundle/ruby/2.3.0/gems/activesupport-5.0.2/lib/active_support/notifications.rb:166:in `instrument'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/util.rb:21:in `instrument'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/builder.rb:225:in `output_resource'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_reference.rb:43:in `send_to'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/call_with.rb:76:in `call_with'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_handler.rb:138:in `block in redefine_method'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:482:in `call_with_index'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:453:in `process_incoming_jobs'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:435:in `block in worker'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:426:in `fork'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:426:in `worker'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:417:in `block in create_workers'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:416:in `each'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:416:in `each_with_index'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:416:in `create_workers'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:358:in `work_in_processes'
/opt/build/cache/bundle/ruby/2.3.0/gems/parallel-1.11.1/lib/parallel.rb:264:in `map'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/builder.rb:137:in `output_resources'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_reference.rb:43:in `send_to'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/call_with.rb:76:in `call_with'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_handler.rb:138:in `block in redefine_method'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/builder.rb:131:in `output_files'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_reference.rb:43:in `send_to'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/call_with.rb:76:in `call_with'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_handler.rb:138:in `block in redefine_method'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/builder.rb:71:in `block in run!'
/opt/build/cache/bundle/ruby/2.3.0/gems/activesupport-5.0.2/lib/active_support/notifications.rb:166:in `instrument'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/util.rb:21:in `instrument'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/builder.rb:70:in `run!'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_reference.rb:43:in `send_to'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/call_with.rb:76:in `call_with'
/opt/build/cache/bundle/ruby/2.3.0/gems/contracts-0.13.0/lib/contracts/method_handler.rb:138:in `block in redefine_method'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-cli-4.2.1/lib/middleman-cli/build.rb:80:in `block in build'
/opt/build/cache/bundle/ruby/2.3.0/gems/activesupport-5.0.2/lib/active_support/notifications.rb:166:in `instrument'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/util.rb:21:in `instrument'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-cli-4.2.1/lib/middleman-cli/build.rb:79:in `build'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/command.rb:27:in `run'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/invocation.rb:126:in `invoke_command'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/invocation.rb:133:in `block in invoke_all'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/invocation.rb:133:in `each'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/invocation.rb:133:in `map'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/invocation.rb:133:in `invoke_all'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/group.rb:232:in `dispatch'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/invocation.rb:115:in `invoke'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor.rb:40:in `block in register'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/command.rb:27:in `run'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/invocation.rb:126:in `invoke_command'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor.rb:369:in `dispatch'
/opt/build/cache/bundle/ruby/2.3.0/gems/thor-0.19.4/lib/thor/base.rb:444:in `start'
/opt/build/cache/bundle/ruby/2.3.0/gems/middleman-cli-4.2.1/bin/middleman:70:in `<top (required)>'
/opt/build/cache/bundle/ruby/2.3.0/bin/middleman:22:in `load'
/opt/build/cache/bundle/ruby/2.3.0/bin/middleman:22:in `<main>'

/cc @netlify @bdougie

hwhelchel avatar Mar 15 '17 17:03 hwhelchel

I am not familiar with this library but intrigued by it. @hwhelchel do you have a sample project I can look at and possibly assist in resolving your issue.

bdougie avatar Mar 15 '17 17:03 bdougie

@bdougie awesome, I just made a sample project:

https://github.com/hwhelchel/netlify-middleman-test

I've got it connected to netlify here

hwhelchel avatar Mar 16 '17 20:03 hwhelchel

Hey @hwhelchel I appreciate you providing this test project. I was able find out this is partially a Netlify thing. The reason your build works locally and not on Netlify is because our build containers don't have your specific Ruby version, 2.3.3 and I was able to confirm with Netlify's latest version 2.3.1 is getting the same error message locally as you pasted above.

I am not sure why a minor version has failures and another doesn't and not as familiar with this library in general. But I did run 2.3.3 and 2.4.0and they work locally just fine.

Can you send a support request to netlify.com/support asking to add a 2.4.0 citing this issue, please provide a link to this issue so we can test/create a docker image that includes 2.4.0.

I did get a different error on Netlify when I tried to 2.3.0:

9:24:36 PM: Gem bundle installed
9:24:37 PM: :image_optim is deprecated. Please use `:imageoptim` instead.
9:24:42 PM: ruby: string.c:1075: str_new_frozen: Assertion `!(!(((struct RBasic*)((shared)))->flags&(RUBY_FL_USER1)))' failed.
9:24:42 PM: /opt/build/build.sh: line 396: 13705 Aborted (core dumped) middleman build --verbose
9:24:43 PM: Cached ruby gems
9:24:46 PM: Cleaning up docker container
9:23:05 PM: Error running command: Build script returned non-zero exit code: 134
9:24:46 PM: Error running command: Build script returned non-zero exit code: 134
9:24:48 PM: Finished processing build request

You might want to research that version on Netlify for to see if you get that error too

bdougie avatar Mar 21 '17 04:03 bdougie

@bdougie thanks for digging into this. I've submitted the support request.

hwhelchel avatar Apr 23 '17 21:04 hwhelchel

Here's the list of currently supported Ruby versions on Netlify. This does include 2.3.3 and 2.4.0 :)

2.0.0-p247 2.1.2 2.2.1 2.2.3 2.3.0 2.3.1 2.3.3 2.4.0

And here's how to set it: you can pick a different version by adding a /.ruby-version file to your repository. It should include just one of those version strings.

nolessafool avatar Apr 24 '17 15:04 nolessafool

I have the same problem, but not only on Netlify (use .ruby-version 2.3.3 as in local) but also on my local machine..... It start as a warning: middleman build --verbose :image_optim is deprecated. Please use :imageoptim instead. But I request the gem with
gem "middleman-imageoptim", :git => "https://github.com/plasticine/middleman-imageoptim", :branch => "master"

and activate :imageoptim in config.rb

max-bertinetti avatar May 31 '17 08:05 max-bertinetti