-
-
Save willmendesneto/904c99621cdf9730175b to your computer and use it in GitHub Desktop.
| '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' | |
| // OBS: | |
| // Replace the string with informations | |
| // '<%= yeoman.moduleName %>' = Module name | |
| // '<%= yeoman.moduleDescription %>' = Module description | |
| // '<%= yeoman.moduleUrl %>' = Module url | |
| module.exports = function (grunt) { | |
| // Load grunt tasks automatically | |
| require('load-grunt-tasks')(grunt); | |
| // Time how long tasks take. Can help when optimizing build times | |
| require('time-grunt')(grunt); | |
| // Define the configuration for all the tasks | |
| grunt.initConfig({ | |
| // Project settings | |
| yeoman: { | |
| // configurable paths | |
| app: require('./bower.json').appPath || 'app', | |
| dist: 'dist', | |
| moduleName: 'your-module-name', | |
| moduleDescription: 'your-module-description', | |
| moduleUrl: 'your-url-here', | |
| docs: 'docs' | |
| }, | |
| // Project documentation | |
| yuidoc: { | |
| all: { | |
| name: '<%= yeoman.moduleName %>', | |
| description: '<%= yeoman.moduleDescription %>', | |
| version: '0.0.1', | |
| url: '<%= yeoman.moduleUrl %>', | |
| options: { | |
| paths: ['<%= yeoman.app %>/scripts/'], | |
| outdir: '<%= yeoman.docs %>/', | |
| themedir: '<%= yeoman.app %>/bower_components/yuidoc-bootstrap-theme/', | |
| helpers: ['<%= yeoman.app %>/bower_components/yuidoc-bootstrap-theme/helpers/helpers.js'] | |
| } | |
| } | |
| }, | |
| // Watches files for changes and runs tasks based on the changed files | |
| watch: { | |
| js: { | |
| files: ['<%= yeoman.app %>/scripts/{,*/}*.js'], | |
| tasks: ['newer:jshint:all'], | |
| options: { | |
| livereload: true | |
| } | |
| }, | |
| jsTest: { | |
| files: ['test/spec/{,*/}*.js'], | |
| tasks: ['newer:jshint:test', 'karma'] | |
| }, | |
| 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 | |
| }, | |
| proxies: [ | |
| { | |
| context: '/api', | |
| host: 'localhost', | |
| port: 3000 | |
| } | |
| ], | |
| 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: { | |
| port: 9001, | |
| base: [ | |
| '.tmp', | |
| 'test', | |
| '<%= yeoman.app %>' | |
| ] | |
| } | |
| }, | |
| dist: { | |
| options: { | |
| base: '<%= yeoman.dist %>' | |
| } | |
| }, | |
| docs: { | |
| options: { | |
| base: '<%= yeoman.docs %>' | |
| } | |
| } | |
| }, | |
| // Make sure code styles are up to par and there are no obvious mistakes | |
| jshint: { | |
| options: { | |
| jshintrc: '.jshintrc', | |
| ignores: [ | |
| 'Gruntfile.js' | |
| ], | |
| reporter: require('jshint-stylish') | |
| }, | |
| all: [ | |
| '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' | |
| }, | |
| // Allow the use of non-minsafe AngularJS files. Automatically makes it | |
| // minsafe compatible so Uglify does not destroy the ng references | |
| ngmin: { | |
| dist: { | |
| files: [{ | |
| expand: true, | |
| cwd: '<%= yeoman.app %>/scripts', | |
| src: '**/*.js', | |
| dest: '<%= yeoman.dist %>/scripts' | |
| }] | |
| } | |
| }, | |
| // Copies remaining files to places other tasks can use | |
| copy: { | |
| dist: { | |
| files: [{ | |
| expand: true, | |
| dot: true, | |
| cwd: '<%= yeoman.app %>/scripts/', | |
| dest: '<%= yeoman.dist %>/scripts/', | |
| src: '**' | |
| }] | |
| } | |
| }, | |
| // Run some tasks in parallel to speed up the build process | |
| concurrent: { | |
| server: [], | |
| test: [], | |
| dist: [] | |
| }, | |
| uglify: { | |
| options: { | |
| mangle: false | |
| }, | |
| dist: { | |
| files: { | |
| // package name | |
| '<%= yeoman.dist %>/<%= yeoman.moduleName %>.min.js': [ | |
| // List of all files in scripts folder (if have some file in "scripts" root folder) | |
| '<%= yeoman.app %>/scripts/*.js', | |
| // List of all directives | |
| '<%= yeoman.app %>/scripts/directives/**/*.js', | |
| // List of all filters | |
| '<%= yeoman.app %>/scripts/filters/**/*.js', | |
| // List of all services | |
| '<%= yeoman.app %>/scripts/services/**/*.js' | |
| ] | |
| } | |
| } | |
| }, | |
| concat: { | |
| dist: { | |
| src: [ | |
| // List of all files in scripts folder (if have some file in "scripts" root folder) | |
| '<%= yeoman.app %>/scripts/*.js', | |
| // List of all directives | |
| '<%= yeoman.app %>/scripts/directives/**/*.js', | |
| // List of all filters | |
| '<%= yeoman.app %>/scripts/filters/**/*.js', | |
| // List of all services | |
| '<%= yeoman.app %>/scripts/services/**/*.js' | |
| ], | |
| dest: '<%= yeoman.dist %>/<%= yeoman.moduleName %>.js' | |
| }, | |
| }, | |
| // Test settings | |
| karma: { | |
| unit: { | |
| configFile: 'karma.conf.js', | |
| singleRun: true | |
| } | |
| } | |
| }); | |
| grunt.registerTask('buildNgModuleFile', 'Task for build ng module script file.', function(filename) { | |
| var path = require('path'), | |
| fs = require('fs'), | |
| SCRIPTS_DIST_DIR = 'dist/' | |
| ; | |
| // uncompressed and compressed module | |
| var buildFile = function(filename){ | |
| var angularModule = { | |
| contentUncompressed: { | |
| header: '(function(window, angular, undefined) {' + | |
| '\n' + | |
| '\'use strict\';' + | |
| '\n', | |
| footer: '\n' + | |
| '})(window, window.angular);' | |
| }, | |
| contentCompressed: { | |
| header: '(function(window, angular, undefined){ "use strict";', | |
| footer: '})(window, window.angular);' | |
| } | |
| }; | |
| var remove = ['\'use strict\';', '"use strict";']; | |
| // Verifying template for include in compiled file | |
| var templateNgModule = (filename.indexOf('.min.') !== (-1)) ? angularModule.contentUncompressed : angularModule.contentCompressed; | |
| var data = fs.readFileSync(filename, 'utf8'); | |
| data = templateNgModule.header + data.replace(new RegExp(remove[0], 'g'), '').replace(new RegExp(remove[1], 'g'), '') + templateNgModule.footer; | |
| fs.writeFileSync(filename, data, 'utf8'); | |
| console.log('Build of filename "'+filename+'" finished with success'); | |
| }; | |
| fs.readdirSync(SCRIPTS_DIST_DIR).forEach(function(file) { | |
| if ( file.indexOf(filename) !== (-1) ) { | |
| buildFile(SCRIPTS_DIST_DIR + filename); | |
| } | |
| }); | |
| }); | |
| grunt.registerTask('serve', function (target) { | |
| if (target === 'dist') { | |
| return grunt.task.run(['build', 'connect:dist:keepalive']); | |
| } | |
| if (target === 'docs') { | |
| return grunt.task.run(['connect:docs:keepalive']); | |
| } | |
| grunt.task.run([ | |
| 'clean:server', | |
| 'connect:livereload', | |
| 'watch' | |
| ]); | |
| }); | |
| grunt.registerTask('server', function (target) { | |
| target = ':'+target || ''; | |
| grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.'); | |
| grunt.task.run(['serve'+target]); | |
| }); | |
| grunt.registerTask('docs', [ | |
| 'yuidoc' | |
| ]); | |
| grunt.registerTask('test', [ | |
| 'clean:server', | |
| 'connect:test', | |
| 'karma' | |
| ]); | |
| grunt.registerTask('build', [ | |
| 'clean:dist', | |
| 'concat', | |
| 'ngmin', | |
| 'copy:dist', | |
| 'uglify', | |
| 'buildNgModuleFile:'+grunt.config.get('yeoman')['moduleName']+'.js', | |
| 'buildNgModuleFile:'+grunt.config.get('yeoman')['moduleName']+'.min.js' | |
| ]); | |
| grunt.registerTask('default', [ | |
| 'newer:jshint', | |
| 'test', | |
| 'build' | |
| ]); | |
| }; |
| { | |
| "author": "your-name <your-email>", | |
| "name": "your-module-name", | |
| "description": "your-module-description", | |
| "version": "0.0.1", | |
| "homepage": "your-module-homepage", | |
| "devDependencies": { | |
| "grunt": "~0.4.1", | |
| "grunt-autoprefixer": "~0.4.0", | |
| "grunt-bower-install": "~0.7.0", | |
| "grunt-concurrent": "~0.4.1", | |
| "grunt-contrib-clean": "~0.5.0", | |
| "grunt-contrib-coffee": "~0.7.0", | |
| "grunt-contrib-compass": "~0.6.0", | |
| "grunt-contrib-concat": "~0.3.0", | |
| "grunt-contrib-connect": "~0.5.0", | |
| "grunt-contrib-copy": "~0.4.1", | |
| "grunt-contrib-cssmin": "~0.7.0", | |
| "grunt-contrib-htmlmin": "~0.1.3", | |
| "grunt-contrib-imagemin": "~0.3.0", | |
| "grunt-contrib-jshint": "~0.7.1", | |
| "grunt-contrib-uglify": "~0.2.0", | |
| "grunt-contrib-watch": "~0.5.2", | |
| "grunt-google-cdn": "~0.2.0", | |
| "grunt-newer": "~0.5.4", | |
| "grunt-ngmin": "~0.0.2", | |
| "grunt-rev": "~0.1.0", | |
| "grunt-svgmin": "~0.2.0", | |
| "grunt-usemin": "~2.0.0", | |
| "jshint-stylish": "~0.1.3", | |
| "load-grunt-tasks": "~0.2.0", | |
| "time-grunt": "~0.2.1", | |
| "karma-ng-html2js-preprocessor": "~0.1.0", | |
| "karma-ng-scenario": "~0.1.0", | |
| "karma": "~0.12", | |
| "grunt-karma": "~0.8.2", | |
| "grunt-docular": "~0.1.2", | |
| "grunt-html": "~1.2.0", | |
| "karma-jasmine": "~0.1.5", | |
| "karma-chrome-launcher": "~0.1.3", | |
| "grunt-connect-proxy": "~0.1.10", | |
| "protractor": "~0.21.0", | |
| "requirejs": "~2.1.11", | |
| "karma-requirejs": "~0.2.1", | |
| "karma-phantomjs-launcher": "~0.1.4", | |
| "grunt-contrib-yuidoc": "~0.5.2" | |
| }, | |
| "engines": { | |
| "node": ">=0.8.0" | |
| }, | |
| "scripts": { | |
| "prestart": "npm install", | |
| "postinstall": "bower install && ./node_modules/protractor/bin/webdriver-manager update && cp ./node_modules/protractor/example/chromeOnlyConf.js protractor_conf.js", | |
| "start": "grunt serve", | |
| "test": "grunt test" | |
| } | |
| } |
@VictorQueiroz , são propósitos diferentes. Apesar de utilizar o gerador para facilitar o fluxo de criação de arquivos e testes, as tarefas do Grunt foram otimizadas para a criação de um módulo. O generator-angular do Yeoman foi utilizado para gerar a estrutura e melhorar o workflow para a criação de módulos.
As tasks para o build são diferentes das que vem por default no generator-angular e focadas no processo de build de um módulo angular. Os plugins de rotas e o arquivo app.js, por exemplo, não são necessários para criarmos um módulo angular. Existe também uma diferença nas tasks de concat e uglify e foi criada uma nova tarefa (task buildNgModuleFile) para o fechamento do módulo.
Neste link tem um exemplo de como fica a estrutura de seu módulo, com base no generator-angular, mas sem o que não é necessário para o fechamento do módulo:
https://github.com/willmendesneto/keepr/tree/master/app
Neste link tem um exemplo de como o módulo é criado após a task de build:
https://github.com/willmendesneto/keepr/blob/master/dist/keepr.js
O gerador do yeoman já não cria toda essa estrutura de arquivos automaticamente?