web-dev-qa-db-ja.com

gruntをherokuに使用するノードアプリをデプロイする方法

私はgruntを使用しており、grunt-contrib-copygrunt-contrib-mincss(アプリケーションのnpm依存関係としてリストされている)などのgruntプラグインも使用しています。

また、生成されたすべてのファイルがあるnpm_modulesフォルダーとpublicフォルダーもコミットしません。そして、サーバーを展開してセットアップした後、アプリをビルドする方法がわかりません(grunt buildコマンドがあります)(publicフォルダーを既に探しています)。

grunt-heroku-deployのようなものを見ましたが、アップロードする前にコミットするのは悪い考えのようです。たぶんいくつかの穏やかな決定があります...何か考えはありますか?

58
ValeriiVasin

npmは、あなたが探しているものであるかもしれないpostinstallステップ(他の多くのものの中で)をサポートしています。

Node.js herokuビルドパックは、herokuにプッシュしてビルドの依存関係を解決するときにこのコマンドを実行します。

$ 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コマンドが実行されない場合は、エラー出力を確認してください。
  • gruntおよびgrunt-cliは、package.jsondependencyとしてリストする必要があるため、Herokuによってインストールされます。 Herokuはそれらをインストールしないため、devDependenciesの下にリストするだけでは不十分です。また、Herokuはグローバルパッケージとしてインストールしないため、Herokuで実行するには相対パスを使用する必要があります(上記で構成したとおり)。

これが機能しない場合(おそらく相対パスを少し調整する必要があるでしょう)、 Herokuの独自のカスタムビルドパック の作成を検討することをお勧めします。

更新

0.4以降、gruntパッケージにはgruntバイナリが含まれなくなりました。これはgrunt-cliパッケージの一部になりました。これを反映して回答が更新されました。

85
smithclay

これは、Heroku Platorm APIのslugおよびrelease機能がメインラインに組み込まれたときに、大部分が解決されるようです。その時点で、ローカルで(またはciサーバーで)コードをビルドし、パッケージ化し、API呼び出しを介してherokuに送信し、そこからリリースできます。

これはまだベータ期間であり、2013年12月19日にのみ発表されました。

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

生成されたコードをgitまたはNPMのポストインストールフックにチェックインして、何人の人が大丈夫だと思われるかについて、私は決して幸せではありませんでした。 :(

さらに、哲学的なスタンスから、リリース中にビルドを行うことは、別の潜在的な障害ポイントです。


楽しみのためだけに:それはまだ確定していないので、ここに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
24
Mark G.

Grunt(など)はビルドツールであり、(実際に)パッケージ化して運用環境で実行するものではありません。別のアプローチは、ビルドされたファイルをHerokuにプッシュする前に、Gruntを使用してプロジェクトをローカルに(またはCIサーバー上で)準備することです。すでに述べたように、Herokuはnpm installプッシュ後のアプリで、最終的にアプリを準備するのに十分なはずです。

Grunt派生/構築されたHerokuアプリが、メインアプリのソースコードリポジトリとはまったく別のGitリポジトリに存在するように設定しました。そのため、grunt deploy関連ファイルを最適化してHerokuリポジトリにコピーし、整理します(git add -Aなど)、その後git Push heroku master(または何でも)。

ライブサーバーがビルド済みのアプリパッケージの実行のみを担当している場合、懸念事項が明確に分離されているように見えます。

もちろん、YMMV、および上記の受け入れられた答えも完全に有効です。特に、Herokuのような十分に理解され安定したライブ環境では有効です。

23
Jed Richards

Heroku buildpack は私には問題ありません。素晴らしいもの。

6
ValeriiVasin

これをgrunt 4.0で動作させるには、こちらの指示に従いました https://discussion.heroku.com/t/grunt-on-heroku/98/2 私がしなければならなかった唯一の変更は、unixスタイルのスラッシュを使用するとウィンドウで失敗し、その逆も同様であるため、うなり声へのパスを削除することでした。 NPMはnode_modules/.binフォルダーでうなり声を探すので、幸いにもパスを指定する必要はありません https://npmjs.org/doc/scripts.html#path

  1. gruntからcliをグローバルにインストールするように指示されている場合でも、package.jsonにgruntとgrunt-cliの両方がローカルにインストールされていることを確認してください:$:npm i -S grunt grunt-cli

  2. 次のようなpostinstallステップをpackage.jsonに追加します:"postinstall": "grunt prod"

2
rob

このチュートリアルをご覧ください: https://medium.com/p/c227cb1ddc56 。カスタムビルドパックを使用して、HerokuにGruntアプリをデプロイする方法を説明します。

1
Bruno

この投稿はRails固有ですが、なぜバックエンドフレームワークでそれを使用できず、Ruby buildpackを使用しているものと入れ替えるだけです。

解決策は、基本的にマルチビルドパックを使用し、Node/Gruntビルドパックを実行することですgrunt build Herokuであなたのために。

重要なことは、このソリューションではビルドアーティファクトをバージョン管理にチェックインしないことです。(はい!!!)

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

0
Jason Swett

Npm postinstallステップは、おそらくgruntをそこから呼び出すことができるため、おそらく最良のオプションです。ただし、 heroku-buildpack-nodejs-grunt などのカスタムビルドパックもチェックアウトする必要があります。

0
Dan Kohn