部署Angular 2应用程序到Heroku
在过去,我总是将我的Angular 1和Rails应用程序捆绑在一起,通常使用heroku,这对我来说非常有用。 现在我已经结束了Angular 2,我想分离出我的Angular和Rails代码。 我已经通过Angular-Cli创build了一个非常基础的Angular 2应用程序,但我还没有弄清楚如何将它部署到Heroku。 我没有使用expressjs或类似的东西。 任何人都知道了吗?
好吧,我想出了一个解决scheme。 我不得不添加一个非常基本的PHP后端,但它是相当无害的。 以下是我的过程。
首先设置一个heroku应用程序和Angular 2应用程序。
- 创build你的heroku应用程序
- 将heroku buildpack设置为heroku / php
heroku buildpacks:set heroku/php --app heroku-app-name
- 通过Angular-Cli创build一个项目
-
用下面的代码片段添加一个index.php文件到
/scr
<?php include_once("index.html"); ?>
-
使用下面的代码将一个Procfile添加到
/scr
web: vendor/bin/heroku-php-apache2
- 添加
/deploy
到.gitignore
现在我用了一个npm包来把tarballs推到heroku上
- 这里有一个简单的包来上传tar包, https://www.npmjs.com/package/heroku-deploy-tarball
-
npm i heroku-deploy-tarball --save
-
- 我也使用tar.gz来创buildtarball
-
npm i tar.gz --save
-
- 然后我用下面的代码在我的项目的根目录下创build了
deploy.js
文件。 我首先运行buildCommand指定,然后将index.php和configuration文件移动到dist文件夹。 然后,我打包整个dist文件夹,然后上传到heroku。
var deploy = require('heroku-deploy-tarball'); var targz = require('tar.gz'); var exec = require('child_process').exec; var requestedTarget = process.argv[2]; if (!requestedTarget) { console.log('You must specify a deploy target'); return; } var targets = { production: { app: 'heroku-app-name', tarball: 'deploy/build.tar.gz', buildCommand: 'ng build --prod' } } var moveCompressFiles = function (callback) { exec('cp ./src/index.php ./dist/index.php', function(err) { if(err) console.log(err); console.log('index.php was copied.'); }); exec('cp ./src/Procfile ./dist/Procfile', function(err) { if(err) console.log(err); console.log('Procfile was copied.'); }); new targz().compress('./dist', './deploy/build.tar.gz', function(err){ if(err) console.log(err); else callback(); console.log('The compression has ended!'); }); }; console.log('Starting ' + targets[requestedTarget].buildCommand); exec(targets[requestedTarget].buildCommand, {maxBuffer: 1024 * 500}, function(error) { if (!error) { console.log(targets[requestedTarget].buildCommand + ' successful!'); moveCompressFiles(function () { deploy(targets[requestedTarget]); }); } else { console.log(targets[requestedTarget].buildCommand + ' failed.', error); } });
- 现在只需运行
node deploy production
,它应该部署到heroku。
编辑
刚从heroku得到的消息是,他们正在研究一个实验性的buildpack,可以让这样的静态网站。 这是链接到构build包。