2016-01-18 20 views
6

Ho un sito statico che compila Sass utilizzando node-sass.Pacchetto nodo: è possibile interpolare una variabile in package.json?

Attualmente sto utilizzando Grunt per guardare il file, ma ritengo che sia eccessivo perché posso utilizzare la sua CLI incorporata.

Così ho aggiungere questo nel mio package.json:

// package.json 
... 
"scripts": { 
    "sass": "node-sass -w input/dir -o output-dir/" 
} 

Il problema è che ho bisogno di un modulo require quadro Sass (installata a livello mondiale) nella --include-path. Posso fare questo in Gruntfile:

// Gruntfile.js 
sass: { 
    options: { 
    includePaths: require("the-framework").includePaths() 
    }, 
    ... 
}, 

Quindi la prima cosa che mi vengono in mente è quello di interpolare la stringa del tipo:

// package.json 
... 
"scripts": { 
    "sass": "node-sass -w input/dir -o output-dir/ --include-path " + require("the-framework").includePaths() 
} 

E come previsto, non funziona. Bene, lo script viene eseguito, ma la variabile interpolata viene ignorata.

Qualche soluzione o alternativa? Se possibile, preferirei non creare il file aggiuntivo solo per memorizzare la variabile.

Grazie

+0

Le pratiche editoriali SO sono tali che le risposte devono essere pubblicate come * risposte *, non come modifiche alle domande. Si prega di inviare la risposta come una risposta reale. Grazie. – Louis

risposta

5

io non so è che un modo giusto per farlo, ma posso spiegare come mi piacerebbe risolvere questo compito.

Non è possibile interpolare le variabili in package.json, perché deve essere valido JSON. Quello che puoi è scrivere qui i comandi di bash.

1) È possibile scrivere il comando del nodo che richiederà il risultato. Dovresti stare attento se includePaths() non restituisce una stringa.

Node options: 
    -e, --eval script  evaluate script 
    -p, --print   evaluate script and print result 

Quindi sarebbe qualcosa di simile

node -e "console.log(require('the-framework').includePaths())" 

O versione più corta con --print

node -p "require('the-framework').includePaths()" 

2) Uscita linea di comando precedente nello script sass. Abbi cura di fuggire bene.

{ 
    "scripts": { 
     "sass": "node-sass -w input/dir -o output-dir/ --include-path $(node -p \"require('the-framework').includePaths()\")" 
    } 
} 

Ulteriori informazioni sull'esecuzione del comando bash si possono trovare here.

P.S. versione per Windows si differenzia

{ 
    "scripts": { 
     "sass": "FOR /f \"delims=\" %v IN ('node -p \"require('edje').includePaths()[0]\"') DO node-sass -w assets/sass -o assets/css --include-path \"%v\"" 
    } 
} 

Maggiori informazioni si possono trovare here.

+0

Grazie per la risposta. Penso che ci sia un errore con il '$ (...)'. Ho provato a digitare 'node -p ...' in console e ha stampato il percorso con successo. Ma non funziona all'interno di '$ (...)'. – hrsetyono

+0

Non posso controllarlo, perché non ho un esempio in esecuzione, ma lo provo con il comando '' ls - $ (node ​​-p "'la'") '' e funziona esattamente come '' ls -la'' –

+0

no no, ho l'opzione 'ls: invalid - $'. Sono su Windows 10, forse questa è la ragione? – hrsetyono

0

È qualcosa di simile a questo possibile:

“scripts”: { 
    “sass”: “node-sass --include-path scss scss/main.scss public/css/main.css” 
}, 
+0

Il framework è un modulo npm e risiede nella directory di installazione del nodo, non all'interno del progetto. Posso ottenere il percorso usando 'require' ma package.json non consente l'interpolazione delle stringhe – hrsetyono

0

Ci sono molti modi per risolvere questo problema con gli script npm.

Il primo che mi viene in mente esaminando il tuo bisogno specifico è che npm accetta parametri extra quando chiama uno script.Per esempio:

npm run sass -- path/to/the-framework 

Questo risolverà a:

node-sass -w input/dir -o output-dir/ --include-path path/to/the-framework 

Un altro modo sarebbe quello di spostare il codice in un file eseguibile .js (Node), chiamiamolo watch-sass.js.

Così lo script sarà simile:

"sass": "node watch-sass.js" 

E si correrebbe:

npm run sass 

In questo modo si ha molta più libertà di fare tutto quello che vuoi nel tuo file.


possibilità sono infinite davvero, si potrebbe sfruttare la potenza di script bash, invece di JS, se si desidera, tutti possono leggere le variabili d'ambiente/scrittura. Ma tu non ne hai necessariamente bisogno. Ad esempio potresti avere uno script di shell che scrive un pacchetto. Json per te (o Python, o Ruby ...), con tutte le variabili già presenti. Ma alla fine penso che sia solo una questione di gusti, usa quello che trovi più semplice o più comodo da usare.

+0

Grazie per la risposta. Voglio evitare di codificare il percorso, inoltre sto cercando di farlo senza creare file aggiuntivi (se non è possibile, userò l'eseguibile '.js'). – hrsetyono

+0

@DarcCode hai provato il primo approccio? Penso che sia forse quello che stai cercando? – Simone

+0

Non voglio digitare 'C ::/ProgramFiles/.../...' ogni volta che voglio eseguire lo script. Anche la directory di installazione può essere diversa tra computer, quindi ho bisogno di usare 'require ...' – hrsetyono