我使用grunt创建了一个静态单页网站。我现在正尝试使用节点grunt的heroku-buildpack-nodejs-grunt将其部署到heroku。
下面是我的根目录的图片:
这是我的Gruntfile package.json:
Procfile
:
web: node index.html
当我运行$ git push heroku master
时,它会转到Gruntfile
并失败:
-----> Found Gruntfile, running grunt heroku:production task
>> Local Npm module "grunt-contrib-uglify" not found. Is it installed?
以上错误继续列出未找到的所有本地NPM模块。如果我列出所有loadNpmTasks而不是使用“load-grunt-tasks”,我会得到完全相同的错误。
当我$ heroku logs
时,我得到了:
Starting process with command `node web.js`
Error: Cannot find module '/app/web.js'
谁能看到我出错的地方?
答案 0 :(得分:3)
对于路过这里的人来说,我无法解决问题。这就是我要去的地方:
在我的Gruntfile中,我将npm模块从devDependencies移动到依赖项。然后Heroku能够安装这些依赖项。
但是,当Heroku运行任务时,它会在haml任务中停止错误“你需要安装Ruby和Haml并在你的PATH中完成这项任务”。添加红宝石和haml到Gruntfile,因为引擎不起作用。
答案 1 :(得分:2)
我唯一能想到的是,也许Heroku首先安装你的devDependencies
,尝试运行Grunt,但由于它还没有安装load-grunt-tasks
,你没有得到{{} 1}}行(grunt.loadNpmTasks( 'grunt-contrib-uglify' );
为你做的),因此Grunt找不到包。
您可以尝试更改load-grunt-tasks
以使用Gruntfile
方法明确列出所有npm模块吗?
修改强>
记得我必须要做的另一件事:
grunt.loadNpmTasks()
(显然用您的Heroku应用名称替换heroku labs:enable user-env-compile -a myapp
heroku config:set NODE_ENV=production
。)
这使得Heroku允许用户设置环境变量,然后将服务器设置为myapp
。试试这个,并设置你原来的production
和dependencies
(只是为了看看它是否有效)。
答案 2 :(得分:2)
我来这里比赛的时间已经很晚了,但我已经使用了几种方法,并且认为我会分享。
这不是我最喜欢的方法,因为它可能需要很长时间,但无论如何它都在这里。
Heroku在收到您推送的更改时会运行npm install --production
。这只会安装生产依赖项。
您不必更改环境变量来安装dev依赖项。 npm install
有--dev
switch允许您这样做。
npm install --dev
Heroku提供了一篇关于如何customize your build的文章。实际上,您可以在package.json中将上述命令作为postinstall
脚本运行。
"scripts": {
"start": "node index.js",
"postinstall": "npm install --dev && grunt build"
}
我认为这比在我的生产部分中放置dev依赖项或来回更改环境变量以使我的依赖项构建更清晰。
另外,我没有使用Procfile。 Heroku可以通过调用npm start
运行您的应用程序(至少它可以在OP之后差不多两年)。因此,只要您提供该脚本(如上所示),Heroku应该能够启动您的应用程序。
至于你的ruby依赖项,我还没有尝试在Heroku上的节点应用程序中安装ruby gem,但this SO answer建议您使用multi buildpack。
有些人认为让Heroku构建你的应用程序是不好的形式。他们建议您应该推高所有依赖项。如果您像我一样并且讨厌检查node_modules
目录,那么您可以创建一个新分支,强制添加node_modules
目录,然后部署该分支。在git中,这看起来像:
git checkout -b deploy
git add -f node_modules/
git commit -m "heroku deploy"
git push heroku --force deploy:master
git checkout master
git branch -D deploy
你显然可以将它变成一个脚本,这样你就不必每次都输入它。
这是我最喜欢的部署方式。 Heroku增加了对slug deploys的支持。上一个链接是一个很好的阅读,我强烈推荐它。我在Travis-CI的自动构建中执行此操作。我有一些自定义脚本来tar我的应用程序并将slu push推送到Heroku及其快速。
答案 3 :(得分:0)
我遇到了类似的问题,Heroku 没有安装我所有的依赖项,而我在本地没有问题。我通过运行修复它
function ImportJSON(url, query, parseOptions) {
return ImportJSONAdvanced(url, null, query, parseOptions, includeXPath_, defaultTransform_);
}
function ImportJSONAdvanced(url, fetchOptions, query, parseOptions, includeFunc, transformFunc) {
var jsondata = UrlFetchApp.fetch(url, fetchOptions);
var object = JSON.parse(jsondata.getContentText());
return parseJSONObject_(object, query, parseOptions, includeFunc, transformFunc);
}
进入我部署项目的路径。这会指示 Heroku 使用 npm install 而不是 npm ci 来安装您的依赖项,这是默认的!来自 Heroku 开发中心:
"Heroku 使用锁文件,无论是 package-lock.json 还是 yarn.lock,来安装预期的依赖树,所以一定要检查这些文件到 git 中以确保跨环境的依赖版本相同。如果你正在使用npm,Heroku 将使用 npm ci 来设置构建环境。"