Установка пакетов
Пакеты можно добавить в шаблон заранее или установить после запуска песочницы. В обоих случаях закрепляйте версии, чтобы окружение воспроизводилось.
Добавить пакеты в шаблон
Этот способ подходит, если зависимости нужны каждой песочнице. SDK предоставляет отдельные методы pipInstall, npmInstall, bunInstall и aptInstall. Сборка ниже добавляет Python- и Node.js-пакеты, а затем запускает песочницу из нового шаблона.
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 позволяет задать его без изменения программы.
Установить пакет во время работы
Этот способ удобен для разовой зависимости. Пакет сохранится только в текущей песочнице и не появится в следующих запусках базового шаблона.
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. Его наличие зависит от выбранного шаблона.