【问题标题】:why cant bundler find wkhtmltopdf on server为什么捆绑器在服务器上找不到 wkhtmltopdf
【发布时间】:2015-09-07 01:26:02
【问题描述】:

我正在使用 pdfkit gem,它正在使用 wkhtmltopdf-binary gem 中的 wkhtmltopdf 进行开发。

在服务器上 pdfkit 失败并出现错误

undefined method `chomp' for nil:NilClass

shared/bundle/ruby/2.1.0/gems/pdfkit-0.8.2/lib/pdfkit/configuration.rb:22:in `wkhtmltopdf'

失败的方法是

def wkhtmltopdf
  @wkhtmltopdf ||= (defined?(Bundler::GemfileError) && File.exists?('Gemfile') ? `bundle exec which wkhtmltopdf` : `which wkhtmltopdf`).chomp
end

经过一些调试后,从该方法调用 `bundle exec which wkhtmltopdf' 似乎返回空白。

当从应用程序根目录中的命令行调用时,它会给出

/var/www/<app>/shared/bundle/ruby/2.1.0/bin/wkhtmltopdf

我已尝试从初始化程序初始化@wkhtmltopdf 的值,如下所示

PDFKit.configure do |config|
  if Rails.env.production?
    config.wkhtmltopdf = "/var/www/<app>/shared/bundle/ruby/2.1.0/bin/wkhtmltopdf"
  end 
  config.default_options = {
    :page_size => 'A4',
  }
end

但我仍然遇到同样的错误。即它仍在尝试运行“which”命令并以空白失败。

【问题讨论】:

    标签: ruby-on-rails ruby bundler wkhtmltopdf pdfkit


    【解决方案1】:

    bundle exec which wkhtmltopdf 返回nil,这是导致此错误的原因。

    有一个快速解决方法是在initializer 中重新定义方法

    require 'pdfkit'
    class PDFKit
      class Configuration
        def wkhtmltopdf
          @wkhtmltopdf ||= `which wkhtmltopdf`.chomp
        end
      end
    end
    

    你可以看一下表格here

    【讨论】:

    • 很好地发现了这个解决方法。我不得不对路径进行硬编码,而不是使用which wkhtmltopdf,因为这也会从 ruby​​ 代码中返回 nil。 (尽管在命令行上工作正常)。我想了解为什么会发生这种情况...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2011-05-27
    相关资源
    最近更新 更多