Spec-Zone.ru › Deno 2

deno task

Использование в командной строке

deno task [OPTIONS] [TASK]

Выполнить задачу, определенную в файле конфигурации.

deno task build

Вывести список всех доступных задач:

deno task

Оценить задачу из строки

deno task --eval "echo $(pwd)"

Параметры

--config

Короткая опция: -c

Настройка различных аспектов deno, включая TypeScript, проверки кода и форматирования. Обычно файл конфигурации называется deno.json или deno.jsonc и обнаруживается автоматически; в этом случае этот флаг не нужен.

--cwd

Указывает директорию для выполнения задачи.

--eval

Оценить переданное значение как задачу в файле конфигурации.

--filter

Короткая опция: -f

Фильтрация членов рабочей области по имени — следует использовать с --recursive.

--recursive

Короткая опция: -r

Выполнить задачу во всех проектах в рабочей области.

Параметры управления зависимостями

--node-modules-dir

Устанавливает режим управления модулями node_modules для пакетов npm.

Описание

deno task предоставляет кроссплатформенный способ определения и выполнения пользовательских команд, специфичных для определённой кодовой базы.

Для начала определите свои команды в файле конфигурации Deno в вашей кодовой базе файле конфигурации Deno под ключом "tasks".

Например:

{
  "tasks": {
    "data": "deno task collect && deno task analyze",
    "collect": "deno run --allow-read=. --allow-write=. scripts/collect.js",
    "analyze": {
      "description": "Run analysis script",
      "command": "deno run --allow-read=. scripts/analyze.js"
    }
  }
}

Указание текущей рабочей директории

По умолчанию, deno task выполняет команды с директорией файла конфигурации Deno (например, deno.json) в качестве текущей рабочей директории. Это позволяет задачам использовать относительные пути и продолжать работать независимо от того, откуда в дереве каталогов вы запустили задачу deno. В некоторых случаях это может быть нежелательно, и данное поведение можно переопределить с помощью переменной среды INIT_CWD.

INIT_CWD будет установлено с полным путем к директории, в которой была запущена задача, если она ещё не установлена. Это соответствует тому же поведению, что и npm run.

Например, следующая задача изменит текущую рабочую директорию задачи на ту, из которой пользователь запустил задачу, а затем выведет текущую рабочую директорию, которая теперь является этой директорией (помните, что это работает и в Windows, так как deno task кроссплатформенный).

{
  "tasks": {
    "my_task": "cd $INIT_CWD && pwd"
  }
}

Получение директории, из которой запущена задача deno task

Поскольку задачи выполняются с директорией файла конфигурации Deno в качестве текущей рабочей директории, может быть полезно знать директорию, из которой была запущена deno task задача. Это возможно, используя переменную среды INIT_CWD в задаче или скрипте, запущенном из deno task (работает так же, как и в npm run, но кроссплатформенно).

Например, чтобы передать эту директорию скрипту в задаче, сделайте следующее (обратите внимание, что директория заключена в двойные кавычки, чтобы сохранить её как один аргумент, если она содержит пробелы):

{
  "tasks": {
    "start": "deno run main.ts \"$INIT_CWD\""
  }
}

Зависимости задач

Вы можете указать зависимости для задачи:

deno.json
{
  "tasks": {
    "build": "deno run -RW build.ts",
    "generate": "deno run -RW generate.ts",
    "serve": {
      "command": "deno run -RN server.ts",
      "dependencies": ["build", "generate"]
    }
  }
}

В приведенном выше примере запуск deno task serve сначала выполнит задачи build и generate параллельно, и как только обе завершатся успешно, будет выполнена задача serve.

$ deno task serve
Task build deno run -RW build.ts
Task generate deno run -RW generate.ts
Generating data...
Starting the build...
Build finished
Data generated
Task serve deno run -RN server.ts
Listening on http://localhost:8000/

Зависимые задачи выполняются параллельно, при этом предельное значение для параллельности по умолчанию равно количеству ядер вашего компьютера. Чтобы изменить это ограничение, используйте переменную среды DENO_JOBS.

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

deno.json
{
  //   a
  //  / \
  // b   c
  //  \ /
  //   d
  "tasks": {
    "a": {
      "command": "deno run a.js",
      "dependencies": ["b", "c"]
    },
    "b": {
      "command": "deno run b.js",
      "dependencies": ["d"]
    },
    "c": {
      "command": "deno run c.js",
      "dependencies": ["d"]
    },
    "d": "deno run d.js"
  }
}
$ deno task a
Task d deno run d.js
Running d
Task c deno run c.js
Running c
Task b deno run b.js
Running b
Task a deno run a.js
Running a

Если обнаружен цикл зависимостей, будет возвращена ошибка:

deno.json
{
  "tasks": {
    "a": {
      "command": "deno run a.js",
      "dependencies": ["b"]
    },
    "b": {
      "command": "deno run b.js",
      "dependencies": ["a"]
    }
  }
}
$ deno task a
Task cycle detected: a -> b -> a

Поддержка рабочих пространств

deno task можно использовать в рабочих пространствах для одновременного выполнения задач из нескольких директорий-членов. Для выполнения задач dev из всех членов рабочего пространства используйте флаг --recursive.

deno.json
{
  "workspace": [
    "client",
    "server"
  ]
}
client/deno.json
{
  "tasks": {
    "dev": "deno run -RN build.ts"
  }
}
server/deno.json
{
  "tasks": {
    "dev": "deno run -RN server.ts"
  }
}
$ deno task --recursive dev
Task dev deno run -RN build.ts
Task dev deno run -RN server.ts
Bundling project...
Listening on http://localhost:8000/
Project bundled

Задачи для выполнения могут быть отфильтрованы по членам рабочего пространства:

$ deno task --filter "client/*" dev
Task dev deno run -RN build.ts
Bundling project...
Project bundled

Синтаксис

deno task использует кроссплатформенную оболочку, являющуюся подмножеством sh/bash для выполнения определенных задач.

Списки булевых значений

Списки булевых значений предоставляют способ выполнения дополнительных команд на основе кода возврата исходной команды. Они разделяют команды с помощью операторов && и ||.

Оператор && предоставляет способ выполнения команды, и если она успешна (имеет код возврата 0), он выполнит следующую команду:

deno run --allow-read=. --allow-write=. collect.ts && deno run --allow-read=. analyze.ts

Оператор || - противоположный. Он предоставляет способ выполнения команды, и только если она не удалась (имеет ненулевой код возврата), он выполнит следующую команду:

deno run --allow-read=. --allow-write=. collect.ts || deno run play_sad_music.ts

Последовательные списки

Последовательные списки похожи на списки булевых значений, но выполняются независимо от того, прошла ли предыдущая команда или нет. Команды разделяются точкой с запятой (;).

deno run output_data.ts ; deno run --allow-net server.ts

Асинхронные команды

Асинхронные команды позволяют выполнить команду асинхронно. Это может быть полезно при запуске нескольких процессов. Чтобы сделать команду асинхронной, добавьте & в конец. Например, следующее выполнит sleep 1 && deno run --allow-net client.ts и deno run --allow-net server.ts одновременно:

sleep 1 && deno run --allow-net client.ts & deno run --allow-net server.ts

В отличие от большинства оболочек, первая асинхронная команда, которая завершится неудачно, заставит все остальные команды завершиться немедленно. В приведённом выше примере это означает, что если команда клиента завершится неудачно, команда сервера также завершится неудачно и выйдет. Вы можете отказаться от этого поведения, добавив || true в конец команды, что принудительно задаст код выхода 0. Например:

deno run --allow-net client.ts || true & deno run --allow-net server.ts || true

Переменные окружения

Переменные окружения определяются следующим образом:

export VAR_NAME=value

Вот пример использования одной из них в задаче с заменой переменных оболочки, а затем с её экспортом в качестве части окружения порождённого процесса Deno (обратите внимание, что в файле конфигурации JSON двойные кавычки нужно экранировать обратными слешами):

export VAR=hello && echo $VAR && deno eval "console.log('Deno: ' + Deno.env.get('VAR'))"

Выведет:

hello
Deno: hello

Установление переменных окружения для команды

Чтобы указать переменную(ые) окружения перед командой, перечислите их следующим образом:

VAR=hello VAR2=bye deno run main.ts

Это будет использовать эти переменные окружения конкретно для следующей команды.

Переменные оболочки

Переменные оболочки аналогичны переменным окружения, но не будут экспортированы в дочерние команды. Они определяются с помощью следующего синтаксиса:

VAR_NAME=value

Если мы используем переменную оболочки вместо переменной окружения в примере, подобном тому, что показан в предыдущем разделе «Переменные окружения»:

VAR=hello && echo $VAR && deno eval "console.log('Deno: ' + Deno.env.get('VAR'))"

Мы получим следующий вывод:

hello
Deno: undefined

Переменные оболочки могут быть полезны, когда нам нужно повторно использовать значение, но не нужно, чтобы оно было доступно в каких-либо порождённых процессах.

Переменная кода возврата

Код возврата ранее выполненной команды доступен в переменной $?.

# outputs 10
deno eval 'Deno.exit(10)' || echo $?

Конвейеры

Конвейеры предоставляют способ перенаправить вывод одной команды в другую.

Следующая команда перенаправляет вывод stdout «Hello» в стандартный ввод порожденного процесса Deno:

echo Hello | deno run main.ts

Чтобы перенаправить stdout и stderr, используйте |& вместо этого:

deno eval 'console.log(1); console.error(2);' |& deno run main.ts

Подстановка команд

Синтаксис $(command) предоставляет способ использовать вывод одной команды в других выполняемых командах.

Например, чтобы передать вывод получения последней ревизии git другой команде, можно сделать следующее:

deno run main.ts $(git rev-parse HEAD)

Ещё один пример с использованием переменной оболочки:

REV=$(git rev-parse HEAD) && deno run main.ts $REV && echo $REV

Отрицание кода возврата

Чтобы отрицать код возврата, добавьте знак восклицания и пробел перед командой:

# change the exit code from 1 to 0
! deno eval 'Deno.exit(1);'

Перенаправления

Перенаправления предоставляют способ перенаправить stdout и/или stderr в файл.

Например, следующее перенаправляет stdout команды deno run main.ts в файл под названием file.txt в файловой системе:

deno run main.ts > file.txt

Чтобы вместо этого перенаправить stderr, используйте 2>:

deno run main.ts 2> file.txt

Чтобы перенаправить как stdout, так и stderr, используйте &>:

deno run main.ts &> file.txt

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

deno run main.ts >> file.txt

Возможна подавление stdout, stderr или обоих выходов команды путём перенаправления в /dev/null. Это работает кроссплатформенно, включая Windows.

# suppress stdout
deno run main.ts > /dev/null
# suppress stderr
deno run main.ts 2> /dev/null
# suppress both stdout and stderr
deno run main.ts &> /dev/null

Или перенаправление stdout в stderr и наоборот:

# redirect stdout to stderr
deno run main.ts >&2
# redirect stderr to stdout
deno run main.ts 2>&1

Также поддерживаются перенаправления ввода:

# redirect file.txt to the stdin of gzip
gzip < file.txt

Обратите внимание, что перенаправление нескольких перенаправлений в настоящее время не поддерживается.

Кроссплатформенный shebang

Начиная с Deno 1.42, deno task будет выполнять скрипты, начинающиеся с #!/usr/bin/env -S, одинаково на всех платформах.

Например:

script.ts
#!/usr/bin/env -S deno run
console.log("Hello there!");
deno.json
{
  "tasks": {
    "hi": "./script.ts"
  }
}

Затем на машине под управлением Windows:

> pwd
C:\Users\david\dev\my_project
> deno task hi
Hello there!

Расширение шаблонов

Расширение шаблонов поддерживается в Deno 1.34 и выше. Это позволяет указывать шаблоны для соответствия файлам кроссплатформенно.

# match .ts files in the current and descendant directories
echo **/*.ts
# match .ts files in the current directory
echo *.ts
# match files that start with "data", have a single number, then end with .csv
echo data[0-9].csv

Поддерживаемые символы шаблонов *, ?, и [/].

Встроенные команды

deno task поставляется с несколькими встроенными командами, которые работают одинаково в Windows, Mac и Linux.

  • cp - Копирует файлы.
  • mv - Перемещает файлы.
  • rm - Удаляет файлы или каталоги.
    • Прим.: rm -rf [FILE]... - Часто используется для рекурсивного удаления файлов или каталогов.
  • mkdir - Создаёт каталоги.
    • Прим.: mkdir -p DIRECTORY... - Часто используется для создания каталога и всех его родительских каталогов, даже если они уже существуют.
  • pwd - Выводит имя текущего/рабочего каталога.
  • sleep - Задерживает выполнение на заданное время.
    • Прим.: sleep 1 для задержки на 1 секунду, sleep 0.5 для задержки на полсекунды или sleep 1m для задержки на минуту
  • echo - Выводит строку текста.
  • cat - Объединяет файлы и выводит их в стандартный вывод. Если аргументов нет, то считывает и выводит стандартный ввод.
  • exit - Заставляет оболочку завершиться.
  • head - Выводит начальную часть файла.
  • unset - Снимает настройки переменных среды.
  • xargs - Строит аргументы из стандартного ввода и выполняет команду.

Если вы обнаружите полезный флаг, отсутствующий в команде, или у вас есть предложения по дополнительным командам, которые должны быть поддерживаемыми по умолчанию, откройте, пожалуйста, запрос на создание проблемы на репозитории deno_task_shell.

Обратите внимание, что если вы хотите выполнить любую из этих команд в режиме несовместимом с несколькими платформами на Mac или Linux, то вы можете сделать это, запустив её через sh: sh -c <command> (например, sh -c cp source destination).

Поддержка package.json

deno task обращается к чтению из "scripts" записей в файле package.json, если он обнаружен. Обратите внимание, что Deno не учитывает или не поддерживает события жизненного цикла npm, такие как preinstall или postinstall—вы должны явно запускать записи скриптов, которые хотите выполнить (например, deno install --entrypoint main.ts && deno task postinstall).

© 2018–2024 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/reference/cli/task_runner

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API