Как получить имя задачи grunt, указанное в командной строке?
Чтобы настроить мои задачи grunt, мне нужно получить доступ к имени задачи grunt, указанному в командной строке при запуске grunt.
Параметры не являются проблемой, поскольку ее хорошо документированы (grunt.options).
Он также хорошо документировал, как определить имя задачи при выполнении задачи grunt.
Но мне нужен доступ к имени задачи раньше.
Например, пользователь пишет
grunt build --target=client
При настройке задания grunt в моем Gruntfile.js
, я могу использовать
grunt.option('target')
, чтобы получить 'client'
.
Но как мне получить параметр build
до начала сборки задачи?
Любое руководство очень ценится!
Ответы
Ответ 1
Ваш файл grunt - это просто функция. Попробуйте добавить эту строку вверху:
module.exports = function( grunt ) {
/*==> */ console.log(grunt.option('target'));
/*==> */ console.log(grunt.cli.tasks);
// Add your pre task code here...
Запуск с grunt build --target=client
должен дать вам результат:
client
[ 'build' ]
В этот момент вы можете запустить любой код, который вам нужен, до запуска вашей задачи, включая установку значений с новыми зависимостями.
Ответ 2
Лучше всего использовать grunt.task.current
, который имеет информацию о текущей выполняемой задаче, включая свойство name
. В рамках задачи контекст (т.е. this
) является одним и тем же объектом. Так.,
grunt.registerTask('foo', 'Foobar all the things', function() {
console.log(grunt.task.current.name); // foo
console.log(this.name); // foo
console.log(this === grunt.task.current); // true
});
Если build
является псевдонимом для других задач, и вы просто хотите знать, какая команда была введена, что привело к выполнению текущей задачи, я обычно использую process.argv[2]
. Если вы просмотрите process.argv
, вы увидите, что argv[0]
- node
(потому что grunt
- это процесс node
), argv[1]
- grunt
, а argv[2]
- это настоящая задача ворчания ( за которыми следуют любые параметры в оставшейся части argv
).
EDIT:
Пример вывода из console.log(grunt.task.current)
на [email protected] из задачи (не может иметь текущую задачу из текущей задачи).
{
nameArgs: 'server:dev',
name: 'server',
args: [],
flags: {},
async: [Function],
errorCount: [Getter],
requires: [Function],
requiresConfig: [Function],
options: [Function],
target: 'dev',
data: { options: { debugPort: 5858, cwd: 'server' } },
files: [],
filesSrc: [Getter]
}
Ответ 3
Вы можете использовать grunt.util.hooker.hook
для этого.
Пример (часть Gruntfile.coffee):
grunt.util.hooker.hook grunt.task, (opt) ->
if grunt.task.current and grunt.task.current.nameArgs
console.log "Task to run: " + grunt.task.current.nameArgs
CMD
C:\some_dir>grunt concat --cmp my_cmp
Task to run: concat
Running "concat:coffee" (concat) task
Task to run: concat:coffee
File "core.coffee" created.
Done, without errors.
Существует также хак, который я использовал для предотвращения выполнения определенной задачи:
grunt.util.hooker.hook grunt.task, (opt) ->
if grunt.task.current and grunt.task.current.nameArgs
console.log "Task to run: " + grunt.task.current.nameArgs
if grunt.task.current.nameArgs is "<some task you don't want user to run>"
console.log "Ooooh, not <doing smth> today :("
exit() # Not valid. Don't know how to exit :), but will stop grunt anyway
CMD, если разрешено:
C:\some_dir>grunt concat:coffee --cmp my_cmp
Running "concat:coffee" (concat) task
Task to run: concat:coffee
File "core.coffee" created.
Done, without errors.
CMD при предотвращении:
C:\some_dir>grunt concat:coffee --cmp my_cmp
Running "concat:coffee" (concat) task
Task to run: concat:coffee
Ooooh, not concating today :(
Warning: exit is not defined Use --force to continue.
Aborted due to warnings.