К сожалению, npm-scripts
не имеет встроенного способа для удовлетворения ваших требований для успешного кроссплатформенного выполнения.
Однако есть несколько способов удовлетворить ваши требования следующим образом (...you, вероятно, хотите Решение B ):
Решение A:
Если у вас есть только несколько файлов .scss
для компиляции в .css
, тогдаПростейшим решением было бы создать npm-script
для каждого файла.Например:
"scripts": {
"compile:home": "node-sass sass/home.scss css/home.css -w",
"compile:quxx": "node-sass sass/quux.scss css/quxx.css -w"
}
Это позволит вам запускать каждый сценарий, используя требуемый синтаксис команды, например
$ npm run compile:home
$ npm run compile:quxx
Однако это , вероятно, неидеально, так как я думаю, у вас есть много .scss
файлов - отсюда и ваш вопрос об использовании переменной в скрипте.
Решение B:
Решение, которое работает кроссплатформенно (и позволяет вам определить имя файла в качестве аргумента через CLI), состоит в том, чтобы написать nodejs служебный скрипт.Сценарий nodejs может быть вызван из раздела scripts
вашего package.json
.
. Ниже приведены необходимые шаги для достижения этой цели:
Создайте скрипт nodejs следующим образом: Давайте назовем файл sass-to-css.js
.
sass-to-css.js
const fs = require('fs');
const path = require('path');
const execSync = require('child_process').execSync;
// Error when no filename argument provided.
if (!process.argv[2]) {
console.log('\x1b[31mERR!\x1b[0m Trailing filename arg must be provided.');
process.exit(1);
}
const fileName = process.argv[2];
const srcPath = `${path.join('sass', fileName)}.scss`;
// Check source .scss file exists.
if (!fs.existsSync(srcPath)) {
console.log('\x1b[31mERR!\x1b[0m Path cannot be found: %s', srcPath);
process.exit(1);
}
// Path to node-sass executable in node_modules directory.
const executablePath = path.join('node_modules', '.bin', 'node-sass');
// Destimation path for resultant .css file.
const destPath = `${path.join('css', fileName)}.css`;
// The command to be invoked.
const cmd = `${executablePath} ${srcPath} ${destPath} -w`;
// Execute the command.
execSync(cmd, {
cwd: process.cwd()
});
Сохраните sass-to-css.js
в корневом каталоге вашего проекта, в той же папке, где хранится package.json
.Например:
.
├── ...
├── node_modules
│ └── ...
├── package.json
├── sass
│ ├── home.scss
│ └── ...
└── sass-to-css.js <--
Затем в разделе scripts
вашего package.json
добавьте следующий скрипт:
"scripts": {
"compile": "node sass-to-css"
}
Чтобы вызвать скрипт через CLI, вы вводите что-то вроде следующей команды:
$ npm run compile home
$ npm run compile foo
$ npm run compile bar
Примечание : последний предоставленный аргумент - это имя файла (без расширения файла),файла .scss
, который вы хотите скомпилировать.А именно home
, foo
, bar
в приведенном выше примере.Между частью compile
и именем файла / аргументом должен существовать пробел.
Синтаксис для запуска команды не такой, как вы запрашивали, но он близок!
Дополнительные примечания:
Соответствующие части sass-to-css.js
:
- Используются узлы
process.argv
для получения имени файла / аргумента, введенного через CLI. - Пути к исходному (
.scss
) и целевому (.css
) файлам создаются с использованием узлов path.join()
. child_process.execSync()
используется для выполнения соответствующей команды node-sass
. - Он проверяет, был ли указан обязательный аргумент имени файла, а также проверяет, является ли результирующий путь к файлудля
.scss
файл существует с использованием fs.existsSync(path)
.
sass-to-css.js
в настоящее время использует Шаблонные литералы (функция ES6).Если вы используете более старую версию nodejs, которая не поддерживает этот синтаксис, используйте вместо этого версию сценария ES5, приведенную ниже:
ES5-версия sass-to-css.js
var fs = require('fs');
var path = require('path');
var execSync = require('child_process').execSync;
// Error when no filename argument provided.
if (!process.argv[2]) {
console.log('\x1b[31mERR!\x1b[0m Trailing filename arg must be provided.');
process.exit(1);
}
var fileName = process.argv[2];
var srcPath = path.join('sass', fileName) + '.scss';
// Check source .scss file exists.
if (!fs.existsSync(srcPath)) {
console.log('\x1b[31mERR!\x1b[0m Path cannot be found: %s', srcPath);
process.exit(1);
}
// Path to node-sass executable in node_modules directory.
var executablePath = path.join('node_modules', '.bin', 'node-sass');
// Destimation path for resultant .css file.
var destPath = path.join('css', fileName) + '.css';
// The command to be invoked.
var cmd = executablePath + ' ' + srcPath + ' ' + destPath + ' -w';
// Execute the command.
execSync(cmd, {
cwd: process.cwd()
});