【问题标题】:How to deploy node app that uses grunt to heroku如何将使用 grunt 的节点应用程序部署到 heroku
【发布时间】:2012-11-26 21:37:48
【问题描述】:

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

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

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

【问题讨论】:

    标签: node.js heroku npm gruntjs


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 有趣的想法!允许在依赖项和 devDependencies 之间保持清晰的分离,尽管我不确定需要单独的 repo 的缺点是否值得。 (可能是主仓库中的“master-deploy”branch 之类的!)
    • 我不确定需要单独的 repo 有很多缺点。它只会链接到 heroku 遥控器,不需要太多设置。你甚至可以将它 .gitignore'd 保存在你的主项目目录等中。我想说这比用一个带有编译/派生代码的奇怪的额外分支污染你的主仓库更好。
    • 这种方法+1 - 在本地运行 grunt 任务,构建到一个单独的 git repo 文件夹(例如dist)。然后使用grunt-build-control 之类的东西将dist 中的repo 推送到Heroku。这样,就没有开发文件被推送到 Heroku。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      当您推送到 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.json 中列为 dependency,以便由 Heroku 安装。在devDependencies 下列出它们是不够的,因为 Heroku 不会安装它们。另外请注意,Heroku 不会将其安装为全局包,因此要在 Heroku 上执行它,您将不得不使用相对路径(正如上面配置的那样)。

      如果这不起作用(您可能需要稍微调整一下相对路径),那么您可能需要考虑编写 your own custom buildpack for Heroku

      更新

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

      【讨论】:

      • 我对此的想法已经有了一些变化。虽然您可以在部署 node.js 包时运行 grunt,但这通常不是最佳实践。如果您将优化后的(grunt 生成的)Javascript 代码部署到您的生产环境而不是即时执行它会更干净。下面描述的 slug 方法基本上实现了这一点。
      • 技术上正确,但仍然是个坏主意。 Wintamute 的回答是一个更好的主意,它可以让您更清楚地分离关注点,例如开发构建与生产构建的不同之处。
      • Heroku 现在有一个使用 Grunt 的指南:devcenter.heroku.com/articles/node-with-grunt
      【解决方案4】:

      当 Heroku Platorm API slugrelease 功能进入主线时,这看起来将在很大程度上得到解决。此时,您可以在本地(或在 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
      

      【讨论】:

      • 很棒的脚本,第一次调用 git branch -D 可能实际上返回“错误:找不到分支'部署'。”并退出脚本。
      • 好点@Andy - 我认为第一行的git branch | grep deploy &amp;&amp; git branch -D deploy 可能是一个很好的改进。
      【解决方案5】:

      为了在 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"

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-04-09
            • 2015-11-06
            • 2021-07-07
            • 2015-02-28
            • 2016-07-13
            • 2014-08-21
            • 2017-06-09
            相关资源
            最近更新 更多