1. Введение
Представляем вам документацию по Pkg, диспетчеру пакетов Julia. В документации рассматривается множество вопросов, например управление установками пакетов, разработка пакетов, работа с реестрами пакетов и многое другое.
Во всем руководстве в примерах используется интерфейс REPL для Pkg, режим REPL для Pkg. Существует также функциональный API, который рекомендуется использовать при работе в неинтерактивном режиме. Сведения об этом API приведены в разделе Справка по API.
История вопроса и дизайн
В отличие от традиционных диспетчеров пакетов, которые устанавливают единый глобальный набор пакетов и управляют им, Pkg разработан на основе «сред» — независимых наборов пакетов, которые могут быть локальными для отдельного проекта или общими и выбираться по имени. Точный набор пакетов и версий в среде зафиксирован в файле манифеста, который можно добавить в репозиторий проекта и отслеживать в системе управления версиями, что значительно повышает воспроизводимость проектов. Если вы когда-нибудь пытались запустить код, который давно не использовали, чтобы обнаружить, что ничего не работает, потому что вы обновили или удалили некоторые пакеты, которые использовались в проекте, вы поймете мотивацию такого подхода. В Pkg каждый проект поддерживает свой собственный независимый набор версий пакетов, поэтому вы никогда больше не столкнетесь с этой проблемой. Более того, если вы проверяете проект в новой системе, вы можете просто материализовать среду, описанную в файле манифеста, и сразу же приступить к работе с заведомо работоспособным набором зависимостей.
Поскольку обновление сред и управление ими выполняется независимо друг от друга, «ад зависимостей» в Pkg практически сведен на нет. Если вы хотите использовать последнюю и самую лучшую версию какого-то пакета в новом проекте, но застряли на старой версии в другом проекте, это не проблема: поскольку у проектов разные среды, они могут просто использовать разные версии, которые одновременно установлены в разных местах вашей системы. Расположение каждой версии пакета является каноническим, поэтому, когда среды используют одни и те же версии пакетов, они могут совместно пользоваться установками, что позволяет избежать ненужного дублирования пакетов. Диспетчер пакетов периодически «собирает в мусор» старые версии пакетов, которые больше не применяются ни в одной среде.
Подход Pkg к локальным средам может быть знаком тем, кто использовал virtualenv
в Python или bundler
в Ruby. В Julia не требуется оптимизировать механизмы загрузки кода языка для поддержки сред, так как Julia изначально понимает их. Кроме того, среды Julia являются «стекируемыми»: можно наложить одну среду на другую и таким образом получить доступ к дополнительным пакетам, не входящим в основную среду. Это позволяет легко работать над проектом, который является основной средой, и при этом получать доступ из REPL ко всем обычным инструментам разработки, таким как профилировщики, отладчики и т. д., просто имея среду, содержащую эти инструменты разработки, позже на пути загрузки.
И последнее, но не менее важное: Pkg разработан для поддержки федеративных реестров пакетов. Это означает, что он позволяет беспрепятственно взаимодействовать нескольким реестрам, управляемым разными сторонами. В частности, речь идет о частных реестрах, которые могут находиться за корпоративными брандмауэрами. Вы можете устанавливать и обновлять собственные пакеты из частного реестра с помощью точно таких же инструментов и рабочих процессов, которые используете для установки официальных пакетов Julia и управления ими. Если срочно нужно применить исправление для общедоступного пакета, критически важного для продукта вашей компании, вы можете пометить его частную версию во внутреннем реестре компании и быстро и легко предоставить исправление разработчикам и командам по операциям, не дожидаясь принятия и публикации исправления вышестоящего исправления. Однако после публикации официального исправления вы можете просто обновить свои зависимости и затем снова вернуться к официальному выпуску.