2014-04-03 110 views
0

你好railites和jsheads,最簡單的方法Rails應用程序

我是一個Ruby的傢伙,漂亮的新節點的事情,但我學習,到目前爲止,我真的很喜歡它。我在heroku上開發了一週左右的rails應用程序,並且(當然)需求已經發展。

我需要能夠從我的Rails應用程序中使用pdfkit,一個用於創建PDF的節點庫。

最終,我是在完成這個最簡單的方法之後。這是我迄今爲止嘗試過的:

從heroku文檔here,我知道heroku rails應用程序帶有節點js運行時,但似乎npm不包括在內,我找不到明顯的方法要求pdfkit。

所以我跟着這個blog的領先優勢,採用ddollar的多buildpack:

heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git 

這裏有段形成相關的文件(讓我知道如果我失去了一些東西;))

。 buildpack

https://github.com/heroku/heroku-buildpack-nodejs 
https://github.com/heroku/heroku-buildpack-ruby 

的package.json

{ 
    "name": "MoneyMaker", 
    "version": "0.0.1", 
    "dependencies": { 
    "pdfkit": "0.5.2" 
    }, 
    "repository": { 
    "type" : "git", 
    "url" : "https://github.com/mattwalters/example.git" 
    } 
} 

的Gemfile:

... 
gem 'execjs' 
... 

test.js

// Generated by CoffeeScript 1.7.1 
(function() { 
    var PDFDocument, doc, fs; 
    fs = require("fs"); 
    PDFDocument = require('pdfkit'); 
    doc = new PDFDocument; 
    doc.pipe(fs.createWriteStream('output.pdf')); 
    doc.addPage().fontSize(25).text('Here is some vector graphics...', 100, 100); 
    doc.save().moveTo(100, 150).lineTo(100, 250).lineTo(200, 250).fill("#FF3300"); 
    doc.scale(0.6).translate(470, -380).path('M 250,75 L 323,301 131,161 369,161 177,301 z').fill('red', 'even-odd').restore(); 
    doc.addPage().fillColor("blue").text('Here is a link!', 100, 100).underline(100, 100, 160, 27, { 
    color: "#0000FF" 
    }).link(100, 100, 160, 27, 'http://google.com/'); 
    doc.end(); 
}).call(this) 

注意我做了檢查node_modules到源代碼控制。 我把所有這一切的Heroku,並試圖手動調用test.js與execjs:

matt$ heroku run rails c 
heroku-irb> ExecJS.eval(File.open('test.js').read) 

我得到folloring錯誤:

ExecJS::ProgramError: TypeError: undefined is not a function 
    from /app/vendor/bundle/ruby/2.1.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:68:in `extract_result' 
    from /app/vendor/bundle/ruby/2.1.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:28:in `block in exec' 
    from /app/vendor/bundle/ruby/2.1.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:41:in `compile_to_tempfile' 
    from /app/vendor/bundle/ruby/2.1.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:27:in `exec' 
    from /app/vendor/bundle/ruby/2.1.0/gems/execjs-2.0.2/lib/execjs/external_runtime.rb:19:in `eval' 
    from /app/vendor/bundle/ruby/2.1.0/gems/execjs-2.0.2/lib/execjs/runtime.rb:40:in `eval' 
    from /app/vendor/bundle/ruby/2.1.0/gems/execjs-2.0.2/lib/execjs/module.rb:23:in `eval' 
    from (irb):3 
    from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.0.2/lib/rails/commands/console.rb:90:in `start' 
    from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.0.2/lib/rails/commands/console.rb:9:in `start' 
    from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.0.2/lib/rails/commands.rb:62:in `<top (required)>' 
    from /app/bin/rails:4:in `require' 
    from /app/bin/rails:4:in `<main>' 

我試圖簡化和只運行:

heroku - irb> ExecJS.eval("require('pdfkit')") 

但我得到了同樣的錯誤。當涉及到execjs時,我想我錯過了一些非常重要的東西。任何人都可以啓發我嗎?

然後我想看看我是否可以直接從節點調用test.js。注意這可以在我的本地開發環境中使用。

matt$ heroku run bash 
heroku$ node test.js 

,但我得到:

node.js:134 
     throw e; // process.nextTick error, or 'error' event on first tick 
     ^
Error: Cannot find module 'zlib' 
    at Function._resolveFilename (module.js:320:11) 
    at Function._load (module.js:266:25) 
    at require (module.js:348:19) 
    at Object.<anonymous> (/app/node_modules/pdfkit/js/reference.js:12:10) 
    at Object.<anonymous> (/app/node_modules/pdfkit/js/reference.js:101:4) 
    at Module._compile (module.js:404:26) 
    at Object..js (module.js:410:10) 
    at Module.load (module.js:336:31) 
    at Function._load (module.js:297:12) 
    at require (module.js:348:19) 

所以現在我要把我的手,並希望社會各界的智慧可以幫助我。如果您需要更多信息,請告訴我。

非常感謝, 馬特

回答

1

所以問題是,默認buildpack自動安裝一個版本的節點,如果你的應用程序依賴於execjs。不幸的是,這是一個非常舊的節點版本 - 0.4.7 - 與我需要使用的節點庫不兼容。

我的解決方案是分叉heroku的buildpack並修補add_node_js_binary方法從不安裝節點二進制文件。只要您的多buildpack配置包含一個節點發行版,就可以工作。看看這裏:

https://github.com/mattwalters/heroku-buildpack-ruby/blob/master/lib/language_pack/ruby.rb

+0

真棒,我有這個確切的問題。正如您所說,/ app/bin首先位於環境PATH變量中,它具有節點0.4.7,而PATH後面的另一個目錄具有在package.json中指定的節點版本。超級討厭 - 去分叉你的回購,並開心。謝謝! – Cymen

+0

非常歡迎! –

+0

順便說一句,我仍然有麻煩使ExecJS行爲....看到我這裏的問題在這裏:http://stackoverflow.com/q/22852086/1396827 有任何想法嗎? –

相關問題