Vytvoření generátoru pro aplikace DoneJS

Ekosystém JS je obrovský a nikdy nebudeme schopni podporovat všechny nástroje JavaScriptu. Chceme však ostatním open source vývojářům usnadnit vytváření těchto doplňků a ostatním v komunitě DoneJS usnadnit jejich používání. Zde přichází na scénu generátor generátoru DoneJS. Lze jej použít k vytváření modulů, které přidávají funkce do existující aplikace DoneJS.

Pokud jste použili donejs add nw nebo donejs add cordova k vytvoření desktopové nebo mobilní verze vaší aplikace jste již použili generátor DoneJS. Generátory jsou moduly npm, které poskytují generátor Yeoman, který přidává funkcionalitu vaší aplikaci.

V tomto článku si vytvoříte vlastní verzi donejs-jshint, generátoru DoneJS, který přidává JSHint, nástroj pro kvalitu kódu JavaScript a soubor .editorconfig, který pomáhá textovým editorům a IDE definovat a udržovat konzistentní styl kódování. Aktualizuje také npm test skript pro spuštění JSHint s našimi testy.

  1. Vytvořte projekt na GitHubu
  2. Inicializujte úložiště jako nový generátor DoneJS
  3. Nastavte nepřetržitou integraci s Travis CI
  4. Přidejte soubory šablon .jshintrc a .editorconfig
  5. Implementujte funkci generátoru
  6. Otestujte funkčnost ručně
  7. Zapište testy jednotek pro generátor
  8. Publikujte plugin na npm
  9. Ukažte to světu

Kód najdete v úložišti donejs-jshint. Video návod k tomuto článku je k dispozici zde:

Generátor můžeme spustit pomocí:

$ donejs add jshint

V současné době se pouze zeptá, zda chceme použít mezery nebo tabulátory a přepsat package.json pro přidání skriptů npm pro JSHint:

Poznámka: Od donejs-jshint již existuje, použijeme donejs-<username>-jshint s <username> je vaším uživatelským jménem GitHub pro zbytek tohoto článku. Jakmile je publikován, může být použit jako donejs add <username>-jshint .

Nastavení

Vytvoření projektu na GitHubu

K hostování kódu pro projekt použijeme GitHub, což ostatním usnadní přispívat a automaticky spouštět testy v nepřetržité integraci, kterou umožníme později.

Pokud ještě nemáte účet, přejděte na GitHub, zaregistrujte se a postupujte podle nápovědy, jak jej nastavit pro příkazový řádek git . Po dokončení vytvořte nové úložiště z řídicího panelu.

Volání úložiště donejs-<username>-jshint a jeho inicializace prázdný (bez jakýchkoliv výchozích souborů) vypadá takto:

Po vytvoření úložiště jej naklonujte do nové složky:

$ git clone [email protected]:<username>/donejs-<username>-jshint.git
$ cd donejs-<username>-jshint

Inicializace projektu

Pro inicializaci nového generátoru budete potřebovat DoneJS verze 0.9.0+ nainstalovanou globálně. Chcete-li zkontrolovat verzi DoneJS, spusťte

$ donejs --version

Chcete-li nainstalovat DoneJS nebo získat nejnovější verzi, spusťte:

$ npm install donejs -g

V donejs-<username>-jshint nyní můžeme inicializovat nový generátor, velmi podobný nové aplikaci DoneJS, takto:

$ donejs add generator

Generátor položí několik otázek, které by měly být zodpovězeny následovně:

  • Pro název projektu stačí potvrdit výchozí hodnotu stisknutím klávesy Enter
  • Pro uživatelské jméno nebo organizaci GitHubu zadejte uživatelské jméno GitHubu, kde bylo úložiště vytvořeno
  • Na všechna ostatní pole lze také odpovědět výchozím nastavením nebo informacemi, které chcete použít

Jakmile je vše hotovo, poslední výzva vypadá takto:

Nyní generátor inicializuje výchozí rozložení a nainstaluje všechny jeho závislosti.

Nastavení Travis CI

Po dokončení instalace se ujistěte, že je vše správně nastaveno spuštěním:

$ npm test

Tím se spustí některé základní testy generátoru a výsledek se zobrazí na konzole.

Tento příkaz lze také použít k automatickému spouštění testů na serveru pro nepřetržitou integraci. Existuje mnoho serverů CI s otevřeným zdrojovým kódem, z nichž nejoblíbenější je Jenkins, a mnoho hostovaných řešení, jako je Travis CI.

Travis CI budeme používat jako naše hostované řešení, protože je zdarma pro projekty s otevřeným zdrojovým kódem. Funguje s vaším účtem GitHub, který použije k registraci. Po přihlášení přejděte na Accounts (v rozevíracím seznamu pod vaším jménem) povolte donejs-<username>-jshint úložiště:

Možná budete muset kliknout na "Synchronizovat účet" tlačítko pro zobrazení úložiště. Nyní, pokaždé, když zatlačíme na GitHub, testy se spustí automaticky. Můžeme tak učinit pomocí našeho počátečního potvrzení:

$ git add . --all
$ git commit -am "Initial commit"
$ git push origin master

Pokud nyní přejdete na https://travis-ci.org/<your-username>/donejs-<username>-jshint/builds uvidíte, jak běží sestavení a nakonec zezelená (což aktualizuje odznak, který byl přidán do readme.md soubor).

Přidání konfiguračních souborů

Nyní můžeme přidat soubory, které by měl náš generátor vytvořit. Všechny šablony souborů budou vloženy do default/templates/ složka.

.jshintrc

Nejprve přidejte default/templates/.jshintrc soubor, který obsahuje volby pro JSHint:

{
 "node": true,
 "esnext": true,
 "bitwise": true,
 "camelcase": true,
 "curly": true,
 "eqeqeq": true,
 "immed": true,
 "indent": 2,
 "latedef": "nofunc",
 "newcap": false,
 "noarg": true,
 "regexp": true,
 "undef": true,
 "unused": true,
 "strict": false,
 "trailing": true,
 "smarttabs": true,
 "white": false
}

.editorconfig

Dále přidejte default/templates/.editorconfig soubor takto:

; Unix-style newlines
[*]
end_of_line = LF indent_style = <%= indent_style %> trim_trailing_whitespace = true

Všechny soubory podporují zástupné symboly EJS. Zde <%= indent_style %> bude použit pro uživatelskou volbu použití mezer nebo tabulátorů. Nakonec odstraňte defaults/templates/file.js protože ji nebudeme používat.

Implementace generátoru

Generátory DoneJS jsou z velké části jednoduše generátory Yeoman, takže vše zdokumentované pro psaní vlastního generátoru Yeoman platí i zde. Uživatelský výběr tabulátorů a mezer naleznete také v kapitole o interakci s uživatelem.

Přidání funkcí generátoru

Náš generátor se musí zeptat, zda chceme použít mezery nebo tabulátory, a poté zkopírovat .jshintrc a .editorconfig soubory do jejich konečného umístění. Chceme také přidat npm run jshint skript na package.json a ujistěte se, že JSHint běží během npm test . Kompletní generátor na default/index.js vypadá takto:

var generator = require('yeoman-generator');
var _ = require('lodash');

module.exports = generator.Base.extend({
 initializing: function () {
 // Read the original package.json
 this.pkg = this.fs.readJSON(
 this.destinationPath('package.json'), {}
 );

 // Maintain a list of all files we want to copy over
 this.files = [
 '.editorconfig',
 '.jshintrc'
 ];
 },

 prompting: function () {
 var done = this.async();

 // Create a prompt setting the `indent_style` property
 // to `tab` or `space`
 this.prompt([{
 type: 'list',
 name: 'indent_style',
 message: 'What indentation style do you want to use?',
 default: 'tab',
 choices: [
 {
 name: 'Tabs',
 value: 'tab'
 },
 {
 name: 'Spaces',
 value: 'space'
 }
 ]
 }], function (answers) {
 this.props = answers;
 done();
 }.bind(this));
 },

 writing: function () {
 var pkg = this.pkg;

 // Update `package.json` with the `jshint` command
 // and update the `test` script
 pkg.scripts = _.extend(pkg.scripts, {
 test: 'npm run jshint && ' + 
 _.get(pkg, 'scripts.test',
 'echo "No tests specified"'),
 jshint: 'jshint ' + 
 _.get(pkg, 'system.directories.lib',
 'src') + 
 '/. --config'
 });

 // Write to `package.json` and format accordingly
 // This will prompt you to overwrite
 var indent = this.props.index === 'tab' ? '\t' : ' ';
 this.fs.writeJSON('package.json', pkg, null, indent);

 // Install jshint as a development dependency
 this.npmInstall([ 'jshint' ], { saveDev: true});

 // Got through every file and copy it
 this.files.forEach(function(file) {
 this.fs.copyTpl(
 this.templatePath(file),
 this.destinationPath(file),
 this.props
 );
 }.bind(this));
 }
});

A je to. Nyní máme plně funkční generátor a můžeme jej vyzkoušet v aplikaci DoneJS.

Ruční testování

Při spuštění donejs add <generatorname> DoneJS bude

  • Zkontrolujte, zda donejs-<generatorname> je nainstalován lokálně
  • Pokud jej nenainstalujete z NPM
  • Potom spusťte generátor na default/index.js

Pokud chceme náš generátor otestovat, aniž bychom jej nejprve publikovali na npm, můžeme jej místo toho propojit. Ve složce generátoru spusťte:

$ npm link

Poté přejděte do adresáře vaší testovací aplikace DoneJS:

$ cd ../place-my-order
$ npm link donejs-<username>-jshint

Nyní můžeme běžet

$ donejs add <username>-jshint

Psaní testu jednotek

Yeoman také přichází s některými nástroji pro testování generátorů. Test, který jsme původně spustili s npm test zajišťuje, že default/templates/file.js se píše. Protože jsme tento soubor smazali, aktualizujte test na test/index.js pro ověření, že zapsal požadované soubory s obsahem, který očekáváme:

var path = require('path');
var helpers = require('yeoman-test');
var assert = require('yeoman-assert');

describe('donejs--jshint', function() {
 before(function(done) {
 // Run the generator in a temprorary directory
 helpers.run(path.join(__dirname, '../default'))
 .inTmpDir()
 // Mock the user input by setting
 // `indent_style` to `tab`
 .withPrompts({
 'indent_style': 'tab'
 }).on('end', done);
 });

 // Verify that `.jshintrc` got written
 // and has some content
 it('created .jshintrc', function() {
 assert.file(['.jshintrc']);
 assert.fileContent('.jshintrc',
 /"latedef": "nofunc"/);
 });

 // Verify that `.editorconfig` got written
 // with `indent_style` set to our selection
 it('.editorconfig with indent_style', function() {
 assert.file(['.editorconfig']);
 assert.fileContent('.editorconfig',
 /indent_style = tab/);
 });

 // Make sure that `package.json` got updated
 // with the `jshint` npm script
 it('update package.json', function() {
 assert.jsonFileContent('package.json', {
 scripts: {
 jshint: 'jshint src/. --config'
 }
 });
 });
});

Nyní vidíme, jak všechny testy prošly při spuštění:

$ npm test

Publikování pluginu

Vytvoření požadavku na stažení

I když na generátoru zatím pracujeme sami, žádosti GitHub o stažení jsou skvělým způsobem, jak sledovat náš pokrok a ujistit se, že všechny testy projdou. Ve složce pluginu spusťte:

$ git checkout -b generator-functionality
$ git add . --all
$ git commit -m "Implementing JSHint and editorconfig generator"
$ git push origin generator-functionality

A poté vytvořte nový požadavek na stažení pomocí https://github.com/<username>/donejs-<username>-jshint který nyní zobrazí možnost, jako je tato:

Jakmile vytvoříte požadavek na stažení, uvidíte Some checks haven’t completed yet zpráva, která nakonec zezelená:

Nyní můžete kliknout na tlačítko "Merge pull request". Poté v konzole zaškrtněte master větev a stáhnout nejnovější změny pomocí:

$ git checkout master
$ git pull origin master

Publikování na npm

Aby ostatní mohli používat váš generátor přes donejs add <generatorname> musí to přetáhnout na npm. Vytvořte si nový účet a poté se přihlaste přes

$ npm login

Sémantické verzování je skvělý způsob, jak komunikovat nové funkce a přelomové změny. Vygenerovaný plugin je již dodáván se skripty pro vydání nových verzí podle major.minor.patch schéma. V našem případě publikovat počáteční verzi 0.1.0 můžeme běžet

$ donejs release:minor

Nyní verze 0.1.0 generátoru je k dispozici a každý jej může používat prostřednictvím

donejs add <username>-jshint

Ukažte to

Jakmile svůj generátor zveřejníte, dejte o něm vědět světu. Tweetujte @donejs a zveřejněte jej na fóru DoneJS a na chatu DoneJS. Jsou to také skvělá místa, kde získáte rychlou pomoc s případnými dotazy.