繁体   English   中英

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

[英]How to deploy node app that uses grunt to heroku

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

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

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

npm支持postinstall步骤(以及许多其他步骤),这可能正是您正在寻找的。

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

$ npm install --production

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

如果你看一下npm文档,你可以设置一系列脚本,在任何人为你的包运行npm install之前或之后运行。 它在package.jsonscripts属性中配置。 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

重要提示:

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

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

更新

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

当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

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

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

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

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

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

为了使用grunt 4.0,我按照https://discussion.heroku.com/t/grunt-on-heroku/98/2中的说明进行操作。 我必须做的唯一改变就是删除grunt的路径,因为使用unix样式的斜杠会使它在windows中失败,反之亦然。 幸运的是,您甚至不需要指定路径,因为NPM将在node_modules / .bin文件夹https://npmjs.org/doc/scripts.html#path中查找grunt。

  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 它解释了如何使用自定义构建包在Heroku上部署grunt应用程序。

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

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

解决方案基本上是使用多个grunt build包,并在Heroku上为您提供Node / Grunt buildpack运行grunt build

值得注意的是,此解决方案没有将构建工件检查到版本控制中。 (好极了!!!)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM