2016-01-18 20 views
6

Ich habe eine statische Seite, die Sass mit node-sass kompilieren.Knotenpaket - Ist es möglich, eine Variable in package.json zu interpolieren?

Derzeit verwende ich Grunt, um die Datei zu sehen, aber ich fühle es ist Overkill, weil ich ihre eingebaute CLI verwenden kann.

So füge ich dies in meinem package.json:

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

Das Problem ist, ich brauche ein Sass Rahmenmodul (installiert global) im --include-path-require. Ich kann dies in Gruntfile tun:

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

Also das erste, was mir in den Sinn kommen, ist die Zeichenfolge wie zu interpolieren:

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

Und wie erwartet, funktioniert es nicht. Nun, das Skript läuft, aber die interpolierte Variable wird ignoriert.

Jede Lösung oder Alternative? Wenn möglich, würde ich bevorzugen, um die Datei nicht einfach zu erstellen, um die Variable zu speichern.

Dank

+0

SO redaktionelle Praktiken sind so, dass die Antworten müssen als * Antworten *, nicht als Änderungen an Fragen veröffentlicht werden. Bitte posten Sie Ihre Antwort als tatsächliche Antwort. Vielen Dank. – Louis

Antwort

5

Ich wissen nicht, ist es ein richtiger Weg, es zu tun, aber ich kann erklären, wie ich diese Aufgabe würde lösen.

Sie können Variablen in package.json nicht interpolieren, weil es gültige JSON sein muss. Das kannst du, um hier Bash-Befehle zu schreiben.

1) Sie können den Node-Befehl schreiben, der das Ergebnis benötigt. Sie sollten vorsichtig sein, wenn includePaths() String nicht zurückgibt.

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

So wäre es so etwas wie

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

oder kürzere Version mit --print

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

2) Inline-Ausgabe des vorherigen Befehls in sass Skript sein. Pass auf das richtige Entkommen auf.

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

Mehr Infos über bash Befehl ausführen Sie here finden.

P.S. Windows-Version unterscheidet

{ 
    "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\"" 
    } 
} 

Weitere Informationen finden Sie here.

+0

Danke für die Antwort. Ich denke, da ist ein Fehler mit dem '$ (...)'. Ich habe versucht, 'node -p ...' in die Konsole einzugeben und es druckt den Pfad erfolgreich. Aber es funktioniert nicht innerhalb des '$ (...)'. – hrsetyono

+0

Ich kann es nicht überprüfen, weil ich kein Beispiel habe, aber ich versuche es mit dem Befehl '' ls - $ (node ​​-p '' la '")' 'und es funktioniert genau wie' 'ls -la'' –

+0

nein es nicht, ich bekomme 'ls: ungültige Option - $'. Ich bin auf Windows 10, vielleicht ist das der Grund? – hrsetyono

0

Sie können so etwas wie diese:

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

Das Framework ist ein npm-Modul und befindet sich im Knoteninstallationsverzeichnis, nicht im Projekt. Ich kann den Pfad mit 'require' abrufen, aber package.json erlaubt keine String-Interpolation. – hrsetyono

0

Es gibt viele Möglichkeiten, wie Sie dies mit Npm-Skripten lösen können.

Der erste, der mir bei der Betrachtung Ihrer spezifischen Bedürfnisse in den Sinn kommt, ist, dass npm beim Aufruf eines Skripts zusätzliche Parameter akzeptiert.Zum Beispiel:

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

Dies wird lösen zu:

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

Eine andere Möglichkeit wäre der Code in einer .js ausführbare Datei (Knoten) zu bewegen, nennen wir es watch-sass.js.

So wird Ihr Skript wie folgt aussehen:

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

Und Sie würden laufen:

npm run sass 

diese Weise können Sie viel mehr Freiheit haben, was Sie wollen in Ihrer Datei zu tun.


Möglichkeiten sind wirklich unendlich, Sie die Macht der Bash-Skript anstelle von JS nutzen können, wenn Sie wollen, können sie alle/Schreib-Umgebungsvariablen lesen. Aber du brauchst sie nicht unbedingt. Zum Beispiel könnten Sie einfach ein Shell-Skript haben, das eine package.json für Sie schreibt (oder Python oder Ruby ...), wobei alle Variablen bereits vorhanden sind. Aber am Ende denke ich, es ist nur eine Frage des Geschmacks, benutze, was du einfacher oder komfortabler findest.

+0

Danke für die Antwort. Ich möchte vermeiden, den Pfad hart zu codieren, auch versuche ich dies zu tun, ohne eine zusätzliche Datei zu erstellen (wenn nicht, dann benutze ich die ausführbare Datei .js). – hrsetyono

+0

@DarcCode haben Sie den ersten Ansatz versucht? Ich denke, das ist möglicherweise das, wonach Sie suchen? – Simone

+0

Ich möchte nicht 'C ::/ProgramFiles/.../...' jedes Mal eingeben, wenn ich das Skript ausführen möchte. Auch das Installationsverzeichnis kann zwischen den Computern unterschiedlich sein, also muss ich 'require ...' verwenden. – hrsetyono

Verwandte Themen