gruntjs - webapp - yeoman vue
aplicaciĆ³n web yeoman con grunt-connect-proxy no funciona (6)
He instalado el generador de aplicaciones web yeoman y estoy tratando de configurar un proxy para otro servidor.
Instalé el proxy con lo siguiente. npm instala grunt-connect-proxy --save-dev
Cuando ejecuto el servidor de grunt, muestra
Running "configureProxies" task
Proxy created for: /people to localhost:3000
Luego me dirige a una página que se ejecuta en localhost: 9000 que dice "No se puede OBTENER /". Hay un servidor ejecutándose en localhost: 3000 y he intentado con otros dominios sin éxito.
Aquí está mi Gruntfile.js
// Generated on 2013-10-01 using generator-webapp 0.4.2
''use strict'';
var proxySnippet = require(''grunt-connect-proxy/lib/utils'').proxyRequest;
// # Globbing
// for performance reasons we''re only matching one level down:
// ''test/spec/{,*/}*.js''
// use this if you want to recursively match all subfolders:
// ''test/spec/**/*.js''
module.exports = function (grunt) {
// show elapsed time at the end
require(''time-grunt'')(grunt);
// load all grunt tasks
require(''load-grunt-tasks'')(grunt);
// configurable paths
var yeomanConfig = {
app: ''app'',
dist: ''dist''
};
grunt.initConfig({
yeoman: yeomanConfig,
watch: {
coffee: {
files: [''<%= yeoman.app %>/scripts/{,*/}*.coffee''],
tasks: [''coffee:dist'']
},
coffeeTest: {
files: [''test/spec/{,*/}*.coffee''],
tasks: [''coffee:test'']
},
compass: {
files: [''<%= yeoman.app %>/styles/{,*/}*.{scss,sass}''],
tasks: [''compass:server'', ''autoprefixer'']
},
styles: {
files: [''<%= yeoman.app %>/styles/{,*/}*.css''],
tasks: [''copy:styles'', ''autoprefixer'']
},
livereload: {
options: {
livereload: ''<%= connect.options.livereload %>''
},
files: [
''<%= yeoman.app %>/*.html'',
''.tmp/styles/{,*/}*.css'',
''{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js'',
''<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}''
]
}
},
connect: {
options: {
port: 9000,
livereload: 35729,
// change this to ''0.0.0.0'' to access the server from outside
hostname: ''localhost''
},
proxies: [
{
context: ''/people'',
host: ''localhost'',
port: 3000
}
],
livereload: {
options: {
open: true,
base: [
''.tmp'',
yeomanConfig.app
],
middleware: function (connect) {
return [
proxySnippet
];
}
}
},
test: {
options: {
base: [
''.tmp'',
''test'',
yeomanConfig.app
]
}
},
dist: {
options: {
open: true,
base: yeomanConfig.dist
}
}
},
clean: {
dist: {
files: [{
dot: true,
src: [
''.tmp'',
''<%= yeoman.dist %>/*'',
''!<%= yeoman.dist %>/.git*''
]
}]
},
server: ''.tmp''
},
jshint: {
options: {
jshintrc: ''.jshintrc''
},
all: [
''Gruntfile.js'',
''<%= yeoman.app %>/scripts/{,*/}*.js'',
''!<%= yeoman.app %>/scripts/vendor/*'',
''test/spec/{,*/}*.js''
]
},
mocha: {
all: {
options: {
run: true,
urls: [''http://<%= connect.test.options.hostname %>:<%= connect.test.options.port %>/index.html'']
}
}
},
coffee: {
dist: {
files: [{
expand: true,
cwd: ''<%= yeoman.app %>/scripts'',
src: ''{,*/}*.coffee'',
dest: ''.tmp/scripts'',
ext: ''.js''
}]
},
test: {
files: [{
expand: true,
cwd: ''test/spec'',
src: ''{,*/}*.coffee'',
dest: ''.tmp/spec'',
ext: ''.js''
}]
}
},
compass: {
options: {
sassDir: ''<%= yeoman.app %>/styles'',
cssDir: ''.tmp/styles'',
generatedImagesDir: ''.tmp/images/generated'',
imagesDir: ''<%= yeoman.app %>/images'',
javascriptsDir: ''<%= yeoman.app %>/scripts'',
fontsDir: ''<%= yeoman.app %>/styles/fonts'',
importPath: ''<%= yeoman.app %>/bower_components'',
httpImagesPath: ''/images'',
httpGeneratedImagesPath: ''/images/generated'',
httpFontsPath: ''/styles/fonts'',
relativeAssets: false
},
dist: {
options: {
generatedImagesDir: ''<%= yeoman.dist %>/images/generated''
}
},
server: {
options: {
debugInfo: true
}
}
},
autoprefixer: {
options: {
browsers: [''last 1 version'']
},
dist: {
files: [{
expand: true,
cwd: ''.tmp/styles/'',
src: ''{,*/}*.css'',
dest: ''.tmp/styles/''
}]
}
},
// not used since Uglify task does concat,
// but still available if needed
/*concat: {
dist: {}
},*/
requirejs: {
dist: {
// Options: https://github.com/jrburke/r.js/blob/master/build/example.build.js
options: {
// `name` and `out` is set by grunt-usemin
baseUrl: yeomanConfig.app + ''/scripts'',
optimize: ''none'',
// TODO: Figure out how to make sourcemaps work with grunt-usemin
// https://github.com/yeoman/grunt-usemin/issues/30
//generateSourceMaps: true,
// required to support SourceMaps
// http://requirejs.org/docs/errors.html#sourcemapcomments
preserveLicenseComments: false,
useStrict: true,
wrap: true
//uglify2: {} // https://github.com/mishoo/UglifyJS2
}
}
},
rev: {
dist: {
files: {
src: [
''<%= yeoman.dist %>/scripts/{,*/}*.js'',
''<%= yeoman.dist %>/styles/{,*/}*.css'',
''<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}'',
''<%= yeoman.dist %>/styles/fonts/{,*/}*.*''
]
}
}
},
useminPrepare: {
options: {
dest: ''<%= yeoman.dist %>''
},
html: ''<%= yeoman.app %>/index.html''
},
usemin: {
options: {
dirs: [''<%= yeoman.dist %>'']
},
html: [''<%= yeoman.dist %>/{,*/}*.html''],
css: [''<%= yeoman.dist %>/styles/{,*/}*.css'']
},
imagemin: {
dist: {
files: [{
expand: true,
cwd: ''<%= yeoman.app %>/images'',
src: ''{,*/}*.{png,jpg,jpeg}'',
dest: ''<%= yeoman.dist %>/images''
}]
}
},
svgmin: {
dist: {
files: [{
expand: true,
cwd: ''<%= yeoman.app %>/images'',
src: ''{,*/}*.svg'',
dest: ''<%= yeoman.dist %>/images''
}]
}
},
cssmin: {
// This task is pre-configured if you do not wish to use Usemin
// blocks for your CSS. By default, the Usemin block from your
// `index.html` will take care of minification, e.g.
//
// <!-- build:css({.tmp,app}) styles/main.css -->
//
// dist: {
// files: {
// ''<%= yeoman.dist %>/styles/main.css'': [
// ''.tmp/styles/{,*/}*.css'',
// ''<%= yeoman.app %>/styles/{,*/}*.css''
// ]
// }
// }
},
htmlmin: {
dist: {
options: {
/*removeCommentsFromCDATA: true,
// https://github.com/yeoman/grunt-usemin/issues/44
//collapseWhitespace: true,
collapseBooleanAttributes: true,
removeAttributeQuotes: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeOptionalTags: true*/
},
files: [{
expand: true,
cwd: ''<%= yeoman.app %>'',
src: ''*.html'',
dest: ''<%= yeoman.dist %>''
}]
}
},
// Put files not handled in other tasks here
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: ''<%= yeoman.app %>'',
dest: ''<%= yeoman.dist %>'',
src: [
''*.{ico,png,txt}'',
''.htaccess'',
''images/{,*/}*.{webp,gif}'',
''styles/fonts/{,*/}*.*'',
''bower_components/sass-bootstrap/fonts/*.*''
]
}]
},
styles: {
expand: true,
dot: true,
cwd: ''<%= yeoman.app %>/styles'',
dest: ''.tmp/styles/'',
src: ''{,*/}*.css''
}
},
modernizr: {
devFile: ''<%= yeoman.app %>/bower_components/modernizr/modernizr.js'',
outputFile: ''<%= yeoman.dist %>/bower_components/modernizr/modernizr.js'',
files: [
''<%= yeoman.dist %>/scripts/{,*/}*.js'',
''<%= yeoman.dist %>/styles/{,*/}*.css'',
''!<%= yeoman.dist %>/scripts/vendor/*''
],
uglify: true
},
concurrent: {
server: [
''compass'',
''coffee:dist'',
''copy:styles''
],
test: [
''coffee'',
''copy:styles''
],
dist: [
''coffee'',
''compass'',
''copy:styles'',
''imagemin'',
''svgmin'',
''htmlmin''
]
},
bower: {
options: {
exclude: [''modernizr'']
},
all: {
rjsConfig: ''<%= yeoman.app %>/scripts/main.js''
}
}
});
grunt.registerTask(''server'', function (target) {
if (target === ''dist'') {
return grunt.task.run([''build'', ''connect:dist:keepalive'']);
}
grunt.task.run([
''clean:server'',
''configureProxies'',
''concurrent:server'',
''autoprefixer'',
''connect:livereload'',
''watch''
]);
});
grunt.registerTask(''test'', [
''clean:server'',
''concurrent:test'',
''autoprefixer'',
''connect:test'',
''mocha''
]);
grunt.registerTask(''build'', [
''clean:dist'',
''useminPrepare'',
''concurrent:dist'',
''autoprefixer'',
''requirejs'',
''concat'',
''cssmin'',
''uglify'',
''modernizr'',
''copy:dist'',
''rev'',
''usemin''
]);
grunt.registerTask(''default'', [
''jshint'',
''test'',
''build''
]);
};
EDITAR: aquí está mi último trabajo GruntFile
// Generated on 2013-10-06 using generator-webapp 0.4.3
''use strict'';
var proxySnippet = require(''grunt-connect-proxy/lib/utils'').proxyRequest;
var mountFolder = function (connect, dir) {
return connect.static(require(''path'').resolve(dir));
};
// # Globbing
// for performance reasons we''re only matching one level down:
// ''test/spec/{,*/}*.js''
// use this if you want to recursively match all subfolders:
// ''test/spec/**/*.js''
module.exports = function (grunt) {
// show elapsed time at the end
require(''time-grunt'')(grunt);
// load all grunt tasks
require(''load-grunt-tasks'')(grunt);
grunt.initConfig({
// configurable paths
yeoman: {
app: ''app'',
dist: ''dist''
},
watch: {
compass: {
files: [''<%= yeoman.app %>/styles/{,*/}*.{scss,sass}''],
tasks: [''compass:server'', ''autoprefixer'']
},
styles: {
files: [''<%= yeoman.app %>/styles/{,*/}*.css''],
tasks: [''copy:styles'', ''autoprefixer'']
},
livereload: {
options: {
livereload: ''<%= connect.options.livereload %>''
},
files: [
''<%= yeoman.app %>/*.html'',
''.tmp/styles/{,*/}*.css'',
''{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js'',
''<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}''
]
}
},
connect: {
options: {
port: 9000,
livereload: 35729,
// change this to ''0.0.0.0'' to access the server from outside
hostname: ''localhost''
},
proxies: [
{
context: ''/api'',
host: ''localhost'',
port: 4000,
https: false
}
],
livereload: {
options: {
open: true,
base: [
''.tmp'',
''<%= yeoman.app %>''
],
middleware: function (connect) {
return [
proxySnippet,
mountFolder(connect, ''.tmp''),
mountFolder(connect, ''app'')
];
}
}
},
test: {
options: {
base: [
''.tmp'',
''test'',
''<%= yeoman.app %>''
]
}
},
dist: {
options: {
open: true,
base: ''<%= yeoman.dist %>''
}
}
},
clean: {
dist: {
files: [{
dot: true,
src: [
''.tmp'',
''<%= yeoman.dist %>/*'',
''!<%= yeoman.dist %>/.git*''
]
}]
},
server: ''.tmp''
},
jshint: {
options: {
jshintrc: ''.jshintrc''
},
all: [
''Gruntfile.js'',
''<%= yeoman.app %>/scripts/{,*/}*.js'',
''!<%= yeoman.app %>/scripts/vendor/*'',
''test/spec/{,*/}*.js''
]
},
mocha: {
all: {
options: {
run: true,
urls: [''http://<%= connect.test.options.hostname %>:<%= connect.test.options.port %>/index.html'']
}
}
},
compass: {
options: {
sassDir: ''<%= yeoman.app %>/styles'',
cssDir: ''.tmp/styles'',
generatedImagesDir: ''.tmp/images/generated'',
imagesDir: ''<%= yeoman.app %>/images'',
javascriptsDir: ''<%= yeoman.app %>/scripts'',
fontsDir: ''<%= yeoman.app %>/styles/fonts'',
importPath: ''<%= yeoman.app %>/bower_components'',
httpImagesPath: ''/images'',
httpGeneratedImagesPath: ''/images/generated'',
httpFontsPath: ''/styles/fonts'',
relativeAssets: false,
assetCacheBuster: false
},
dist: {
options: {
generatedImagesDir: ''<%= yeoman.dist %>/images/generated''
}
},
server: {
options: {
debugInfo: true
}
}
},
autoprefixer: {
options: {
browsers: [''last 1 version'']
},
dist: {
files: [{
expand: true,
cwd: ''.tmp/styles/'',
src: ''{,*/}*.css'',
dest: ''.tmp/styles/''
}]
}
},
// not used since Uglify task does concat,
// but still available if needed
/*concat: {
dist: {}
},*/
requirejs: {
dist: {
// Options: https://github.com/jrburke/r.js/blob/master/build/example.build.js
options: {
// `name` and `out` is set by grunt-usemin
baseUrl: ''<%= yeoman.app %>/scripts'',
optimize: ''none'',
// TODO: Figure out how to make sourcemaps work with grunt-usemin
// https://github.com/yeoman/grunt-usemin/issues/30
//generateSourceMaps: true,
// required to support SourceMaps
// http://requirejs.org/docs/errors.html#sourcemapcomments
preserveLicenseComments: false,
useStrict: true,
wrap: true
//uglify2: {} // https://github.com/mishoo/UglifyJS2
}
}
},
rev: {
dist: {
files: {
src: [
''<%= yeoman.dist %>/scripts/{,*/}*.js'',
''<%= yeoman.dist %>/styles/{,*/}*.css'',
''<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}'',
''<%= yeoman.dist %>/styles/fonts/{,*/}*.*''
]
}
}
},
useminPrepare: {
options: {
dest: ''<%= yeoman.dist %>''
},
html: ''<%= yeoman.app %>/index.html''
},
usemin: {
options: {
dirs: [''<%= yeoman.dist %>'']
},
html: [''<%= yeoman.dist %>/{,*/}*.html''],
css: [''<%= yeoman.dist %>/styles/{,*/}*.css'']
},
imagemin: {
dist: {
files: [{
expand: true,
cwd: ''<%= yeoman.app %>/images'',
src: ''{,*/}*.{png,jpg,jpeg}'',
dest: ''<%= yeoman.dist %>/images''
}]
}
},
svgmin: {
dist: {
files: [{
expand: true,
cwd: ''<%= yeoman.app %>/images'',
src: ''{,*/}*.svg'',
dest: ''<%= yeoman.dist %>/images''
}]
}
},
cssmin: {
// This task is pre-configured if you do not wish to use Usemin
// blocks for your CSS. By default, the Usemin block from your
// `index.html` will take care of minification, e.g.
//
// <!-- build:css({.tmp,app}) styles/main.css -->
//
// dist: {
// files: {
// ''<%= yeoman.dist %>/styles/main.css'': [
// ''.tmp/styles/{,*/}*.css'',
// ''<%= yeoman.app %>/styles/{,*/}*.css''
// ]
// }
// }
},
htmlmin: {
dist: {
options: {
/*removeCommentsFromCDATA: true,
// https://github.com/yeoman/grunt-usemin/issues/44
//collapseWhitespace: true,
collapseBooleanAttributes: true,
removeAttributeQuotes: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeOptionalTags: true*/
},
files: [{
expand: true,
cwd: ''<%= yeoman.app %>'',
src: ''*.html'',
dest: ''<%= yeoman.dist %>''
}]
}
},
// Put files not handled in other tasks here
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: ''<%= yeoman.app %>'',
dest: ''<%= yeoman.dist %>'',
src: [
''*.{ico,png,txt}'',
''.htaccess'',
''images/{,*/}*.{webp,gif}'',
''styles/fonts/{,*/}*.*'',
''bower_components/sass-bootstrap/fonts/*.*'',
''templates/{,*/}*.*''
]
}]
},
styles: {
expand: true,
dot: true,
cwd: ''<%= yeoman.app %>/styles'',
dest: ''.tmp/styles/'',
src: ''{,*/}*.css''
}
},
concurrent: {
server: [
''compass'',
''copy:styles''
],
test: [
''copy:styles''
],
dist: [
''compass'',
''copy:styles'',
''imagemin'',
''svgmin'',
''htmlmin''
]
},
bower: {
options: {
exclude: [''modernizr'']
},
all: {
rjsConfig: ''<%= yeoman.app %>/scripts/main.js''
}
}
});
grunt.registerTask(''server'', function (target) {
if (target === ''dist'') {
return grunt.task.run([''build'', ''connect:dist:keepalive'']);
}
grunt.task.run([
''clean:server'',
''configureProxies'',
''concurrent:server'',
''autoprefixer'',
''connect:livereload'',
''watch''
]);
});
grunt.registerTask(''test'', [
''clean:server'',
''concurrent:test'',
''autoprefixer'',
''connect:test'',
''mocha''
]);
grunt.registerTask(''build'', [
''clean:dist'',
''useminPrepare'',
''concurrent:dist'',
''autoprefixer'',
''requirejs'',
''concat'',
''cssmin'',
''uglify'',
''copy:dist'',
''rev'',
''usemin''
]);
grunt.registerTask(''default'', [
''jshint'',
''test'',
''build''
]);
};
Cambie el objetivo de la carga de conexión en vivo de la siguiente manera:
livereload: {
options: {
open: true,
base: [
''.tmp'',
yeomanConfig.app
],
middleware: function (connect) {
return [
proxySnippet,
connect.static(require(''path'').resolve(''app'')),
connect.static(require(''path'').resolve(''.tmp''))
];
}
}
}
También deberá configurar el middleware en "prueba" para que el proxy funcione en casos de prueba funcional.
connect: {
proxies: [
{
context: ''/api'',
host: ''localhost'',
port: 8080,
https: false,
changeOrigin: false,
xforward: false
}
],
livereload: {
options: {
middleware: function (connect, options) {
if (!Array.isArray(options.base)) {
options.base = [options.base];
}
// Setup the proxy
var middlewares = [require(''grunt-connect-proxy/lib/utils'').proxyRequest];
// Serve static files.
options.base.forEach(function (base) {
middlewares.push(connect.static(base));
});
// Make directory browse-able.
var directory = options.directory || options.base[options.base.length - 1];
middlewares.push(connect.directory(directory));
return middlewares;
},
open: true,
base: [
''.tmp'',
''<%= yeoman.app %>''
]
}
},
test: {
options: {
middleware: function (connect, options) {
if (!Array.isArray(options.base)) {
options.base = [options.base];
}
// Setup the proxy
var middlewares = [require(''grunt-connect-proxy/lib/utils'').proxyRequest];
// Serve static files.
options.base.forEach(function (base) {
middlewares.push(connect.static(base));
});
// Make directory browse-able.
var directory = options.directory || options.base[options.base.length - 1];
middlewares.push(connect.directory(directory));
return middlewares;
},
port: 9001,
base: [
''.tmp'',
''test'',
''<%= yeoman.app %>''
]
}
}
}
grunt.registerTask(''e2e'', [
''clean:server'',
''concurrent:test'',
''autoprefixer'',
''configureProxies:server'',
''connect:test'',
''protractor:run''
]);
El enfoque anterior funciona, solo agrega una trampa que encontré.
Cuando proxy una solicitud como
proxies: [
{
context: ''/api'',
host: ''localhost'',
port: 8080,
https: false,
changeOrigin: false,
xforward: false
}
],
a continuación, localhost:9000/api/ping
enviará a localhost:8080/api/ping
, por lo que debería tener un extremo de escucha allí. No reescribe (como esperaba) localhost:8080/ping
básicamente eliminando el contexto. Si desea reescribir, debe especificarlo explícitamente.
proxies: [
context: ''/context'',
host: ''host'',
port: 8080,
rewrite: {
''^/removingcontext'': '''',
''^/changingcontext'': ''/anothercontext''
}
]
para yeoman-angular v <0.9.8
cambia tu objeto de conexión ronco para que se vea así
connect: {
options: {
port: 9000,
// Change this to ''0.0.0.0'' to access the server from outside.
hostname: ''localhost'',
livereload: 35729
},
proxies: [
{
context: ''/api'', // the context of the data service
host: ''localhost'', // wherever the data service is running
port: 80 // the port that the data service is running on
}
],
livereload: {
options: {
open: true,
middleware: function (connect) {
var middlewares = [];
// Setup the proxy
middlewares.push(require(''grunt-connect-proxy/lib/utils'').proxyRequest);
// Serve static files
middlewares.push(
connect.static(''.tmp''),
connect().use(
''/bower_components'',
connect.static(''./bower_components'')
),
connect.static(appConfig.app)
);
return middlewares;
}
}
},
...
// removed for brevity since there will be no changes on the test and dist objects
}
Esto funcionó para mí
livereload: {
options: {
open: true,
middleware: function (connect) {
return [
proxySnippet,
connect.static(''.tmp''),
connect().use(
''/bower_components'',
connect.static(''./bower_components'')
),
connect().use(
''/app/styles'',
connect.static(''./app/styles'')
),
connect.static(appConfig.app)
];
}
}
},
Este es todo mi gruntfile que funciona en una aplicación web ngular respaldada con servicios de mvc rest de primavera . Todos los cambios que escribí están anotados con "// RAG"
// Generated on 2015-08-12 using generator-angular 0.12.1
''use strict'';
// # Globbing
// for performance reasons we''re only matching one level down:
// ''test/spec/{,*/}*.js''
// use this if you want to recursively match all subfolders:
// ''test/spec/**/*.js''
module.exports = function (grunt) {
// Time how long tasks take. Can help when optimizing build times
require(''time-grunt'')(grunt);
// Automatically load required Grunt tasks
require(''jit-grunt'')(grunt, {
useminPrepare: ''grunt-usemin'',
ngtemplates: ''grunt-angular-templates'',
cdnify: ''grunt-google-cdn''
});
// Configurable paths for the application
var appConfig = {
app: require(''./bower.json'').appPath || ''app'',
dist: ''../../../target/webapp''
};
// Define the configuration for all the tasks
grunt.initConfig({
// Project settings
yeoman: appConfig,
// Watches files for changes and runs tasks based on the changed files
watch: {
bower: {
files: [''bower.json''],
tasks: [''wiredep'']
},
js: {
files: [''<%= yeoman.app %>/scripts/{,*/}*.js''],
tasks: [''newer:jshint:all''],
options: {
livereload: ''<%= connect.options.livereload %>''
}
},
jsTest: {
files: [''test/spec/{,*/}*.js''],
tasks: [''newer:jshint:test'', ''karma'']
},
compass: {
files: [''<%= yeoman.app %>/styles/{,*/}*.{scss,sass}''],
tasks: [''compass:server'', ''autoprefixer:server'']
},
gruntfile: {
files: [''Gruntfile.js'']
},
livereload: {
options: {
livereload: ''<%= connect.options.livereload %>''
},
files: [
''<%= yeoman.app %>/{,*/}*.html'',
''.tmp/styles/{,*/}*.css'',
''<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}''
]
}
},
// The actual grunt server settings
connect: {
options: {
port: 9000,
// Change this to ''0.0.0.0'' to access the server from outside.
hostname: ''localhost'',
livereload: 35729
},
//RAG
proxies: [
{
context: ''/ws'',
host: ''localhost'',
port: 8080,
//https: false,
//xforward: false,
//headers: {
// "x-custom-added-header": value
// },
//hideHeaders: [''x-removed-header''],
//rewrite: {
// ''^/ws'': ''''
//}
}
],
livereload: {
options: {
open: true,
//RAG
/*
middleware: function (connect) {
return [
connect.static(''.tmp''),
connect().use(
''/bower_components'',
connect.static(''./bower_components'')
),
connect().use(
''/app/styles'',
connect.static(''./app/styles'')
),
connect.static(appConfig.app)
];
}
*/
middleware: function (connect, options) {
var middlewares = [
connect.static(''.tmp''),
connect().use(
''/bower_components'',
connect.static(''./bower_components'')
),
connect().use(
''/app/styles'',
connect.static(''./app/styles'')
),
connect.static(appConfig.app)
];
if (!Array.isArray(options.base)) {
options.base = [options.base];
}
// Setup the proxy
middlewares.push(require(''grunt-connect-proxy/lib/utils'').proxyRequest);
// Serve static files
options.base.forEach(function(base) {
middlewares.push(connect.static(base));
});
return middlewares;
}
}
},
test: {
options: {
port: 9001,
middleware: function (connect) {
return [
connect.static(''.tmp''),
connect.static(''test''),
connect().use(
''/bower_components'',
connect.static(''./bower_components'')
),
connect.static(appConfig.app)
];
}
}
},
dist: {
options: {
open: true,
base: ''<%= yeoman.dist %>''
}
}
},
// Make sure code styles are up to par and there are no obvious mistakes
jshint: {
options: {
jshintrc: ''.jshintrc'',
reporter: require(''jshint-stylish'')
},
all: {
src: [
''Gruntfile.js'',
''<%= yeoman.app %>/scripts/{,*/}*.js''
]
},
test: {
options: {
jshintrc: ''test/.jshintrc''
},
src: [''test/spec/{,*/}*.js'']
}
},
// Empties folders to start fresh
clean: {
dist: {
files: [{
dot: true,
src: [
''.tmp'',
''<%= yeoman.dist %>/{,*/}*'',
''!<%= yeoman.dist %>/.git{,*/}*''
]
}]
},
server: ''.tmp''
},
// Add vendor prefixed styles
autoprefixer: {
options: {
browsers: [''last 1 version'']
},
server: {
options: {
map: true
},
files: [{
expand: true,
cwd: ''.tmp/styles/'',
src: ''{,*/}*.css'',
dest: ''.tmp/styles/''
}]
},
dist: {
files: [{
expand: true,
cwd: ''.tmp/styles/'',
src: ''{,*/}*.css'',
dest: ''.tmp/styles/''
}]
}
},
// Automatically inject Bower components into the app
wiredep: {
app: {
src: [''<%= yeoman.app %>/index.html''],
ignorePath: //././//
},
test: {
devDependencies: true,
src: ''<%= karma.unit.configFile %>'',
ignorePath: //././//,
fileTypes:{
js: {
block: /(([/s/t]*)//{2}/s*?bower:/s*?(/S*))(/n|/r|.)*?(//{2}/s*endbower)/gi,
detect: {
js: /''(.*/.js)''/gi
},
replace: {
js: ''/'{{filePath}}/',''
}
}
}
},
sass: {
src: [''<%= yeoman.app %>/styles/{,*/}*.{scss,sass}''],
ignorePath: /(/././/){1,2}bower_components///
}
},
// Compiles Sass to CSS and generates necessary files if requested
compass: {
options: {
sassDir: ''<%= yeoman.app %>/styles'',
cssDir: ''.tmp/styles'',
generatedImagesDir: ''.tmp/images/generated'',
imagesDir: ''<%= yeoman.app %>/images'',
javascriptsDir: ''<%= yeoman.app %>/scripts'',
fontsDir: ''<%= yeoman.app %>/styles/fonts'',
importPath: ''./bower_components'',
httpImagesPath: ''/images'',
httpGeneratedImagesPath: ''/images/generated'',
httpFontsPath: ''/styles/fonts'',
relativeAssets: false,
assetCacheBuster: false,
raw: ''Sass::Script::Number.precision = 10/n''
},
dist: {
options: {
generatedImagesDir: ''<%= yeoman.dist %>/images/generated''
}
},
server: {
options: {
sourcemap: true
}
}
},
// Renames files for browser caching purposes
filerev: {
dist: {
src: [
''<%= yeoman.dist %>/scripts/{,*/}*.js'',
''<%= yeoman.dist %>/styles/{,*/}*.css'',
''<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'',
''<%= yeoman.dist %>/styles/fonts/*''
]
}
},
// Reads HTML for usemin blocks to enable smart builds that automatically
// concat, minify and revision files. Creates configurations in memory so
// additional tasks can operate on them
useminPrepare: {
html: ''<%= yeoman.app %>/index.html'',
options: {
dest: ''<%= yeoman.dist %>'',
flow: {
html: {
steps: {
js: [''concat'', ''uglifyjs''],
css: [''cssmin'']
},
post: {}
}
}
}
},
// Performs rewrites based on filerev and the useminPrepare configuration
usemin: {
html: [''<%= yeoman.dist %>/{,*/}*.html''],
css: [''<%= yeoman.dist %>/styles/{,*/}*.css''],
js: [''<%= yeoman.dist %>/scripts/{,*/}*.js''],
options: {
assetsDirs: [
''<%= yeoman.dist %>'',
''<%= yeoman.dist %>/images'',
''<%= yeoman.dist %>/styles''
],
patterns: {
js: [[/(images//[^''''""]*/.(png|jpg|jpeg|gif|webp|svg))/g, ''Replacing references to images'']]
}
}
},
// The following *-min tasks will produce minified files in the dist folder
// By default, your `index.html`''s <!-- Usemin block --> will take care of
// minification. These next options are pre-configured if you do not wish
// to use the Usemin blocks.
// cssmin: {
// dist: {
// files: {
// ''<%= yeoman.dist %>/styles/main.css'': [
// ''.tmp/styles/{,*/}*.css''
// ]
// }
// }
// },
// uglify: {
// dist: {
// files: {
// ''<%= yeoman.dist %>/scripts/scripts.js'': [
// ''<%= yeoman.dist %>/scripts/scripts.js''
// ]
// }
// }
// },
// concat: {
// dist: {}
// },
imagemin: {
dist: {
files: [{
expand: true,
cwd: ''<%= yeoman.app %>/images'',
src: ''{,*/}*.{png,jpg,jpeg,gif}'',
dest: ''<%= yeoman.dist %>/images''
}]
}
},
svgmin: {
dist: {
files: [{
expand: true,
cwd: ''<%= yeoman.app %>/images'',
src: ''{,*/}*.svg'',
dest: ''<%= yeoman.dist %>/images''
}]
}
},
htmlmin: {
dist: {
options: {
collapseWhitespace: true,
conservativeCollapse: true,
collapseBooleanAttributes: true,
removeCommentsFromCDATA: true
},
files: [{
expand: true,
cwd: ''<%= yeoman.dist %>'',
src: [''*.html''],
dest: ''<%= yeoman.dist %>''
}]
}
},
ngtemplates: {
dist: {
options: {
module: ''mainApp'',
htmlmin: ''<%= htmlmin.dist.options %>'',
usemin: ''scripts/scripts.js''
},
cwd: ''<%= yeoman.app %>'',
src: ''views/{,*/}*.html'',
dest: ''.tmp/templateCache.js''
}
},
// ng-annotate tries to make the code safe for minification automatically
// by using the Angular long form for dependency injection.
ngAnnotate: {
dist: {
files: [{
expand: true,
cwd: ''.tmp/concat/scripts'',
src: ''*.js'',
dest: ''.tmp/concat/scripts''
}]
}
},
// Replace Google CDN references
cdnify: {
dist: {
html: [''<%= yeoman.dist %>/*.html'']
}
},
// Copies remaining files to places other tasks can use
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: ''<%= yeoman.app %>'',
dest: ''<%= yeoman.dist %>'',
src: [
''*.{ico,png,txt}'',
''.htaccess'',
''*.html'',
''images/{,*/}*.{webp}'',
''styles/fonts/{,*/}*.*''
]
}, {
expand: true,
cwd: ''.tmp/images'',
dest: ''<%= yeoman.dist %>/images'',
src: [''generated/*'']
}, {
expand: true,
cwd: ''.'',
src: ''bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*'',
dest: ''<%= yeoman.dist %>''
}]
},
styles: {
expand: true,
cwd: ''<%= yeoman.app %>/styles'',
dest: ''.tmp/styles/'',
src: ''{,*/}*.css''
}
},
// Run some tasks in parallel to speed up the build process
concurrent: {
server: [
''compass:server''
],
test: [
''compass''
],
dist: [
''compass:dist'',
''imagemin'',
''svgmin''
]
},
// Test settings
karma: {
unit: {
configFile: ''test/karma.conf.js'',
singleRun: true
}
}
});
grunt.loadNpmTasks(''grunt-connect-proxy''); //RAG
grunt.registerTask(''serve'', ''Compile then start a connect web server'', function (target) {
if (target === ''dist'') {
return grunt.task.run([''build'', ''connect:dist:keepalive'']);
}
grunt.task.run([
''clean:server'',
''wiredep'',
''concurrent:server'',
''autoprefixer:server'',
''configureProxies:server'', // RAG
''connect:livereload'',
''watch''
]);
});
grunt.registerTask(''server'', ''DEPRECATED TASK. Use the "serve" task instead'', function (target) {
grunt.log.warn(''The `server` task has been deprecated. Use `grunt serve` to start a server.'');
grunt.task.run([''serve:'' + target]);
});
grunt.registerTask(''test'', [
''clean:server'',
''wiredep'',
''concurrent:test'',
''autoprefixer'',
''connect:test'',
''karma''
]);
grunt.registerTask(''build'', [
''clean:dist'',
''wiredep'',
''useminPrepare'',
''concurrent:dist'',
''autoprefixer'',
''ngtemplates'',
''concat'',
''ngAnnotate'',
''copy:dist'',
''cdnify'',
''cssmin'',
''uglify'',
''filerev'',
''usemin'',
''htmlmin''
]);
grunt.registerTask(''default'', [
''newer:jshint'',
''test'',
''build''
]);
};