用于Node.js的Canvas在本地工作,但不在Heroku服务器上

我正在使用Node.js的canvas包 。

它在我的电脑上工作正常,但是当我把它上传到我的Heroku服务器时,它不起作用。 通过“正常工作”,我的意思是正确安装与npm install canvas和Node.js应用程序正常工作的canvas包。

但是,当我尝试上传到Heroku,并试图build立canvas包,我得到的错误:

 $ git push heroku master Counting objects: 4304, done. Delta compression using up to 2 threads. Compressing objects: 100% (4028/4028), done. Writing objects: 100% (4304/4304), 3.57 MiB | 606.00 KiB/s, done. Total 4304 (delta 737), reused 0 (delta 0) remote: Compressing source files... done. remote: Building source: remote: remote: -----> Using set buildpack heroku/nodejs remote: -----> Node.js app detected remote: remote: -----> Creating runtime environment remote: remote: NPM_CONFIG_LOGLEVEL=error remote: NPM_CONFIG_PRODUCTION=true remote: NODE_ENV=production remote: NODE_MODULES_CACHE=true remote: remote: -----> Installing binaries remote: engines.node (package.json): 5.6.0 remote: engines.npm (package.json): 3.7.2 remote: remote: Downloading and installing node 5.6.0... remote: Downloading and installing npm 3.7.2 (replacing version 3.6.0)... remote: remote: -----> Restoring cache remote: Skipping cache restore (new runtime signature) remote: remote: -----> Building dependencies remote: Prebuild detected (node_modules already exists) remote: Rebuilding any native modules remote: remote: > canvas@1.3.10 install /tmp/build_565c08c270a791191b278953392f5493/node_modules/canvas remote: > node-gyp rebuild remote: remote: make: Entering directory `/tmp/build_565c08c270a791191b278953392f5493/node_modules/canvas/build' remote: SOLINK_MODULE(target) Release/obj.target/canvas-postbuild.node remote: COPY Release/canvas-postbuild.node remote: CXX(target) Release/obj.target/canvas/src/Canvas.o remote: CXX(target) Release/obj.target/canvas/src/CanvasGradient.o remote: CXX(target) Release/obj.target/canvas/src/CanvasPattern.o remote: In file included from ../src/CanvasPattern.cc:9:0: remote: ../src/Image.h:19:21: fatal error: gif_lib.h: No such file or directory remote: #include <gif_lib.h> remote: ^ remote: compilation terminated. remote: make: *** [Release/obj.target/canvas/src/CanvasPattern.o] Error 1 remote: make: Leaving directory `/tmp/build_565c08c270a791191b278953392f5493/node_modules/canvas/build' remote: gyp ERR! build error remote: gyp ERR! stack Error: `make` failed with exit code: 2 remote: gyp ERR! stack at ChildProcess.onExit (/tmp/build_565c08c270a791191b278953392f5493/.heroku/node/lib/node_modules/npm/node_module s/node-gyp/lib/build.js:276:23) remote: gyp ERR! stack at emitTwo (events.js:100:13) remote: gyp ERR! stack at ChildProcess.emit (events.js:185:7) remote: gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12) remote: gyp ERR! System Linux 3.13.0-71-generic remote: gyp ERR! command "/tmp/build_565c08c270a791191b278953392f5493/.heroku/node/bin/node" "/tmp/build_565c08c270a791191b278953392f5493/.h eroku/node/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" remote: gyp ERR! cwd /tmp/build_565c08c270a791191b278953392f5493/node_modules/canvas remote: gyp ERR! node -v v5.6.0 remote: gyp ERR! node-gyp -v v3.2.1 remote: gyp ERR! not ok remote: remote: npm ERR! Linux 3.13.0-71-generic remote: npm ERR! argv "/tmp/build_565c08c270a791191b278953392f5493/.heroku/node/bin/node" "/tmp/build_565c08c270a791191b278953392f5493/.hero ku/node/bin/npm" "rebuild" remote: npm ERR! node v5.6.0 remote: npm ERR! npm v3.7.2 remote: npm ERR! code ELIFECYCLE remote: npm ERR! canvas@1.3.10 install: `node-gyp rebuild` remote: npm ERR! Exit status 1 remote: npm ERR! remote: npm ERR! Failed at the canvas@1.3.10 install script 'node-gyp rebuild'. remote: npm ERR! Make sure you have the latest version of node.js and npm installed. remote: npm ERR! If you do, this is most likely a problem with the canvas package, remote: npm ERR! not with npm itself. remote: npm ERR! Tell the author that this fails on your system: remote: npm ERR! node-gyp rebuild remote: npm ERR! You can get information on how to open an issue for this project with: remote: npm ERR! npm bugs canvas remote: npm ERR! Or if that isn't available, you can get their info via: remote: npm ERR! npm owner ls canvas remote: npm ERR! There is likely additional logging output above. remote: remote: npm ERR! Please include the following file with any support request: remote: npm ERR! /tmp/build_565c08c270a791191b278953392f5493/npm-debug.log remote: remote: -----> Build failed remote: remote: We're sorry this build is failing! You can troubleshoot common issues here: remote: https://devcenter.heroku.com/articles/troubleshooting-node-deploys remote: remote: Some possible problems: remote: remote: - node_modules checked into source control remote: https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git remote: remote: Love, remote: Heroku remote: remote: remote: ! Push rejected, failed to compile Node.js app remote: remote: Verifying deploy... remote: remote: ! Push rejected to colladraw. remote: To https://git.heroku.com/colladraw.git ! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to 'https://git.heroku.com/colladraw.git' 

错误是特别在这些行中:

 In file included from ../src/CanvasPattern.cc:9:0: remote: ../src/Image.h:19:21: fatal error: gif_lib.h: No such file or directory remote: #include <gif_lib.h> remote: ^ remote: compilation terminated. 

但是,我的系统中不存在这些问题。 我从这个问题的其他问题的解决办法,例如这个问题和这个问题 。 问题是这两个都是为本地机器,他们不被推送到服务器,因此我无法修复Heroku上的问题。

可能的解决scheme

看起来Heroku正在尝试按照以下方式自行重新构build所有的包:

 remote: -----> Building dependencies remote: Prebuild detected (node_modules already exists) remote: Rebuilding any native modules 

我猜如果它不重新build立node_modules ,只是使用我的电脑(这是工作),那么它也可以在服务器上工作。 有没有办法阻止它自动重build?

可能的解决scheme

Heroku允许你运行一次性的dynos ,比如heroku run bash 。 这将打开一个连接到服务器的bash客户端。

我在想,也许我可以直接在Heroku服务器上执行关于这个问题的其他问题的解决scheme。 但是,它们的限制性很强,不允许使用sudo访问,也不允许apt-get install 。 有什么办法可以绕过这个吗?

随意提供更多的想法。 感谢任何解决scheme。

node-canvas取决于Cairo ,一个用C语言编写的graphics库。开发必须安装在你试图部署的任何服务器上。

如果你想部署到Heroku,你可能不得不使用自定义生成包。 有关于如何做到这一点的示例文档: https : //github.com/Automattic/node-canvas/wiki/Installation-on-Heroku