В моем файле package.json после установки узла мне нужна команда, которая может автоматически компилировать любой из моих файлов sass одной командой? - PullRequest
0 голосов
/ 22 мая 2018

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

"scripts": {
"compile:'variable'": "node-sass sass/variable.scss css/variable.css -w" }

Есть ли способ сделать что-то подобное в npm, чтобы я мог передать аргумент в мою командучто я бы побежал?В командной строке я хотел бы скомпилировать простым способом.Я бы сказал, если бы я хотел скомпилировать файл с именем "home".Итак, я хочу иметь возможность вводить в командной строке:

npm run compile:home

Затем, я хотел бы получить следующую команду через package.json и запустить node-sass для компиляцииit:

"node-sass scss/home.scss css/home.css -w"

Если у вас есть какие-либо вопросы, не стесняйтесь комментировать.

1 Ответ

0 голосов
/ 23 мая 2018

К сожалению, 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.

. Ниже приведены необходимые шаги для достижения этой цели:

  1. Создайте скрипт 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()
    });
    
  2. Сохраните sass-to-css.js в корневом каталоге вашего проекта, в той же папке, где хранится package.json.Например:

    .
    ├── ...
    ├── node_modules
    │   └── ...
    ├── package.json
    ├── sass
    │   ├── home.scss
    │   └── ...
    └── sass-to-css.js    <--
    
  3. Затем в разделе scripts вашего package.json добавьте следующий скрипт:

    "scripts": {
      "compile": "node sass-to-css"
    }
    
  4. Чтобы вызвать скрипт через CLI, вы вводите что-то вроде следующей команды:

    $ npm run compile home
    $ npm run compile foo
    $ npm run compile bar
    

    Примечание : последний предоставленный аргумент - это имя файла (без расширения файла),файла .scss, который вы хотите скомпилировать.А именно home, foo, bar в приведенном выше примере.Между частью compile и именем файла / аргументом должен существовать пробел.

    Синтаксис для запуска команды не такой, как вы запрашивали, но он близок!

Дополнительные примечания:

  1. Соответствующие части sass-to-css.js:

    • Используются узлы process.argv для получения имени файла / аргумента, введенного через CLI.
    • Пути к исходному (.scss) и целевому (.css) файлам создаются с использованием узлов path.join().
    • child_process.execSync() используется для выполнения соответствующей команды node-sass.
    • Он проверяет, был ли указан обязательный аргумент имени файла, а также проверяет, является ли результирующий путь к файлудля .scss файл существует с использованием fs.existsSync(path).
  2. 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()
    });
    
...