簡體   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