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.jsondostę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.