2016-01-18 6 views
6

Mam statyczną stronę, która kompiluje Sassa przy użyciu node-sass.Pakiet węzłów - czy można interpolować zmienną w pliku package.json?

Obecnie używam Grunta do obejrzenia pliku, ale uważam, że to przesada, ponieważ mogę używać wbudowanego interfejsu CLI.

Więc dodam to w moim package.json:

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

Problem polega na tym, muszę require moduł ramowy Sass (globalnie) zainstalowanego w --include-path. Mogę to zrobić w Gruntfile:

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

Więc pierwszą rzeczą, która przyjdzie do mojego umysłu jest interpolować ciąg jak:

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

I zgodnie z oczekiwaniami, to nie działa. Cóż, skrypt działa, ale interpolowana zmienna jest ignorowana.

Jakieś rozwiązanie czy alternatywa? Jeśli to możliwe, wolałbym nie tworzyć dodatkowego pliku tylko po to, aby zapisać zmienną.

Dzięki

+0

Praktyki redakcyjne SO są takie, że odpowiedzi muszą być publikowane jako * odpowiedzi *, a nie jako zmiany w pytaniach. Proszę zamieścić swoją odpowiedź jako rzeczywistą odpowiedź. Dziękuję Ci. – Louis

Odpowiedz

5

nie wiem czy jest to dobry sposób, żeby to zrobić, ale mogę wyjaśnić, jak będę rozwiąże to zadanie.

Nie można interpolować zmiennych w package.json, ponieważ musi to być poprawne json. Możesz tutaj pisać polecenia basha.

1) Można napisać polecenie węzła, które będzie wymagało wyniku. Należy zachować ostrożność, jeśli includePaths() nie zwraca ciągu znaków.

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

Więc to byłoby coś

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

lub krótszej wersji z --print

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

2) wyjście Inline poprzedniego polecenia w skrypcie Sass. Dbaj o prawo ucieczki.

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

Więcej informacji na temat wykonywania polecenia bash można znaleźć here.

P.S. Wersja systemu Windows różni się od:

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

Więcej informacji można znaleźć here.

+0

Dzięki za odpowiedź. Myślę, że jest błąd z '$ (...)'. Próbowałem wpisując 'node -p ...' w konsoli i pomyślnie wydrukowałem ścieżkę. Ale nie działa w '$ (...)'. – hrsetyono

+0

Nie mogę tego sprawdzić, ponieważ nie mam działającego przykładu, ale próbuję go za pomocą polecenia '' ls - $ (node ​​-p "'la'") '' i działa dokładnie tak jak '' ls -la'' –

+0

no it nie, otrzymuję 'ls: invalid option - $'. Jestem na Windows 10, może to jest powód? – hrsetyono

0

można coś takiego:

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

Framework to moduł npm i znajduje się w katalogu instalacyjnym węzła, a nie w projekcie. Mogę uzyskać ścieżkę za pomocą 'require', ale pakiet.json nie zezwala na interpolację ciągów znaków – hrsetyono

0

Istnieje wiele sposobów rozwiązania tego problemu za pomocą skryptów npm.

Pierwszy, który przychodzi mi do głowy, patrząc na twoją konkretną potrzebę, to npm akceptuje dodatkowe parametry podczas wywoływania skryptu.Na przykład:

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

To rozwiąże się:

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

Innym sposobem byłoby przenieść swój kod w .js pliku wykonywalnego (Node), nazwijmy to watch-sass.js.

Więc skrypt będzie wyglądać następująco:

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

I chcesz uruchomić:

npm run sass 

W ten sposób można mieć znacznie większą swobodę rób co chcesz w pliku.


Możliwości są nieskończone naprawdę, można wykorzystać moc skryptu bash zamiast JS jeśli chcesz, wszystkie one mogą odczytu/zapisu zmiennych środowiskowych. Ale niekoniecznie ich potrzebujesz. Na przykład, możesz mieć skrypt powłoki, który napisze dla ciebie pakiet.json (lub Python, lub Ruby ...), ze wszystkimi zmiennymi już istniejącymi. Ale w końcu myślę, że to tylko kwestia gustu, użyj tego, co uważasz za prostsze lub wygodniejsze w użyciu.

+0

Dzięki za odpowiedź. Chcę uniknąć twardego kodowania ścieżki, również próbuję to zrobić bez tworzenia dodatkowego pliku (jeśli nie jest to możliwe, wtedy użyję pliku '.js'). – hrsetyono

+0

@DarcCode czy wypróbowałeś pierwsze podejście? Myślę, że to prawdopodobnie tego, czego szukasz? – Simone

+0

Nie chcę wpisywać 'C ::/ProgramFiles/.../...' za każdym razem, gdy chcę uruchomić skrypt. Również katalog instalacyjny może się różnić między komputerami, więc muszę użyć 'require ...' – hrsetyono