Перейти к содержимому

Установка пакетов

Пакеты можно добавить в шаблон заранее или установить после запуска песочницы. В обоих случаях закрепляйте версии, чтобы окружение воспроизводилось.

Добавить пакеты в шаблон

Этот способ подходит, если зависимости нужны каждой песочнице. SDK предоставляет отдельные методы pipInstall, npmInstall, bunInstall и aptInstall. Сборка ниже добавляет Python- и Node.js-пакеты, а затем запускает песочницу из нового шаблона.

mjs
import { Sandbox, Template } from "@abox-dev/sdk";

const templateName = process.env.TEMPLATE_NAME ?? "custom-packages";
const template = Template()
  .fromTemplate("base")
  .pipInstall("cowsay==6.1")
  .npmInstall("lodash@4.17.21");

await Template.build(template, templateName);

const sandbox = await Sandbox.create(templateName);

try {
  const result = await sandbox.commands.run(
    "python3 -c 'import cowsay; print(cowsay.__version__)' && " +
      "node -e 'console.log(require(\"lodash/package.json\").version)'",
  );
  console.log(result.stdout);
} finally {
  await sandbox.kill();
}

Имя шаблона должно быть уникальным в проекте. Переменная TEMPLATE_NAME позволяет задать его без изменения программы.

Установить пакет во время работы

Этот способ удобен для разовой зависимости. Пакет сохранится только в текущей песочнице и не появится в следующих запусках базового шаблона.

mjs
import { Sandbox } from "@abox-dev/sdk";

const sandbox = await Sandbox.create();

try {
  const result = await sandbox.commands.run(
    "python3 -m pip install --disable-pip-version-check --no-cache-dir 'cowsay==6.1' >/dev/null && " +
      "python3 -c 'import cowsay; print(cowsay.__version__)'",
    { timeoutMs: 120_000 },
  );
  console.log(result.stdout.trim());
} finally {
  await sandbox.kill();
}

Нативные методы установки относятся к сборке шаблона. В работающей песочнице используйте доступный package manager через commands.run. Его наличие зависит от выбранного шаблона.