如何将使用grunt的节点应用程序部署到heroku

我正在使用grunt和grunt插件,如grunt-contrib-copygrunt-contrib-mincss (被列为我的应用程序的npm依赖项)。

另外我不提交npm_modules文件夹和public文件夹,其中所有生成的文件。 我无法弄清楚如何构build我的应用程序(我grunt build命令)后部署和安装我的服务器(它已经在寻找public文件夹)。

我看到一些像grunt-heroku-deploy这样的东西,但是在上传之前提交它似乎是一个坏主意。 也许有一些温和的决定…任何想法?

npm支持postinstall步骤(其中包括许多其他),可能正是你正在寻找的。

当您推送到heroku来parsing构build依赖项时,node.js heroku buildpack运行此命令:

 $ npm install --production 

https://devcenter.heroku.com/articles/nodejs-support#build-behavior

如果你看看npm文档,你可以设置一系列的脚本,在任何人运行npm install之前或之后运行。 它在package.jsonscripts属性中configuration。 scripts属性允许在包的生命周期中发生某些事情时运行自定义脚本(包括grunt )。

例如,要回显一些文本并在任何人(包括Heroku)运行npm install时运行grunt命令,请将此添加到您的package.json

 { ... "scripts": { "postinstall": "echo postinstall time; ./node_modules/grunt-cli/bin/grunt <your task name>" }, ... } 

https://npmjs.org/doc/scripts.html

重要提示:

  • 您可能需要将path更改为postinstall脚本中的grunt二进制文件,如果grunt命令没有执行,请检查错误输出。
  • gruntgrunt-cli必须被列为package.json一个dependency ,所以它被Heroku安装。 在devDependencies它们是不够的,因为Heroku不会安装这些。 另外,请注意,Heroku不会将其安装为全局包,因此要在Heroku上执行它,您将不得不使用相对path(如上面configuration)。

如果这不起作用(你可能需要摆弄一些相对的path),那么你可能要考虑编写你自己的Heroku自定义buildpack 。

更新

从0.4开始, grunt软件包不再包含grunt二进制文件,它现在是grunt-cli软件包的一部分。 答案已经更新,以反映这一点。

这看起来将在Heroku Platorm API slu and和releasefunction进入主线时得到很大的解决。 此时,您可以在本地(或在ci服务器上)构build您的代码,将其打包并通过API调用将其发送到heroku,然后从那里释放它。

目前仍处于testing阶段,仅在2013年12月19日公布。

https://devcenter.heroku.com/articles/platform-api-deploying-slugs

我从来没有感到非常高兴有多less人似乎检查到你的生成代码到git或NPM postinstall挂钩。 🙁

另外从哲学的angular度来看,在发布过程中进行构build只是另一个潜在的失败点。


只是为了好玩 :因为还没有最终确定,所以这里有一个我扔在一起的bash脚本 ,您可以暂时在部署分支上构build代码,提交它,将其部署到heroku,然后删除部署分支。 (我真的不是bash部署脚本的粉丝,所以我非常期待平台API的增加)

 #!/bin/bash set -e # Delete current deploy branch git branch -D deploy # Create new deploy branch based on master git checkout -b deploy # Grunt comands to build our site grunt build:production # the dist/ directory is in my .gitignore, so forcibly add it git add -f dist/ git commit -m "Deploying to Heroku" # Push it up to heroku, the -f ensures that heroku won't complain git push heroku -f deploy:master # Switch it back to master git checkout master 

Grunt(等)是一个构build工具,而不是(真的)你应该在生产中打包和运行的东西。 另一种方法是在将构build的文件推送到Heroku之前,使用Grunt在本地准备项目(或者更好地在CI服务器上)。 正如已经提到的,Heroku会在你的应用程序执行一个npm install程序,这应该足以让你最终准备好你的应用程序。

我已经build立了这样的Grunt派生/build立的Heroku应用程序生活在一个完全独立的Git回购我的主要应用程序源代码回购。 所以,当我做一个grunt deploy它优化和复制相关的文件到Heroku回购,整理它( git add -A等),然后git push heroku master (或其他)。

如果您的实时服务器只负责运行预先构build的应用程序包,这似乎是一个更清晰的关注点。

YMMV当然,上面所接受的答案也是完全有效的,特别是在像Heroku这样的良好理解和稳定的现场环境中。

Heroku buildpack适合我。 好东西。

为了使这个工作与grunt 4.0我按照这里的说明https://discussion.heroku.com/t/grunt-on-heroku/98/2 。 我必须做的唯一的改变是删除咕噜声的path,因为使用unix风格的斜杠会使它在Windows中失败,反之亦然。 幸运的是,您甚至不需要指定path,因为NPM将在node_modules / .bin文件夹中寻找grunt https://npmjs.org/doc/scripts.html#path

  1. 确保你在你的package.json中安装了grunt和grunt-cli,即使grunt告诉你要在全局安装cli:$: npm i -S grunt grunt-cli

  2. 在你的package.json中添加一个postinstall步骤,如下所示: "postinstall": "grunt prod"

看看这个教程: https : //medium.com/p/c227cb1ddc56 。 它解释了如何使用自定义的buildpack在Heroku上部署一个grunt应用程序。

npm postinstall步骤可能是你最好的select,因为你可以从那里调用grunt。 但是你也应该检查一下自定义的buildpack,比如heroku-buildpack-nodejs-grunt 。

这篇文章是特定于Rails的,但是我不明白为什么你不能在任何后端框架中使用它,只要将Ruby buildpack与你正在使用的任何东西交换。

该解决scheme基本上是使用多个grunt build包,并且让Node / Grunt grunt build包在Heroku上为您运行grunt build

重要的是,这个解决scheme不需要检查构build工件到版本控制中。 (好极了!!!)

http://www.angularonrails.com/deploy-angular-rails-single-page-application-heroku/