[英]How to deploy node app that uses grunt to heroku
我正在使用grunt和grunt插件,如grunt-contrib-copy
, grunt-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.json
的scripts
屬性中配置。 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.json
的dependency
,以便Heroku安裝它。 在devDependencies
它們是不夠的,因為Heroku不會安裝它們。 另外,請注意Heroku不會將其安裝為全局包,因此要在Heroku上執行它,您將不得不使用相對路徑(如上所述)。 如果這不起作用(您可能需要稍微改變相對路徑),那么您可能需要考慮為Heroku編寫自己的自定義構建包 。
從0.4開始, grunt
包不再包含grunt
二進制文件,它現在是grunt-cli
包的一部分。 答案已更新,以反映這一點。
當Heroku Platorm API slug
和release
功能進入主線時,看起來很可能會解決這個問題。 此時,您可以在本地(或在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。
確保你的package.json中本地安裝了grunt和grunt-cli,即使grunt告訴你全局安裝cli:$: npm i -S grunt grunt-cli
在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.