HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Python, как и любой другой язык, содержит внутри себя много готовых функций и модулей, облегчающих разработку. Все вместе они составляют<strong>стандартную библиотеку языка</strong>. Например, модули для работы с криптографией (шифрование), HTTP, файловой системой и многие другие.</p>
1 <p>Python, как и любой другой язык, содержит внутри себя много готовых функций и модулей, облегчающих разработку. Все вместе они составляют<strong>стандартную библиотеку языка</strong>. Например, модули для работы с криптографией (шифрование), HTTP, файловой системой и многие другие.</p>
2 <p>Какой бы хорошей ни была стандартная библиотека, она не может покрыть все задачи, возникающие во время разработки. Конечно, можно все недостающие компоненты реализовывать самостоятельно, но тогда разработка любого проекта превратится в бесконечный марафон. Слишком много типовых задач нужно решить в любом нетривиальном проекте.</p>
2 <p>Какой бы хорошей ни была стандартная библиотека, она не может покрыть все задачи, возникающие во время разработки. Конечно, можно все недостающие компоненты реализовывать самостоятельно, но тогда разработка любого проекта превратится в бесконечный марафон. Слишком много типовых задач нужно решить в любом нетривиальном проекте.</p>
3 <p>В коммерческих проектах используются миллионы строк стороннего кода, написанные программистами по всему миру. Подобный код хранится в библиотеках, доступных для установки в проект. В Python-мире их принято называть<strong>пакетами</strong>.</p>
3 <p>В коммерческих проектах используются миллионы строк стороннего кода, написанные программистами по всему миру. Подобный код хранится в библиотеках, доступных для установки в проект. В Python-мире их принято называть<strong>пакетами</strong>.</p>
4 <p>Какие задачи решают подобные пакеты? Совершенно разные. От небольших полезных функций для работы со строками или датами, до фреймворков, программных систем, формирующих архитектуру кода. Например, библиотека<a>more-itertools</a>по типу стандартной библиотеки<em>itertools</em>. Она предоставляет около сотни полезных функций, решающих задачи по работе с массивами, строками и другими типами данных. Пара примеров:</p>
4 <p>Какие задачи решают подобные пакеты? Совершенно разные. От небольших полезных функций для работы со строками или датами, до фреймворков, программных систем, формирующих архитектуру кода. Например, библиотека<a>more-itertools</a>по типу стандартной библиотеки<em>itertools</em>. Она предоставляет около сотни полезных функций, решающих задачи по работе с массивами, строками и другими типами данных. Пара примеров:</p>
5 <p>Каждая из этих функций по отдельности может выглядеть небольшой. Однако чем больше проект, тем больше требуется подобных функций, и все вместе они превращаются в довольно большую кодовую базу. А ведь еще хотелось бы иметь хорошую документацию.</p>
5 <p>Каждая из этих функций по отдельности может выглядеть небольшой. Однако чем больше проект, тем больше требуется подобных функций, и все вместе они превращаются в довольно большую кодовую базу. А ведь еще хотелось бы иметь хорошую документацию.</p>
6 <p>Обратите внимание на то, как происходит импорт кода. Мы указываем лишь нужные нам функции из библиотеки, чтобы не загружать ее всю. В случае объемных библиотек с сотнями функций такой подход предпочтительнее.</p>
6 <p>Обратите внимание на то, как происходит импорт кода. Мы указываем лишь нужные нам функции из библиотеки, чтобы не загружать ее всю. В случае объемных библиотек с сотнями функций такой подход предпочтительнее.</p>
7 <h2>Установка</h2>
7 <h2>Установка</h2>
8 <p>Если просто импортировать<em>more-itertools</em>в коде и затем запустить код на выполнение, то программа упадет с ошибкой: "more-itertools не найден". Для того чтобы воспользоваться сторонним пакетом, его нужно добавить в проект как<strong>зависимость</strong>. Так говорят потому, что код проекта теперь зависит от этих библиотек. Для этого в<em>uv</em>предусмотрена команда установки:</p>
8 <p>Если просто импортировать<em>more-itertools</em>в коде и затем запустить код на выполнение, то программа упадет с ошибкой: "more-itertools не найден". Для того чтобы воспользоваться сторонним пакетом, его нужно добавить в проект как<strong>зависимость</strong>. Так говорят потому, что код проекта теперь зависит от этих библиотек. Для этого в<em>uv</em>предусмотрена команда установки:</p>
9 <p>Эта команда выполняет три действия. Сначала она скачивает пакет из репозитория пакетов в директорию<em>.venv</em>в корне проекта. Если этой директории не было, то она автоматически создается. Затем она добавляет запись в<em>pyproject.toml</em>о том, что пакет<em>more-itertools</em>стал зависимостью. И наконец, создает или обновляет файл<em>uv.lock</em>.</p>
9 <p>Эта команда выполняет три действия. Сначала она скачивает пакет из репозитория пакетов в директорию<em>.venv</em>в корне проекта. Если этой директории не было, то она автоматически создается. Затем она добавляет запись в<em>pyproject.toml</em>о том, что пакет<em>more-itertools</em>стал зависимостью. И наконец, создает или обновляет файл<em>uv.lock</em>.</p>
10 <p>Зависимости в<em>pyproject.toml</em>добавляются под ключом dependencies. Здесь указаны все пакеты, используемые в проекте и не входящие в стандартную библиотеку.</p>
10 <p>Зависимости в<em>pyproject.toml</em>добавляются под ключом dependencies. Здесь указаны все пакеты, используемые в проекте и не входящие в стандартную библиотеку.</p>
11 <p>В качестве ключа в зависимостях указывается имя пакета. Именно это имя используется при импорте пакета. Значением является последняя доступная версия на момент скачивания.</p>
11 <p>В качестве ключа в зависимостях указывается имя пакета. Именно это имя используется при импорте пакета. Значением является последняя доступная версия на момент скачивания.</p>
12 <p>Также мы можем посмотреть все дерево зависимостей командой uv tree</p>
12 <p>Также мы можем посмотреть все дерево зависимостей командой uv tree</p>
13 <p>На деле устройство директории<em>.venv</em>несколько сложнее, и об этом будет позже, но главное, что это директория, в которой хранятся все скачанные пакеты для нашего проекта.</p>
13 <p>На деле устройство директории<em>.venv</em>несколько сложнее, и об этом будет позже, но главное, что это директория, в которой хранятся все скачанные пакеты для нашего проекта.</p>
14 <p>Осталось разобраться с файлом<em>uv.lock</em>. Детально о нем будет позже в курсе, а сейчас опишем его общую концепцию.</p>
14 <p>Осталось разобраться с файлом<em>uv.lock</em>. Детально о нем будет позже в курсе, а сейчас опишем его общую концепцию.</p>
15 <p>Если кратко, то у зависимостей нашего проекта есть свои зависимости, такие же сторонние библиотеки, которые разработчики использовали для написания своих библиотек. А у них, в свою очередь, свои зависимости (зависимости зависимостей называются<strong>транзитивными зависимостями</strong>). Подобная цепочка может быть довольно длинной и на разных ее участках возможно появление одних и тех же пакетов, но разных версий.<em>uv.lock</em>содержит описание<strong>всех пакетов</strong>, которые будут поставлены, включая все их зависимости с указанием конкретных версий. Это позволяет получать гарантированно одни и те же версии зависимостей для всех разработчиков проекта. Этот файл, его называют lock-файл, используется для синхронизации зависимостей.</p>
15 <p>Если кратко, то у зависимостей нашего проекта есть свои зависимости, такие же сторонние библиотеки, которые разработчики использовали для написания своих библиотек. А у них, в свою очередь, свои зависимости (зависимости зависимостей называются<strong>транзитивными зависимостями</strong>). Подобная цепочка может быть довольно длинной и на разных ее участках возможно появление одних и тех же пакетов, но разных версий.<em>uv.lock</em>содержит описание<strong>всех пакетов</strong>, которые будут поставлены, включая все их зависимости с указанием конкретных версий. Это позволяет получать гарантированно одни и те же версии зависимостей для всех разработчиков проекта. Этот файл, его называют lock-файл, используется для синхронизации зависимостей.</p>
16 <h2>Связь с GIT</h2>
16 <h2>Связь с GIT</h2>
17 <p>Программисты не так часто делают проекты "с нуля". Чаще всего они работают с готовыми проектами. Проекты же, в свою очередь, хранятся в git-репозиториях. Что нужно хранить в репозитории, а что нет, когда мы говорим о зависимостях?</p>
17 <p>Программисты не так часто делают проекты "с нуля". Чаще всего они работают с готовыми проектами. Проекты же, в свою очередь, хранятся в git-репозиториях. Что нужно хранить в репозитории, а что нет, когда мы говорим о зависимостях?</p>
18 <p>Код самих зависимостей не является частью исходного кода. Потому директорию<em>.venv</em>всегда добавляют в<em>.gitignore</em>. А вот файлы<em>pyproject.toml</em>и<em>uv.lock</em>являются важной частью исходного кода. Именно через них пакетный менеджер узнает о том, какие пакеты нужно поставить в систему.</p>
18 <p>Код самих зависимостей не является частью исходного кода. Потому директорию<em>.venv</em>всегда добавляют в<em>.gitignore</em>. А вот файлы<em>pyproject.toml</em>и<em>uv.lock</em>являются важной частью исходного кода. Именно через них пакетный менеджер узнает о том, какие пакеты нужно поставить в систему.</p>
19 <p>Представьте, что вы клонируете готовый проект с GitHub на свой компьютер и сразу пробуете запустить. Он упадет с ошибкой, так как сами зависимости еще не скачаны в<em>.venv</em>, и сама директория отсутствует. Чтобы они появились, нужно запустить команду установки зависимостей из lock-файла проекта и файла описания проекта:</p>
19 <p>Представьте, что вы клонируете готовый проект с GitHub на свой компьютер и сразу пробуете запустить. Он упадет с ошибкой, так как сами зависимости еще не скачаны в<em>.venv</em>, и сама директория отсутствует. Чтобы они появились, нужно запустить команду установки зависимостей из lock-файла проекта и файла описания проекта:</p>
20 <p>Эта команда скачивает зависимости в директорию<em>.venv</em>, базируясь на содержимом<em>pyproject.toml</em>и версиях из<em>uv.lock</em>.</p>
20 <p>Эта команда скачивает зависимости в директорию<em>.venv</em>, базируясь на содержимом<em>pyproject.toml</em>и версиях из<em>uv.lock</em>.</p>
21 <h2>Обновление и удаление зависимостей</h2>
21 <h2>Обновление и удаление зависимостей</h2>
22 <p>Помимо добавления зависимостей uv позволяет также обновлять текущие, указанные в<em>pyproject.toml</em></p>
22 <p>Помимо добавления зависимостей uv позволяет также обновлять текущие, указанные в<em>pyproject.toml</em></p>
23 <p>Эта команда удалит устаревшие зависимости, скачает новые и пересоздаст lock-файл.</p>
23 <p>Эта команда удалит устаревшие зависимости, скачает новые и пересоздаст lock-файл.</p>
24 <p>Теперь попробуем удалить ненужную нам зависимость из проекта.</p>
24 <p>Теперь попробуем удалить ненужную нам зависимость из проекта.</p>
25 <p>Команда удалит зависимость и обновит lock-файл после.</p>
25 <p>Команда удалит зависимость и обновит lock-файл после.</p>