Poprzednio opisałem do czego służy grunt i jak go zainstalować. Jednak zakończyłem na jednej z najważniejszych rzeczy w grunt – mianowicie pliku który jest odpowiedzialny za definicje zadań jak i konfiguracje tego co ma nam ten biedny grunt robić :)
Niestety, z grunt nie jest tak łatwo jak z NPM – by stworzyć gruntfile.js
lub gruntfile.coffee
mamy dwie opcje:
- Ręczne utworzenie pliku
- Wykorzystanie kolejnej paczki (kiedyś była częścią grunt)
grunt-init
Ręcznie możemy to zrobić za pomocą poleceń
touch gruntfile.js notepad grutfile.js
To nam da pusty plik, który musimy sami uzupełnić, na razie to pozostawmy w spokoju, jedynie możemy dodać do pliku:
module.exports = function (grunt) { }
Niezależnie co będziemy robić to jest część wymagana. Daje nam ona dostęp do obiektu grunt
i jego API konfiguracyjnego.
Jeżeli jednak nie chcemy tego pisać ręcznie, możemy wykorzystać paczkę grunt-init
, która daje nam kilka ekstra możliwości – ogólnie jest to paczka która udostępnia narzędzie do scaffoldingu. To może być cokolwiek – od pliku gruntfile.js
po pełną strukturę katalogu dla pluginu jQuery, Node czy innych – strona dokumentacji, listuje oficjalnie paczki oraz opisuje co one nam dają.
Nas będzie intersował jedynie szablon dla pliku gruntfile.js
.
Instalacja grunt-init
jest prosta:
npm install –g grunt-init
Da nam to dostęp do komendy grunt-init
która z sama z siebie nic nam nie da. By móc utworzyć nasz plik, musimy jeszcze zainstalować szablon grunt-init-gruntfile
. Niestety, nie jest on paczką npm, więc by go dodać trzeba sklonować repro z GitHuba do katalogu ~/.grunt-init/
:
git clone https://github.com/gruntjs/grunt-init-gruntfile.git ~/.grunt-init/gruntfile
Teraz mamy dostęp do komendy:
grunt-init gruntfile
Spowoduje to odpalenie wizzarda w którym będziemy mogli określić:
- Czy nasza aplikacja będzie miała cokolwiek wspólnego z DOM (jakikolwiek plik HTLM)
- Czy pliki będą łączone i minifikowane
- Czy będzie plik
package.json
dostępny - Czy chcemy dokonać jakiś zmian w powyższych odpowiedziach przed kontynuowaniem
Po skończeniu, zostanie dla nas utworzony plik Gruntfile.js
i jeżeli odpowiedzieliśmy Tak na pytanie z package.json
to albo ten plik zostanie utworzony albo zaktualizowany o paczki gruntowe, które są niezbędne do uruchomienia skryptu z pliku Gruntfile.js
.
Więc teraz musimy wykonać polecenie
npm install
By zainstalować wszystkie niezbędne paczki dla grunt.
Jeżeli zaś odpowiedzieliśmy Nie na pytanie o package.json
, to sami będziemy musieli ręcznie te paczki zainstalować (o czym zaraz).
Jeżeli odpowiedzieliśmy na wszystkie pytania Tak (oprócz tego ostatniego) to nasz plik Gruntfile.js
wygląda tak:
/*global module:false*/ module.exports = function(grunt) { // Project configuration. grunt.initConfig({ // Metadata. pkg: grunt.file.readJSON('package.json'), banner: '/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - ' + '<%= grunt.template.today("yyyy-mm-dd") %>n' + '<%= pkg.homepage ? "* " + pkg.homepage + "\n" : "" %>' + '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' + ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */n', // Task configuration. concat: { options: { banner: '<%= banner %>', stripBanners: true }, dist: { src: ['lib/<%= pkg.name %>.js'], dest: 'dist/<%= pkg.name %>.js' } }, uglify: { options: { banner: '<%= banner %>' }, dist: { src: '<%= concat.dist.dest %>', dest: 'dist/<%= pkg.name %>.min.js' } }, jshint: { options: { curly: true, eqeqeq: true, immed: true, latedef: true, newcap: true, noarg: true, sub: true, undef: true, unused: true, boss: true, eqnull: true, browser: true, globals: {} }, gruntfile: { src: 'Gruntfile.js' }, lib_test: { src: ['lib/**/*.js', 'test/**/*.js'] } }, qunit: { files: ['test/**/*.html'] }, watch: { gruntfile: { files: '<%= jshint.gruntfile.src %>', tasks: ['jshint:gruntfile'] }, lib_test: { files: '<%= jshint.lib_test.src %>', tasks: ['jshint:lib_test', 'qunit'] } } }); // These plugins provide necessary tasks. grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-watch'); // Default task. grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']); };
Teraz by wykonać skrypt zdefiniowany w gruntfile.js
wystarczy komenda:
grunt
Zostanie wtedy wykonany domyślny task ze wszystkimi swoimi powiązanymi zadaniami.
Jeżeli nie mamy pliku package.json
i zdefiniowanych paczek tam, to przy odpalaniu dostaniemy błąd informujący jakich paczek nam brakuje:
>> Local Npm module "grunt-contrib-concat" not found. Is it installed? >> Local Npm module "grunt-contrib-uglify" not found. Is it installed? >> Local Npm module "grunt-contrib-qunit" not found. Is it installed? >> Local Npm module "grunt-contrib-jshint" not found. Is it installed? >> Local Npm module "grunt-contrib-watch" not found. Is it installed? Warning: Task "jshint" not found. Use --force to continue.
Innym sposobem uzyskania informacji na temat paczek wykorzystywanych przez gruntfile.js
jest znalezienie linii kodu w pliku gruntfile.js
zaczynających się od:
grunt.loadNpmTasks
Niestety, grunt nam tych paczek sam z siebie nie zainstaluje :) więc albo bawimy się ręcznie, ale usuwamy plik gruntfile.js
i na nowo odpalamy grunt-init gruntfile
:)
Jeżeli mamy już wszystkie paczki jakie są nam potrzebne to domyślnie mamy dostępne następujące polecenia:
// odpali wszystkie taski grunt // wykona jedynie testy grunt qunit // połączy jedynie pliki js w jeden plik grunt concat // zminifikuje jedynie plik utworzony przez contact grunt uglify // wykona jshint na plikach js grunt jshint
Tyle na dzisiaj :) następnym razem pobawimy się gruntfile.js i dowiemy się skąd brać paczki, i skąd czerpać inspiracje :)
Czytając twoje ostatnie posty przypomniała mi się anegdota:
A: Żeby zainstalować vertexa musicie tylko wpisać w konsolę gvm install vert.x
B: Co to jest GVM?
A: menadżer paczek żeby go pobrać wpisujesz w konsolę curl -s get.gvmtool.net | bash
B: co to jest curl?
A: menadżer paczek* żeby go pobrać wpisujesz apt-get install curl
B: co to jest apt-get
A: menadżer paczek….
* Tak wiem curl nie jest menadżerem paczek ale pasował do kontekstu :)
Osobiście chyba za mało robię w js żeby wchodzić w zarządzanie paczkami i tak zaawansowaną automatyzację ale jakbym zaczął potrzebować to dobrze wiedzieć gdzie szukać.
**@Wojtek(shogun1987)**
a bo ja wiem ;) jak nie chcesz korzystac z grunta to nie musisz go instalowac :) tak samo z nuget, zawsze mozesz recznie wszystko sciagnac sobie. Grunt zas sam w sobie nie ma “kontroli paczki” to sie opiera o npm – no nie liczac tego nieszczesnego _grunt-init_ ale coz :) wszystkiego miec nie mozna. z drugiej strony, ten _grunt-init_ pokazal jedynie dla tego ze jest i niektorym moze sie spodobac. osobiscie wole recznie pisac plik _gruntfile.js_ :)
Comments are closed.