58

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

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

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

4

7 回答 7

85

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

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

$ npm install --production

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>"
  },
  ...
}

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

重要警告:

  • 您可能必须更改脚本中 grunt 二进制文件的路径,如果命令未执行postinstall,请检查错误输出。grunt
  • grunt并且必须在您的grunt-cli列表中列为 a ,以便由 Heroku 安装。在下面列出它们是不够的,因为 Heroku 不会安装它们。另外,请注意 Heroku 不会将其安装为全局包,因此要在 Heroku 上执行它,您将不得不使用相对路径(正如上面配置的那样)。dependencypackage.jsondevDependencies

如果这不起作用(您可能需要稍微调整一下相对路径),那么您可能需要考虑为 Heroku 编写自己的自定义 buildpack

更新

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

于 2012-12-10T06:32:38.987 回答
24

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

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

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

我从来没有对有多少人可以将您生成的代码签入 git 或 NPM postinstall hook 感到非常满意。:(

另外,从哲学的角度来看,在发布期间进行构建只是另一个潜在的失败点。


只是为了好玩:由于这还没有最终确定,这是我放在一起的一个 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
于 2014-01-10T23:54:34.223 回答
23

Grunt(等人)是一个构建工具,而不是(真的)你应该打包并在生产环境中运行的东西。另一种方法是使用 Grunt 在本地准备项目(或者在 CI 服务器上更好),然后只将构建的文件推送到 Heroku。如前所述,Heroku 将npm install在您的应用程序推送后对其进行操作,这应该足以最终准备您的应用程序。

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

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

当然,YMMV,上面接受的答案也是完全有效的……尤其是在像 Heroku 这样易于理解且稳定的实时环境中。

于 2013-02-24T10:33:42.000 回答
6

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

于 2012-12-09T12:29:16.807 回答
2

为了让它与 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": "grunt prod"

于 2013-09-27T03:46:47.853 回答
0

npm postinstall 步骤可能是您最好的选择,因为您可以从那里调用 grunt。但是您还应该查看自定义构建包,例如heroku-buildpack-nodejs-grunt

于 2013-11-02T17:21:12.933 回答
0

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

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

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

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

于 2014-08-01T12:43:54.757 回答