Как передать аргументы из командной строки в npm и grunt?

#npm #gruntjs

#npm #gruntjs

Вопрос:

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

Я начну с простого примера, который я пытаюсь выполнить, который представляет собой команду для создания новой папки и копирования некоторых стандартных файлов. Для этого я использую npm и grunt, например:

package.json

 "scripts": {
  "new": "grunt new --target
},
  

grunt.js

 module.exports = function (grunt) {
  const target = grunt.option('target');
  console.log('Target: ', target);

  grunt.config.set('copy', {
    new: {
      files: [{
        expand: true,
        cwd: 'assets/zip',
        src: '*.zip',
        dest: 'projects/',
      }]
    },
  });
}
  

И я пытаюсь вызвать это так:

 npm run new --target:my-folder-name
  

Это всего лишь простой пример, я запускаю другие скрипты, такие как распаковка файлов, переименование, копирование, обработка scss и т. Д…

Я ожидаю, что задача выполнить копирование файлов в папку с именем my-folder-name , но этого не происходит. Консоль печатает true , а не имя папки.

Что мне нужно сделать, чтобы передать аргумент скрипту?

Ответ №1:

Допустим, наш надуманный каталог проекта структурирован следующим образом:

 .
├── Gruntfile.js
├── assets
│   └── zip
│       ├── file1.zip
│       ├── file2.zip
│       └── file3.zip
├── node_modules
│   └── ...
└── package.json
  

Затем рассмотрите следующее Gruntfile.js пример, в котором используется grunt-contrib-copy:

Gruntfile.js

 module.exports = function(grunt) {

  const target = grunt.option('target') || 'foobar'; // default dir is `foobar`.

  grunt.loadNpmTasks('grunt-contrib-copy');


  grunt.initConfig({
    copy: {
      zips: {
        files: [{
          expand: true,
          cwd: 'assets/zip',
          src: '*.zip',
          dest: 'projects/'   target
        }]
      }
    }
  });

  grunt.registerTask('copy-zips', [ 'copy:zips' ]);

};
  

Вывод через grunt команду.

  1. Если мы cd перейдем в каталог проекта и выполним следующую grunt команду:

     grunt copy-zips
      

    следующие папки ( projects/foobar ) создаются в корне каталога проекта.

    Пример результатов A

     .
    ├── ...
    └── projects
        └── foobar
            ├── file1.zip
            ├── file2.zip
            └── file3.zip
      

    Была создана папка foobar по умолчанию, содержащая копию *.zip файлов. Папка была названа foobar , потому что мы НЕ предоставили аргумент через командную строку.

  2. Далее, если мы cd снова перейдем в каталог проекта и выполним следующую команду grunt:

     grunt copy-zips --target=my-folder-name
      

    следующие папки ( projects/my-folder-name ) создаются в корне каталога проекта.

    Результаты Пример B

     .
    ├── ...
    └── projects
        └── my-folder-name
            ├── file1.zip
            ├── file2.zip
            └── file3.zip
      

    Обратите внимание, что на этот раз my-folder-name была создана папка, содержащая копию *.zip файлов, потому что мы предоставили --target=my-folder-name аргумент / параметр.

Вывод через npm команду.

Сначала давайте настроим scripts раздел в projects package.json следующим образом:

пакет, json

 {
  ...
  "scripts": {
    "copy-zips": "grunt copy-zips"
  },
  ...
}

  
  1. Если мы cd перейдем в каталог проекта и выполним следующую npm команду:

     npm run copy-zips
      

    мы получаем те же результаты, что и в вышеупомянутом примере результатов раздела.

  2. Далее, если мы снова перейдем в каталог проекта и выполним следующую npm команду:

     npm run copy-zips -- --target=my-folder-name
      

    мы получаем те же результаты, что и в вышеупомянутом примере результатов раздела B.

    Примечание: дополнительная -- опция между npm run copy-zips и аргументом --target=my-folder-name .

    В документах npm -- этот параметр описывается следующим образом:

    По состоянию на npm@2.0.0 , вы можете использовать пользовательские аргументы при выполнении сценариев. Специальная опция -- используется getopt для разграничения конца опций. npm передаст все аргументы после -- непосредственно в ваш скрипт:


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

Если вы не хотите создавать my-folder-name папку внутри projects папки, а вместо этого хотите создать my-folder-name папку в корне каталога проекта, то вы можете переопределить dest свойство в copy задаче следующим образом:

Gruntfile.js

   // ...

  grunt.initConfig({
    copy: {
      zips: {
        files: [{
          expand: true,
          cwd: 'assets/zip',
          src: '*.zip',
          dest: target // <-----
        }]
      }
    }
  });

  // ...
  

Запуск одной и той же команды:

 npm run copy-zips -- --target=my-folder-name
  

выдает следующий результат:

 .
├── ...
└── my-folder-name
    ├── file1.zip
    ├── file2.zip
    └── file3.zip