2016-01-18 3 views
6

У меня есть статический сайт, который компилирует Sass с помощью node-sass.Node Package - Можно ли интерполировать переменную в package.json?

В настоящее время я использую Grunt для просмотра файла, но я чувствую, что это слишком много, потому что я могу использовать их встроенный CLI.

Так что я добавить это в моем package.json:

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

Проблема заключается в том, мне нужно require модуль рамочных Сасс (устанавливаются глобально) в --include-path. Я могу сделать это в Gruntfile:

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

Итак, первое, что приходит мне на ум, чтобы интерполировать строку типа:

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

И, как и ожидалось, он не работает. Ну скрипт работает, но интерполированная переменная игнорируется.

Любое решение или альтернатива? Если возможно, я предпочел бы не создавать дополнительный файл только для хранения переменной.

Благодаря

+0

SO редакционные практики таковы, что ответы должны быть опубликованы как * ответы *, а не как изменения в вопросах. Отправьте свой ответ в качестве фактического ответа. Спасибо. – Louis

ответ

5

Я не знаю, это правильный способ сделать это, но я могу объяснить, как я бы решить эту задачу.

Вы не можете интерполировать переменные в package.json, потому что он должен быть действительным json. Вы можете написать здесь команды bash.

1) Вы можете написать команду узла, которая потребует результата. Вы должны позаботиться, если includePaths() не возвращает строку.

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

Так что было бы что-то вроде

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

Или сокращенный вариант с --print

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

2) Встраиваемый вывод предыдущей команды в Sass сценария. Позаботьтесь о правильном побеге.

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

Более подробная информация о выполнении команды Баша вы можете найти here.

P.S. Версия для Windows отличается

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

Дополнительная информация вы можете найти here.

+0

Спасибо за ответ. Я думаю, что есть ошибка с '$ (...)'. Я попытался набирать 'node -p ...' в консоли и успешно печатает путь. Но он не работает внутри '$ (...)'. – hrsetyono

+0

Я не могу проверить это, потому что у меня не работает пример, но я пытаюсь его с помощью команды '' ls - $ (node ​​-p "'la'") '' и работает точно так же, как '' ls -la'' –

+0

no it не получается, я получаю 'ls: invalid option - $'. Я на Windows 10, может быть, это и есть причина? – hrsetyono

0

Вы можете что-то вроде этого:

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

Структура является модулем npm и находится в каталоге установки узла, а не в проекте. Я могу получить путь, используя 'require', но package.json не разрешает строку интерполяции – hrsetyono

0

Существует множество способов решения этой проблемы с помощью сценариев npm.

Первый, который приходит мне на ум, глядя на вашу конкретную потребность, npm принимает дополнительные параметры при вызове сценария.Например:

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

Это будет решать:

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

Другим способом было бы переместить свой код в .js исполняемый файл (Node), давайте назовем его watch-sass.js.

Так что ваш сценарий будет выглядеть следующим образом:

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

А вы бы запустить:

npm run sass 

Таким образом, у вас есть гораздо больше свободы, чтобы сделать все, что вы хотите в вашем файле.


Возможности бесконечны действительно, вы могли бы использовать силу Баша скрипта вместо JS, если вы хотите, все они могут чтение/запись переменной среды. Но вы не обязательно нуждаетесь в них. Например, у вас может быть только сценарий оболочки, который пишет package.json для вас (или Python, или Ruby ...) со всеми уже существующими переменными. Но в конце концов я думаю, что это просто вопрос вкуса, используйте то, что вы найдете более простым или более удобным в использовании.

+0

Спасибо за ответ. Я хочу избежать hardcoding пути, также я пытаюсь сделать это, не создавая дополнительный файл (если это невозможно, то я буду использовать исполняемый файл .js'). – hrsetyono

+0

@DarcCode вы пробовали первый подход? Я думаю, это, возможно, то, что вы ищете? – Simone

+0

Я не хочу вводить 'C ::/ProgramFiles/.../...' каждый раз, когда я хочу запустить скрипт. Кроме того, установочный каталог может отличаться от компьютера, поэтому мне нужно использовать 'require ...' – hrsetyono

Смежные вопросы