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 $?

Сводные таблицы

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

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

echo Hello | deno run main.ts

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

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);'

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

Перенаправления предоставляют способ перенаправить стандартный вывод и/или стандартную ошибку в файл.

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

deno run main.ts > file.txt

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

deno run main.ts 2> file.txt

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

deno run main.ts &> file.txt

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

deno run main.ts >> file.txt

Возможна подавление стандартного вывода, стандартной ошибки или обоих стандартного вывода и стандартной ошибки команды, перенаправляя их в /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

Или перенаправьте стандартный вывод в стандартную ошибку и наоборот:

# 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

Spec-Zone.ru

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