From f8a2860408aaa3bd65b3ca9da84529af1ba08acc Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Thu, 4 May 2017 23:47:37 +0200 Subject: [PATCH] build: script to build demo-app for firebase (#4330) * build: script to build demo-app for firebase * Adds a new gulp task that can be used to build the devapp in "deploy"-mode. This allows us to deploy the demo-app on firebase. Fixes #3857 * Add firebase deploy task --- firebase.json | 8 ++------ tools/gulp/tasks/development.ts | 32 +++++++++++++++++++++++++++++++- tools/gulp/util/copy-files.ts | 12 ++++++++++++ tools/gulp/util/package-build.ts | 13 ++----------- 4 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 tools/gulp/util/copy-files.ts diff --git a/firebase.json b/firebase.json index fff3ac5bec0..07d20283b88 100644 --- a/firebase.json +++ b/firebase.json @@ -3,7 +3,7 @@ "source": "tools/screenshot-test/functions" }, "hosting": { - "public": "dist", + "public": "dist/packages/demo-app", "rewrites": [ { "source": "/**/!(*.@(js|ts|html|css|json|svg|png|jpg|jpeg))", @@ -22,11 +22,7 @@ } ], "ignore": [ - "firebase.json", - "**/.*", - "**/node_modules/**", - "tmp", - "deploy" + "firebase.json" ] } } diff --git a/tools/gulp/tasks/development.ts b/tools/gulp/tasks/development.ts index bd2f4890efa..5af9e24d711 100644 --- a/tools/gulp/tasks/development.ts +++ b/tools/gulp/tasks/development.ts @@ -1,14 +1,26 @@ import {task, watch} from 'gulp'; -import {DIST_ROOT, SOURCE_ROOT} from '../constants'; +import {DIST_ROOT, SOURCE_ROOT, PROJECT_ROOT, DIST_BUNDLES, DIST_MATERIAL} from '../constants'; import { sassBuildTask, tsBuildTask, copyTask, buildAppTask, sequenceTask, triggerLivereload, serverTask } from '../util/task_helpers'; import {join} from 'path'; +import {copyFiles} from '../util/copy-files'; + +// These imports don't have any typings provided. +const firebaseTools = require('firebase-tools'); const appDir = join(SOURCE_ROOT, 'demo-app'); const outDir = join(DIST_ROOT, 'packages', 'demo-app'); +/** Array of vendors that are required to serve the demo-app. */ +const appVendors = [ + '@angular', 'systemjs', 'zone.js', 'rxjs', 'hammerjs', 'core-js', 'web-animations-js' +]; + +/** Glob that matches all required vendors for the demo-app. */ +const vendorGlob = `+(${appVendors.join('|')})/**/*.+(html|css|js|map)`; + task(':watch:devapp', () => { watch(join(appDir, '**/*.ts'), [':build:devapp:ts', triggerLivereload]); watch(join(appDir, '**/*.scss'), [':build:devapp:scss', triggerLivereload]); @@ -28,3 +40,21 @@ task(':serve:devapp', serverTask(outDir, true)); task('serve:devapp', ['build:devapp'], sequenceTask( [':serve:devapp', 'material:watch', ':watch:devapp'] )); + +/** Task that copies all vendors into the demo-app package. Allows hosting the app on firebase. */ +task('stage-deploy:devapp', ['build:devapp'], () => { + copyFiles(join(PROJECT_ROOT, 'node_modules'), vendorGlob, join(outDir, 'node_modules')); + copyFiles(DIST_BUNDLES, '*.+(js|map)', join(outDir, 'dist/bundles')); + copyFiles(DIST_MATERIAL, '**/prebuilt/*.+(css|map)', join(outDir, 'dist/packages/material')); +}); + +/** + * Task that deploys the demo-app to Firebase. Firebase project will be the one that is + * set for project directory using the Firebase CLI. + */ +task('deploy:devapp', ['stage-deploy:devapp'], () => { + return firebaseTools.deploy({cwd: PROJECT_ROOT, only: 'hosting'}) + // Firebase tools opens a persistent websocket connection and the process will never exit. + .then(() => { console.log('Successfully deployed the demo-app to firebase'); process.exit(0); }) + .catch((err: any) => { console.log(err); process.exit(1); }); +}); diff --git a/tools/gulp/util/copy-files.ts b/tools/gulp/util/copy-files.ts new file mode 100644 index 00000000000..48412d3ef9b --- /dev/null +++ b/tools/gulp/util/copy-files.ts @@ -0,0 +1,12 @@ +import {sync as glob} from 'glob'; +import {mkdirpSync, copySync} from 'fs-extra'; +import {join, dirname} from 'path'; + +/** Function to copy files that match a glob to another directory. */ +export function copyFiles(fromPath: string, fileGlob: string, outDir: string) { + glob(fileGlob, {cwd: fromPath}).forEach(filePath => { + let fileDestPath = join(outDir, filePath); + mkdirpSync(dirname(fileDestPath)); + copySync(join(fromPath, filePath), fileDestPath); + }); +} diff --git a/tools/gulp/util/package-build.ts b/tools/gulp/util/package-build.ts index c4b0b97c153..24804897eb9 100644 --- a/tools/gulp/util/package-build.ts +++ b/tools/gulp/util/package-build.ts @@ -4,13 +4,12 @@ import {inlineMetadataResources} from './inline-resources'; import {transpileFile} from './ts-compiler'; import {ScriptTarget, ModuleKind} from 'typescript'; import {sync as glob} from 'glob'; -import { - writeFileSync, copySync, mkdirpSync, readFileSync -} from 'fs-extra'; +import {writeFileSync, readFileSync} from 'fs-extra'; import { DIST_BUNDLES, DIST_ROOT, SOURCE_ROOT, PROJECT_ROOT, LICENSE_BANNER, MATERIAL_VERSION } from '../constants'; import {addPureAnnotations} from './annotate-pure'; +import {copyFiles} from './copy-files'; // There are no type definitions available for these imports. const uglify = require('uglify-js'); @@ -107,14 +106,6 @@ function uglifyFile(inputPath: string, outputPath: string) { writeFileSync(sourcemapOut, result.map); } -function copyFiles(fromPath: string, fileGlob: string, outDir: string) { - glob(fileGlob, {cwd: fromPath}).forEach(filePath => { - let fileDestPath = join(outDir, filePath); - mkdirpSync(dirname(fileDestPath)); - copySync(join(fromPath, filePath), fileDestPath); - }); -} - /** Updates the `package.json` file of the specified package. Replaces the version placeholder. */ function updatePackageVersion(packageDir: string) { let packagePath = join(packageDir, 'package.json');