NPM: link

Pedpokládám, že každý kdo něco píše v JavaScriptu, nebo TypeScriptu zná NPM.
Pro ty co jsou tu prvně: největší a nejrychleji rostoucí repozitář (knihovna) javascriptových modulů. Samozřejmě se vším co k tomu patří.

Vedle toho, že NPM je nějaký síťový, skrze internet dostupný, centrálně spravovaný, byste třeba někdy chtěli dosáhnout stejného chování balíčků pomocí require pro nějaké vlastní, lokálně vyvíjené moduly, které neopustily disk vašeho notebooku.

NPM lokálně

Příklad

Mám někde na disku adresář, ve kterém mám vlastní implementaci super výkoné matematické knihovny:

zdrojový kód mé knihovny:

// ./my-math-lib/index.js
function sum(a, b) {
    return a + b;
}

module.exports = {
    sum,
}

package.json v adresáři s knihovnou:

{
  "name": "my-math-lib",
  "version": "1.0.0",
  "description": "my super cool math lib",
  "main": "index.js",
  "scripts": {
    "test": "jest"
  },
  "author": "Josef Podany ",
  "license": "ISC"
}

Tak a tenhle modul bych chtěl pak používat v dalších svých projektech stejně jako jakýkoliv jiný modul, který pochází z NPM.

Jak na to?

1. zaregistrování modulu

V adresáři s balíčkem ./my-math-lib spustím následující:

npm link

Tím dojde k vytvoření sym linku do globálního prostoru NPM balíčků na vašem stroji. O tom, že balíček se zaregistroval se přesvědčíte následovně:

npm -g list --depth 0

2. samotné využití požadovaného balíčku

Pak už jen stačí v adresáři s projektem, kde chcete váš balíček používat spustit následující:

npm link my-math-lib

V podstatě náhrada za

npm install my-math-lib

Protože příkaz install by hledal a stahoval balíček z centrálního, síťového repozitáře a to nechceme.

Pak už můžeme v projekt klasicky použit require jak jsme zvyklý:

const myMathLib = require('my-math-lib');
const a = myMathLib.sum(2, 4);

Resume

Celý fígl je v tom, že příkaz npm link vytváří symlinky mezi globálnín NPM uložištem na vašem stroji a adresářem node_modules v daném projektu.
Super je, že zůstává plně zachována plná funkcionalita práce s baličky, takže funguje i toto:

npm uninstall my-math-lib

Tím dojde k odebrání balíčku z daného projketu, nicméně sdílený balíček půjde dál využívat v ostatních projektech.
Pokud budete chtít úplně zrušit sdílení lokálního balíčku, pak následovně:

npm uninstall -g my-math-lib

Elegantní a hezhé řešení…