#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
команду.
-
Если мы
cd
перейдем в каталог проекта и выполним следующуюgrunt
команду:grunt copy-zips
следующие папки (
projects/foobar
) создаются в корне каталога проекта.Пример результатов A
. ├── ... └── projects └── foobar ├── file1.zip ├── file2.zip └── file3.zip
Была создана папка
foobar
по умолчанию, содержащая копию*.zip
файлов. Папка была названаfoobar
, потому что мы НЕ предоставили аргумент через командную строку. -
Далее, если мы
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"
},
...
}
-
Если мы
cd
перейдем в каталог проекта и выполним следующуюnpm
команду:npm run copy-zips
мы получаем те же результаты, что и в вышеупомянутом примере результатов раздела.
-
Далее, если мы снова перейдем в каталог проекта и выполним следующую
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