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

Val*_*sin 58 heroku node.js npm gruntjs

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

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

我看到了类似的东西grunt-heroku-deploy,但在上传之前提交我似乎是一个坏主意.也许有一些温和的决定......有什么想法吗?

smi*_*lay 85

npm支持postinstall你可能正在寻找的一个步骤(以及许多其他步骤).

当您推送到heroku以解析构建依赖项时,node.js heroku buildpack会运行此命令:

$ npm install --production
Run Code Online (Sandbox Code Playgroud)

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

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

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

{
  ...
  "scripts": {
    "postinstall": "echo postinstall time; ./node_modules/grunt-cli/bin/grunt <your task name>"
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

重要提示:

  • 您可能必须在postinstall脚本中更改grunt二进制文件的路径,如果grunt命令未执行,请检查错误输出.
  • grunt并且grunt-cli必须dependency在您的列表中列出,package.json因此它由Heroku安装.列出它们devDependencies是不够的,因为Heroku不会安装它们.另外,请注意Heroku不会将其安装为全局包,因此要在Heroku上执行它,您将不得不使用相对路径(如上所述).

如果这不起作用(您可能需要稍微改变相对路径),那么您可能需要考虑为Heroku编写自己的自定义构建包.

更新

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

  • 我对此的想法有所改变.虽然您*可以*在部署node.js包时运行grunt,但它通常不是最佳实践.如果您将优化后的(grunt生成的)Javascript代码部署到您的生产环境而不是即时执行它,那就更清晰了.下面描述的段塞方法基本上实现了这一点. (2认同)
  • Heroku现在有一个使用Grunt的指南:https://devcenter.heroku.com/articles/node-with-grunt (2认同)

Mar*_* G. 24

看起来,当Heroku Platorm API slugrelease功能进入主线时,它将在很大程度上得到解决.此时,您可以在本地(或在ci服务器上)构建代码,将其打包并通过API调用将其发送到heroku并从那里发布.

这仍处于测试阶段,仅在2013年12月19日公布.

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

对于将生成的代码签入git或NPM postinstall挂钩,有多少人似乎没问题,我从来都不高兴.:(

除了哲学立场之外,在发布期间进行构建只是另一个潜在的失败点.


只是为了好玩:既然还没有最终确定,这里是一个bash脚本我把它放在一起你可以暂时用来在部署分支上构建你的代码,提交它,将它部署到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
Run Code Online (Sandbox Code Playgroud)


Jed*_*rds 23

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

我已将其设置为使得Grunt派生/构建的Heroku应用程序存在于我的主应用程序源代码仓库中的完全独立的Git仓库中.因此,当我执行此操作时,grunt deploy它会优化并将相关文件复制到Heroku仓库,整理(git add -A等等)然后git push heroku master(或其他).

如果您的实时服务器仅负责运行预构建的应用程序包,那么这似乎是一种更清晰的关注点分离.

YMMV当然,以及上面接受的答案也是完全有效的......尤其是在像Heroku这样一个易于理解和稳定的现场环境中.

  • 这种方法的+1 - 在本地运行grunt任务,构建到一个文件夹(例如`dist`),这是一个单独的git repo.然后使用类似[grunt-build-control](https://github.com/robwierzbowski/grunt-build-control)的东西将`dist`中的repo推送到Heroku.这样,就没有将dev文件推送到Heroku. (3认同)

Val*_*sin 6

Heroku buildpack对我来说很好.好东西.